From 2f76763ce52be34cfe6e14f6246b1824e851d297 Mon Sep 17 00:00:00 2001 From: Felipe de Almeida Date: Fri, 9 Oct 2020 19:28:40 -0300 Subject: [PATCH 01/10] bug fixed - mediaJSON with global var --- CastVideos.js | 52 +- dist/bundles/thinkam.net-ng-cast.umd.js | 3678 +++++++++-------- dist/bundles/thinkam.net-ng-cast.umd.js.map | 2 +- dist/bundles/thinkam.net-ng-cast.umd.min.js | 16 +- .../thinkam.net-ng-cast.umd.min.js.map | 2 +- dist/esm2015/index.js | 6 +- dist/esm2015/ng-cast.component.js | 4 +- dist/esm2015/ng.cast.module.js | 2 +- dist/esm2015/shared/ng-cast.service.js | 8 +- dist/fesm2015/thinkam.net-ng-cast.js | 282 +- dist/fesm2015/thinkam.net-ng-cast.js.map | 2 +- dist/index.d.ts | 2 +- dist/package.json | 2 +- dist/shared/ng-cast.service.d.ts | 3 + dist/thinkam.net-ng-cast.metadata.json | 2 +- index.ts | 6 +- ng-cast.component.ts | 2 +- ng.cast.module.ts | 1 + package.json | 2 +- shared/ng-cast.service.ts | 13 +- tsconfig.json | 4 +- 21 files changed, 2070 insertions(+), 2021 deletions(-) diff --git a/CastVideos.js b/CastVideos.js index 924e79c..53cc783 100755 --- a/CastVideos.js +++ b/CastVideos.js @@ -1,9 +1,5 @@ 'use strict'; -var mediaJSON = { - 'categories': [] -}; - /** Cleaner UI for demo purposes. */ const DEMO_MODE = false; @@ -142,6 +138,10 @@ var CastPlayer = function () { this.setupLocalPlayer(); this.addVideoThumbs(); this.initializeUI(); + + this.mediaJSON = { + 'categories': [] + }; }; CastPlayer.prototype.initializeCastPlayer = function () { @@ -357,8 +357,9 @@ CastPlayer.prototype.setupLocalPlayer = function () { document.getElementById('skip').style.display = 'none'; var localPlayer = document.getElementById('video_element'); - localPlayer.addEventListener( - 'loadeddata', this.onMediaLoadedLocally.bind(this)); + if (typeof localPlayer !== 'undefined' && localPlayer) + localPlayer.addEventListener( + 'loadeddata', this.onMediaLoadedLocally.bind(this)); // This object will implement PlayerHandler callbacks with localPlayer var playerTarget = {}; @@ -434,11 +435,16 @@ CastPlayer.prototype.setupLocalPlayer = function () { }.bind(this); playerTarget.setVolume = function (volumeSliderPosition) { - localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ? - volumeSliderPosition / FULL_VOLUME_HEIGHT : 1; + if (localPlayer) { + localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ? + volumeSliderPosition / FULL_VOLUME_HEIGHT : 1; + } + var p = document.getElementById('audio_bg_level'); - p.style.height = volumeSliderPosition + 'px'; - p.style.marginTop = -volumeSliderPosition + 'px'; + if (typeof p !== 'undefined' && p) { + p.style.height = volumeSliderPosition + 'px'; + p.style.marginTop = -volumeSliderPosition + 'px'; + } }; playerTarget.mute = function () { @@ -450,7 +456,8 @@ CastPlayer.prototype.setupLocalPlayer = function () { }; playerTarget.isMuted = function () { - return localPlayer.muted; + if (localPlayer) + return localPlayer.muted; }; playerTarget.seekTo = function (time) { @@ -1464,7 +1471,7 @@ CastPlayer.prototype.showMediaControl = function () { * Hide the media control */ CastPlayer.prototype.hideMediaControl = function () { - if (cast && cast.framework && cast.framework.CastContext) { + if (typeof cast !== 'undefined') { let context = cast.framework.CastContext.getInstance(); if (context && context.getCurrentSession()) { // Do not hide controls during an active cast session. @@ -1550,10 +1557,15 @@ CastPlayer.prototype.initializeUI = function () { 'mouseout', this.hideVolumeSlider.bind(this)); document.getElementById('audio_on').addEventListener( 'mouseout', this.hideVolumeSlider.bind(this)); - document.getElementById('main_video').addEventListener( - 'mouseover', this.showMediaControl.bind(this)); - document.getElementById('main_video').addEventListener( - 'mouseout', this.hideMediaControl.bind(this)); + + let main_video = document.getElementById('main_video'); + if (typeof main_video !== 'undefined' && main_video) { + main_video.addEventListener( + 'mouseover', this.showMediaControl.bind(this)); + main_video.addEventListener( + 'mouseout', this.hideMediaControl.bind(this)); + } + document.getElementById('media_control').addEventListener( 'mouseover', this.showMediaControl.bind(this)); document.getElementById('media_control').addEventListener( @@ -1614,8 +1626,8 @@ CastPlayer.prototype.initializeUI = function () { * Add video thumbnails div's to UI for media JSON contents */ CastPlayer.prototype.addVideoThumbs = function () { - if (mediaJSON && mediaJSON['categories'] && mediaJSON['categories'].length > 0) { - this.mediaContents = mediaJSON['categories'][0]['videos']; + if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) { + this.mediaContents = this.mediaJSON['categories'][0]['videos']; var ni = document.getElementById('carousel'); var newdiv = null; var divIdName = null; @@ -1669,9 +1681,11 @@ CastPlayer.getErrorMessage = function (error) { } }; -let castPlayer = new CastPlayer(); +var castPlayer = new CastPlayer(); window['__onGCastApiAvailable'] = function (isAvailable) { if (isAvailable) { castPlayer.initializeCastPlayer(); } }; + +window.CastPlayer = castPlayer; diff --git a/dist/bundles/thinkam.net-ng-cast.umd.js b/dist/bundles/thinkam.net-ng-cast.umd.js index fdabf6c..d2d6b1a 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.js +++ b/dist/bundles/thinkam.net-ng-cast.umd.js @@ -1,1845 +1,1861 @@ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('rxjs')) : - typeof define === 'function' && define.amd ? define('@thinkam.net/ng-cast', ['exports', '@angular/core', '@angular/common', 'rxjs'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.thinkam = global.thinkam || {}, global.thinkam.net = global.thinkam.net || {}, global.thinkam.net['ng-cast'] = {}), global.ng.core, global.ng.common, global.rxjs)); + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('rxjs')) : + typeof define === 'function' && define.amd ? define('@thinkam.net/ng-cast', ['exports', '@angular/core', '@angular/common', 'rxjs'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.thinkam = global.thinkam || {}, global.thinkam.net = global.thinkam.net || {}, global.thinkam.net['ng-cast'] = {}), global.ng.core, global.ng.common, global.rxjs)); }(this, (function (exports, core, common, rxjs) { 'use strict'; - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. + 'use strict'; + /** Cleaner UI for demo purposes. */ + var DEMO_MODE = false; + /** @const {string} Media source root URL */ + var MEDIA_SOURCE_ROOT = 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/'; + /** + * Controls if Ads are enabled. Controlled by radio button. + * @type {boolean} + */ + var ENABLE_ADS = false; + /** + * Controls if Live stream is played. Controlled by radio button. + * @type {boolean} + */ + var ENABLE_LIVE = false; + /** + * Buffer to decide if the live indicator should be displayed to show that + * playback is at the playback head. + * @const {number} + */ + var LIVE_INDICATOR_BUFFER = 50; + /** + * Width of progress bar in pixels. + * @const {number} + */ + var PROGRESS_BAR_WIDTH = 700; + /** + * Time in milliseconds for minimal progress update. + * @const {number} + */ + var TIMER_STEP = 1000; + /** + * Cast volume upon initial connection. + * @const {number} + */ + var DEFAULT_VOLUME = 0.5; + /** + * Height, in pixels, of volume bar. + * @const {number} + */ + var FULL_VOLUME_HEIGHT = 100; + /** @enum {string} Constants of states for media for both local and remote playback */ + var PLAYER_STATE = { + // No media is loaded into the player. For remote playback, maps to + // the PlayerState.IDLE state. + IDLE: 'IDLE', + // Player is in PLAY mode but not actively playing content. For remote + // playback, maps to the PlayerState.BUFFERING state. + BUFFERING: 'BUFFERING', + // The media is loaded but not playing. + LOADED: 'LOADED', + // The media is playing. For remote playback, maps to the PlayerState.PLAYING state. + PLAYING: 'PLAYING', + // The media is paused. For remote playback, maps to the PlayerState.PAUSED state. + PAUSED: 'PAUSED' + }; + /** + * Cast player object + * Main variables: + * - PlayerHandler object for handling media playback + * - Cast player variables for controlling Cast mode media playback + * - Current media variables for transition between Cast and local modes + * - Current ad variables for controlling UI based on ad playback + * - Current live variables for controlling UI based on ad playback + * @struct @constructor + */ + var CastPlayer = function () { + /** @type {PlayerHandler} Delegation proxy for media playback */ + this.playerHandler = new PlayerHandler(this); + /** @type {PLAYER_STATE} A state for media playback */ + this.playerState = PLAYER_STATE.IDLE; + /** + * @type {PLAYER_STATE} Player state before switching between local and + * remote playback. + */ + this.playerStateBeforeSwitch = null; + /* Cast player variables */ + /** @type {cast.framework.RemotePlayer} */ + this.remotePlayer = null; + /** @type {cast.framework.RemotePlayerController} */ + this.remotePlayerController = null; + /* Local+Remote player variables */ + /** @type {number} A number for current time in seconds. Maintained in media time. */ + this.currentMediaTime = 0; + /** + * @type {?number} A number for current duration in seconds. Maintained in media time. + * Null if duration should not be shown. + */ + this.mediaDuration = -1; + /** @type {?number} A timer for tracking progress of media */ + this.timer = null; + /** @type {function()} Listener for handling current time increments */ + this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this); + /** @type {function()} Listener to be added/removed for the seek action */ + this.seekMediaListener = this.seekMedia.bind(this); + /* Local player variables */ + /** @type {number} A number for current media index */ + this.currentMediaIndex = 0; + /** @type {?Object} media contents from JSON */ + this.mediaContents = null; + /** @type {boolean} Fullscreen mode on/off */ + this.fullscreen = false; + /* Remote Player variables */ + /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */ + this.mediaInfo = null; + /* Ad variables */ + /** + * @type {?number} The time in seconds when the break clip becomes skippable. + * 5 means that the end user can skip this break clip after 5 seconds. If + * negative or not defined, it means that the current break clip is not skippable. + */ + this.whenSkippable = null; + /* Live variables */ + /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */ + this.liveSeekableRange = null; + /** @type {boolean} Remote player is playing live content. */ + this.isLiveContent = false; + this.setupLocalPlayer(); + this.addVideoThumbs(); + this.initializeUI(); + this.mediaJSON = { + 'categories': [] + }; + }; + CastPlayer.prototype.initializeCastPlayer = function () { + var options = {}; + // Set the receiver application ID to your own (created in the + // Google Cast Developer Console), or optionally + // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID + options.receiverApplicationId = 'C0868879'; + // Auto join policy can be one of the following three: + // ORIGIN_SCOPED - Auto connect from same appId and page origin + // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab + // PAGE_SCOPED - No auto connect + options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED; + cast.framework.CastContext.getInstance().setOptions(options); + this.remotePlayer = new cast.framework.RemotePlayer(); + this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, function (e) { + this.switchPlayer(e.value); + }.bind(this)); + }; + /** + * Switch between the remote and local players. + */ + CastPlayer.prototype.switchPlayer = function () { + this.playerStateBeforeSwitch = this.playerState; + this.stopProgressTimer(); + this.resetVolumeSlider(); + // Session is active + if (cast && cast.framework && this.remotePlayer.isConnected) { + // Pause local playback + this.playerHandler.pause(); + this.setupRemotePlayer(); + } + else { + this.setupLocalPlayer(); + } + }; + /** + * PlayerHandler + * + * This is a handler through which the application will interact + * with both the RemotePlayer and LocalPlayer. Combining these two into + * one interface is one approach to the dual-player nature of a Cast + * Chrome application. Otherwise, the state of the RemotePlayer can be + * queried at any time to decide whether to interact with the local + * or remote players. + * + * To set the player used, implement the following methods for a target object + * and call setTarget(target). + * + * Methods to implement: + * - play() + * - pause() + * - stop() + * - seekTo(time) + * - load(mediaIndex) + * - isMediaLoaded(mediaIndex) + * - prepareToPlay() + * - getMediaDuration() + * - getCurrentMediaTime() + * - setVolume(volumeSliderPosition) + * - mute() + * - unMute() + * - isMuted() + * - updateDisplay() + * - updateCurrentTimeDisplay() + * - updateDurationDisplay() + * - setTimeString(element, time) + */ + var PlayerHandler = function (castPlayer) { + this.target = {}; + this.setTarget = function (target) { + this.target = target; + }; + this.play = function () { + if (castPlayer.playerState == PLAYER_STATE.IDLE || + !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) { + this.load(castPlayer.currentMediaIndex); + return; + } + castPlayer.playerState = PLAYER_STATE.PLAYING; + this.target.play(); + document.getElementById('play').style.display = 'none'; + document.getElementById('pause').style.display = 'block'; + }; + this.pause = function () { + this.target.pause(); + castPlayer.playerState = PLAYER_STATE.PAUSED; + document.getElementById('play').style.display = 'block'; + document.getElementById('pause').style.display = 'none'; + }; + this.stop = function () { + castPlayer.playerState = PLAYER_STATE.IDLE; + this.target.stop(); + }; + this.load = function (mediaIndex) { + if (mediaIndex === void 0) { mediaIndex = null; } + if (!mediaIndex) { + mediaIndex = castPlayer.currentMediaIndex; + } + castPlayer.playerState = PLAYER_STATE.BUFFERING; + this.target.load(mediaIndex); + }; + /** + * Check if media has been loaded on the target player. + * @param {number?} mediaIndex The desired media index. If null, verify if + * any media is loaded. + */ + this.isMediaLoaded = function (mediaIndex) { + return this.target.isMediaLoaded(mediaIndex); + }; + /** + * Called after media has been successfully loaded and is ready to start playback. + * When local, will start playing the video, start the timer, and update the UI. + * When remote, will set the UI to PLAYING and start the timer to update the + * UI based on remote playback. + */ + this.prepareToPlay = function () { + castPlayer.mediaDuration = this.getMediaDuration(); + castPlayer.playerHandler.updateDurationDisplay(); + castPlayer.playerState = PLAYER_STATE.LOADED; + this.play(); + castPlayer.startProgressTimer(); + this.updateDisplay(); + }; + this.getCurrentMediaTime = function () { + return this.target.getCurrentMediaTime(); + }; + this.getMediaDuration = function () { + return this.target.getMediaDuration(); + }; + this.updateDisplay = function () { + // Update local variables + this.currentMediaTime = this.target.getCurrentMediaTime(); + this.mediaDuration = this.target.getMediaDuration(); + this.target.updateDisplay(); + }; + this.updateCurrentTimeDisplay = function () { + this.target.updateCurrentTimeDisplay(); + }; + this.updateDurationDisplay = function () { + this.target.updateDurationDisplay(); + }; + /** + * Determines the correct time string (media or clock) and sets it for the given element. + */ + this.setTimeString = function (element, time) { + this.target.setTimeString(element, time); + }; + this.setVolume = function (volumeSliderPosition) { + this.target.setVolume(volumeSliderPosition); + }; + this.mute = function () { + this.target.mute(); + document.getElementById('audio_on').style.display = 'none'; + document.getElementById('audio_off').style.display = 'block'; + }; + this.unMute = function () { + this.target.unMute(); + document.getElementById('audio_on').style.display = 'block'; + document.getElementById('audio_off').style.display = 'none'; + }; + this.isMuted = function () { + return this.target.isMuted(); + }; + this.seekTo = function (time) { + this.target.seekTo(time); + }; + }; + /** + * Set the PlayerHandler target to use the video-element player + */ + CastPlayer.prototype.setupLocalPlayer = function () { + // Cleanup remote player UI + var live_indicator = document.getElementById('live_indicator'); + if (live_indicator && live_indicator.style && live_indicator.style.display) { + live_indicator.style.display = 'none'; + } + this.removeAdMarkers(); + document.getElementById('skip').style.display = 'none'; + var localPlayer = document.getElementById('video_element'); + if (typeof localPlayer !== 'undefined' && localPlayer) + localPlayer.addEventListener('loadeddata', this.onMediaLoadedLocally.bind(this)); + // This object will implement PlayerHandler callbacks with localPlayer + var playerTarget = {}; + playerTarget.play = function () { + localPlayer.play(); + var vi = document.getElementById('video_image'); + vi.style.display = 'none'; + localPlayer.style.display = 'block'; + }; + playerTarget.pause = function () { + localPlayer.pause(); + }; + playerTarget.stop = function () { + localPlayer.stop(); + }; + playerTarget.load = function (mediaIndex) { + localPlayer.src = this.mediaContents[mediaIndex]['sources'][0]; + localPlayer.load(); + }.bind(this); + playerTarget.isMediaLoaded = function (mediaIndex) { + if (!mediaIndex) { + return (localPlayer.src !== null && localPlayer.src !== ""); + } + else { + return (localPlayer.src == this.mediaContents[mediaIndex]['sources'][0]); + } + }.bind(this); + playerTarget.getCurrentMediaTime = function () { + return localPlayer.currentTime; + }; + playerTarget.getMediaDuration = function () { + return localPlayer.duration; + }; + playerTarget.updateDisplay = function () { + // playerstate view + document.getElementById('playerstate').style.display = 'none'; + document.getElementById('playerstatebg').style.display = 'none'; + document.getElementById('video_image_overlay').style.display = 'none'; + // media_info view + document.getElementById('media_title').innerHTML = + castPlayer.mediaContents[castPlayer.currentMediaIndex]['title']; + document.getElementById('media_subtitle').innerHTML = + castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle']; + }; + playerTarget.updateCurrentTimeDisplay = function () { + // Increment for local playback + this.currentMediaTime += 1; + this.playerHandler.setTimeString(document.getElementById('currentTime'), this.currentMediaTime); + }.bind(this); + playerTarget.updateDurationDisplay = function () { + this.playerHandler.setTimeString(document.getElementById('duration'), this.mediaDuration); + }.bind(this); + playerTarget.setTimeString = function (element, time) { + var currentTimeString = this.getMediaTimeString(time); + if (currentTimeString !== null) { + element.style.display = ''; + element.innerHTML = currentTimeString; + } + else { + element.style.display = 'none'; + } + }.bind(this); + playerTarget.setVolume = function (volumeSliderPosition) { + if (localPlayer) { + localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ? + volumeSliderPosition / FULL_VOLUME_HEIGHT : 1; + } + var p = document.getElementById('audio_bg_level'); + if (typeof p !== 'undefined' && p) { + p.style.height = volumeSliderPosition + 'px'; + p.style.marginTop = -volumeSliderPosition + 'px'; + } + }; + playerTarget.mute = function () { + localPlayer.muted = true; + }; + playerTarget.unMute = function () { + localPlayer.muted = false; + }; + playerTarget.isMuted = function () { + if (localPlayer) + return localPlayer.muted; + }; + playerTarget.seekTo = function (time) { + localPlayer.currentTime = time; + }; + this.playerHandler.setTarget(playerTarget); + this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT); + this.showFullscreenButton(); + this.enableProgressBar(true); + if (this.currentMediaTime > 0) { + this.playerHandler.load(); + this.playerHandler.play(); + } + }; + /** + * Set the PlayerHandler target to use the remote player + * Add event listeners for player changes which may occur outside sender app. + */ + CastPlayer.prototype.setupRemotePlayer = function () { + // Triggers when the media info or the player state changes + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED, function (event) { + var session = cast.framework.CastContext.getInstance().getCurrentSession(); + if (!session) { + this.mediaInfo = null; + this.isLiveContent = false; + this.playerHandler.updateDisplay(); + return; + } + var media = session.getMediaSession(); + if (!media) { + this.mediaInfo = null; + this.isLiveContent = false; + this.playerHandler.updateDisplay(); + return; + } + this.mediaInfo = media.media; + if (this.mediaInfo) { + this.isLiveContent = (this.mediaInfo.streamType == + chrome.cast.media.StreamType.LIVE); + } + else { + this.isLiveContent = false; + } + if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) { + this.playerHandler.prepareToPlay(); + } + this.removeAdMarkers(); + this.updateAdMarkers(); + this.playerHandler.updateDisplay(); + }.bind(this)); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED, function (event) { + this.enableProgressBar(event.value); + }.bind(this)); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, function () { + if (this.remotePlayer.isPaused) { + this.playerHandler.pause(); + } + else if (this.playerState !== PLAYER_STATE.PLAYING) { + // If currently not playing, start to play. + // This occurs if starting to play from local, but this check is + // required if the state is changed remotely. + this.playerHandler.play(); + } + }.bind(this)); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED, function () { + if (this.remotePlayer.isMuted) { + this.playerHandler.mute(); + } + else { + this.playerHandler.unMute(); + } + }.bind(this)); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED, function () { + var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; + var p = document.getElementById('audio_bg_level'); + p.style.height = newVolume + 'px'; + p.style.marginTop = -newVolume + 'px'; + }.bind(this)); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED, function (event) { + this.isPlayingBreak(event.value); + }.bind(this)); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED, function (event) { + this.onWhenSkippableChanged(event.value); + }.bind(this)); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED, function (event) { + this.onCurrentBreakClipTimeChanged(event.value); + }.bind(this)); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED, function (event) { + this.onBreakClipIdChanged(event.value); + }.bind(this)); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED, function (event) { + console.log('LIVE_SEEKABLE_RANGE_CHANGED'); + this.liveSeekableRange = event.value; + }.bind(this)); + // This object will implement PlayerHandler callbacks with + // remotePlayerController, and makes necessary UI updates specific + // to remote playback. + var playerTarget = {}; + playerTarget.play = function () { + if (this.remotePlayer.isPaused) { + this.remotePlayerController.playOrPause(); + } + var vi = document.getElementById('video_image'); + vi.style.display = ''; + var localPlayer = document.getElementById('video_element'); + localPlayer.style.display = 'none'; + }.bind(this); + playerTarget.pause = function () { + if (!this.remotePlayer.isPaused) { + this.remotePlayerController.playOrPause(); + } + }.bind(this); + playerTarget.stop = function () { + this.remotePlayerController.stop(); + }.bind(this); + // Load request for local -> remote + playerTarget.load = function (mediaIndex) { + console.log('Loading...' + this.mediaContents[mediaIndex]['title']); + var mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4'); + mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED; + mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata(); + mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title']; + mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle']; + mediaInfo.metadata.images = [{ + 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'] + }]; + var request = new chrome.cast.media.LoadRequest(mediaInfo); + request.currentTime = this.currentMediaTime; + if (ENABLE_ADS) { + // Add sample breaks and breakClips. + mediaInfo.breakClips = breakClipsJSON; + mediaInfo.breaks = breaksJSON; + } + else if (ENABLE_LIVE) { + // Change the streamType and add live specific metadata. + mediaInfo.streamType = chrome.cast.media.StreamType.LIVE; + // TODO: Set the metadata on the receiver side in your implementation. + // startAbsoluteTime and sectionStartTimeInMedia will be set for you. + // See https://developers.google.com/cast/docs/caf_receiver/live. + // TODO: Start time, is a fake timestamp. Use correct values for your implementation. + var currentTime = new Date(); + // Convert from milliseconds to seconds. + currentTime = currentTime / 1000; + var sectionStartAbsoluteTime = currentTime; + // Duration should be -1 for live streams. + mediaInfo.duration = -1; + // TODO: Set on the receiver for your implementation. + mediaInfo.startAbsoluteTime = currentTime; + mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime; + // TODO: Set on the receiver for your implementation. + mediaInfo.metadata.sectionStartTimeInMedia = 0; + mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration']; + var item = new chrome.cast.media.QueueItem(mediaInfo); + request.queueData = new chrome.cast.media.QueueData(); + request.queueData.items = [item]; + request.queueData.name = "Sample Queue for Live"; + } + // Do not immediately start playing if the player was previously PAUSED. + if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) { + request.autoplay = false; + } + else { + request.autoplay = true; + } + cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(function () { + console.log('Remote media loaded'); + }.bind(this), function (errorCode) { + this.playerState = PLAYER_STATE.IDLE; + console.log('Remote media load error: ' + + CastPlayer.getErrorMessage(errorCode)); + this.playerHandler.updateDisplay(); + }.bind(this)); + }.bind(this); + playerTarget.isMediaLoaded = function (mediaIndex) { + var session = cast.framework.CastContext.getInstance().getCurrentSession(); + if (!session) + return false; + var media = session.getMediaSession(); + if (!media) + return false; + if (media.playerState == PLAYER_STATE.IDLE) { + return false; + } + // No need to verify local mediaIndex content. + return true; + }.bind(this); + /** + * @return {number?} Current media time for the content. Always returns + * media time even if in clock time (conversion done when displaying). + */ + playerTarget.getCurrentMediaTime = function () { + if (this.isLiveContent && this.mediaInfo.metadata && + this.mediaInfo.metadata.sectionStartTimeInMedia) { + return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia; + } + else { + // VOD and live scenerios where live metadata is not provided. + return this.remotePlayer.currentTime; + } + }.bind(this); + /** + * @return {number?} media time duration for the content. Always returns + * media time even if in clock time (conversion done when displaying). + */ + playerTarget.getMediaDuration = function () { + if (this.isLiveContent) { + // Scenerios when live metadata is not provided. + if (this.mediaInfo.metadata == undefined || + this.mediaInfo.metadata.sectionDuration == undefined || + this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) { + return null; + } + return this.mediaInfo.metadata.sectionDuration; + } + else { + return this.remotePlayer.duration; + } + }.bind(this); + playerTarget.updateDisplay = function () { + var castSession = cast.framework.CastContext.getInstance().getCurrentSession(); + if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) { + var media = castSession.getMediaSession(); + var mediaInfo = media.media; + // image placeholder for video view + var vi = document.getElementById('video_image'); + if (mediaInfo.metadata && mediaInfo.metadata.images && + mediaInfo.metadata.images.length > 0) { + vi.src = mediaInfo.metadata.images[0].url; + } + // playerstate view + document.getElementById('playerstate').style.display = 'block'; + document.getElementById('playerstatebg').style.display = 'block'; + document.getElementById('video_image_overlay').style.display = 'block'; + var mediaTitle = ''; + var mediaEpisodeTitle = ''; + var mediaSubtitle = ''; + if (mediaInfo.metadata) { + mediaTitle = mediaInfo.metadata.title; + mediaEpisodeTitle = mediaInfo.metadata.episodeTitle; + // Append episode title if present + mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle; + // Do not display mediaTitle if not defined. + mediaTitle = (mediaTitle) ? mediaTitle + ' ' : ''; + mediaSubtitle = mediaInfo.metadata.subtitle; + mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : ''; + } + if (DEMO_MODE) { + document.getElementById('playerstate').innerHTML = + (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast'; + // media_info view + document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video'); + document.getElementById('media_subtitle').innerHTML = ''; + } + else { + document.getElementById('playerstate').innerHTML = + mediaTitle + media.playerState + ' on ' + + castSession.getCastDevice().friendlyName; + // media_info view + document.getElementById('media_title').innerHTML = mediaTitle; + document.getElementById('media_subtitle').innerHTML = mediaSubtitle; + } + // live information + if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) { + this.liveSeekableRange = media.liveSeekableRange; + var live_indicator = document.getElementById('live_indicator'); + live_indicator.style.display = 'block'; + // Display indicator if current time is close to the end of + // the seekable range. + if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) { + live_indicator.src = "imagefiles/live_indicator_active.png"; + } + else { + live_indicator.src = "imagefiles/live_indicator_inactive.png"; + } + } + else { + document.getElementById('live_indicator').style.display = 'none'; + } + } + else { + // playerstate view + document.getElementById('playerstate').style.display = 'none'; + document.getElementById('playerstatebg').style.display = 'none'; + document.getElementById('video_image_overlay').style.display = 'none'; + // media_info view + document.getElementById('media_title').innerHTML = ""; + document.getElementById('media_subtitle').innerHTML = ""; + } + }.bind(this); + playerTarget.updateCurrentTimeDisplay = function () { + this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime()); + }.bind(this); + playerTarget.updateDurationDisplay = function () { + this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration()); + }.bind(this); + playerTarget.setTimeString = function (element, time) { + var currentTimeString = this.getMediaTimeString(time); + if (this.isLiveContent) { + if (currentTimeString == null) { + element.style.display = 'none'; + return; + } + // clock time + if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) { + element.style.display = 'flex'; + element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime); + } + else { + // media time + element.style.display = 'flex'; + element.innerHTML = currentTimeString; + } + } + else { + if (currentTimeString !== null) { + element.style.display = 'flex'; + element.innerHTML = currentTimeString; + } + else { + element.style.display = 'none'; + } + } + }.bind(this); + playerTarget.setVolume = function (volumeSliderPosition) { + var currentVolume = this.remotePlayer.volumeLevel; + var p = document.getElementById('audio_bg_level'); + if (volumeSliderPosition < FULL_VOLUME_HEIGHT) { + p.style.height = volumeSliderPosition + 'px'; + p.style.marginTop = -volumeSliderPosition + 'px'; + currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT; + } + else { + currentVolume = 1; + } + this.remotePlayer.volumeLevel = currentVolume; + this.remotePlayerController.setVolumeLevel(); + }.bind(this); + playerTarget.mute = function () { + if (!this.remotePlayer.isMuted) { + this.remotePlayerController.muteOrUnmute(); + } + }.bind(this); + playerTarget.unMute = function () { + if (this.remotePlayer.isMuted) { + this.remotePlayerController.muteOrUnmute(); + } + }.bind(this); + playerTarget.isMuted = function () { + return this.remotePlayer.isMuted; + }.bind(this); + playerTarget.seekTo = function (time) { + this.remotePlayer.currentTime = time; + this.remotePlayerController.seek(); + }.bind(this); + this.playerHandler.setTarget(playerTarget); + // Setup remote player properties on setup + if (this.remotePlayer.isMuted) { + this.playerHandler.mute(); + } + this.enableProgressBar(this.remotePlayer.canSeek); + // The remote player may have had a volume set from previous playback + var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; + var p = document.getElementById('audio_bg_level'); + p.style.height = currentVolume + 'px'; + p.style.marginTop = -currentVolume + 'px'; + // Show media_control + document.getElementById('media_control').style.opacity = 0.7; + this.hideFullscreenButton(); + // If resuming a session, take the remote properties and continue the existing + // playback. Otherwise, load local content. + if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() == + cast.framework.SessionState.SESSION_RESUMED) { + console.log('Resuming session'); + this.playerHandler.prepareToPlay(); + // New media has been loaded so the previous ad markers should + // be removed. + this.removeAdMarkers(); + this.updateAdMarkers(); + } + else { + this.playerHandler.load(); + } + }; + /** + * Callback when media is loaded in local player + */ + CastPlayer.prototype.onMediaLoadedLocally = function () { + var localPlayer = document.getElementById('video_element'); + localPlayer.currentTime = this.currentMediaTime; + this.playerHandler.prepareToPlay(); + }; + /** + * Select a media content + * @param {number} mediaIndex A number for media index + */ + CastPlayer.prototype.selectMedia = function (mediaIndex) { + console.log('Media index selected: ' + mediaIndex); + this.currentMediaIndex = mediaIndex; + // Clear currentMediaInfo when playing content from the sender. + this.playerHandler.currentMediaInfo = undefined; + // Set video image + var vi = document.getElementById('video_image'); + vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']; + // Reset progress bar + var pi = document.getElementById('progress_indicator'); + pi.style.marginLeft = '0px'; + var progress = document.getElementById('progress'); + progress.style.width = '0px'; + var seekable_window = document.getElementById('seekable_window'); + var unseekable_overlay = document.getElementById('unseekable_overlay'); + seekable_window.style.width = PROGRESS_BAR_WIDTH; + unseekable_overlay.style.width = '0px'; + // Stop timer and reset time displays + this.stopProgressTimer(); + this.currentMediaTime = 0; + this.playerHandler.setTimeString(document.getElementById('currentTime'), 0); + this.playerHandler.setTimeString(document.getElementById('duration'), 0); + this.playerState = PLAYER_STATE.IDLE; + this.playerHandler.play(); + }; + /** + * Media seek function + * @param {Event} event An event object from seek + */ + CastPlayer.prototype.seekMedia = function (event) { + if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) { + console.log('Error - Not seekable'); + return; + } + if (this.isLiveContent && !this.liveSeekableRange) { + console.log('Live content has no seekable range.'); + return; + } + var position = parseInt(event.offsetX, 10); + var pi = document.getElementById('progress_indicator'); + var progress = document.getElementById('progress'); + var seekTime = 0; + var pp = 0; + var pw = 0; + if (event.currentTarget.id == 'progress_indicator') { + seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position / + PROGRESS_BAR_WIDTH, 10); + pp = parseInt(pi.style.marginLeft, 10) + position; + pw = parseInt(progress.style.width, 10) + position; + } + else { + seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10); + pp = position; + pw = position; + } + if (this.playerState === PLAYER_STATE.PLAYING || + this.playerState === PLAYER_STATE.PAUSED) { + this.currentMediaTime = seekTime; + progress.style.width = pw + 'px'; + pi.style.marginLeft = pp + 'px'; + } + if (this.isLiveContent) { + seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia; + } + this.playerHandler.seekTo(seekTime); + }; + /** + * Set current player volume + * @param {Event} mouseEvent + */ + CastPlayer.prototype.setVolume = function (mouseEvent) { + var p = document.getElementById('audio_bg_level'); + var pos = 0; + if (mouseEvent.currentTarget.id === 'audio_bg_track') { + pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10); + } + else { + pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10); + } + this.playerHandler.setVolume(pos); + }; + /** + * Starts the timer to increment the media progress bar + */ + CastPlayer.prototype.startProgressTimer = function () { + this.stopProgressTimer(); + // Start progress timer + this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP); + }; + /** + * Stops the timer to increment the media progress bar + */ + CastPlayer.prototype.stopProgressTimer = function () { + if (this.timer) { + clearInterval(this.timer); + this.timer = null; + } + }; + /** + * Increment media current time depending on remote or local playback + */ + CastPlayer.prototype.incrementMediaTime = function () { + // First sync with the current player's time + this.currentMediaTime = this.playerHandler.getCurrentMediaTime(); + this.mediaDuration = this.playerHandler.getMediaDuration(); + this.playerHandler.updateDurationDisplay(); + if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) { + this.playerHandler.updateCurrentTimeDisplay(); + this.updateProgressBarByTimer(); + } + else if (this.mediaDuration > 0) { + this.endPlayback(); + } + }; + /** + * Update progress bar and currentTime based on timer + */ + CastPlayer.prototype.updateProgressBarByTimer = function () { + var progressBar = document.getElementById('progress'); + var pi = document.getElementById('progress_indicator'); + // Live situation where the progress and duration is unknown. + if (this.mediaDuration == null) { + if (!this.isLiveContent) { + console.log('Error - Duration is not defined for a VOD stream.'); + } + progressBar.style.width = '0px'; + var skip = document.getElementById('skip'); + if (skip && skip.style && skip.style.display) { + skip.style.display = 'none'; + } + pi.style.display = 'none'; + var seekable_window_1 = document.getElementById('seekable_window'); + if (seekable_window_1 && seekable_window_1.style && seekable_window_1.style.width) + seekable_window_1.style.width = '0px'; + var unseekable_overlay_1 = document.getElementById('unseekable_overlay'); + if (unseekable_overlay_1 && unseekable_overlay_1.style && unseekable_overlay_1.style.width) + unseekable_overlay_1.style.width = '0px'; + return; + } + else { + pi.style.display = ''; + } + if (isNaN(parseInt(progressBar.style.width, 10))) { + progressBar.style.width = '0px'; + } + // Prevent indicator from exceeding the max width. Happens during + // short media when each progress step is large + var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration); + if (pp > PROGRESS_BAR_WIDTH) { + pp = PROGRESS_BAR_WIDTH; + } + else if (pp < 0) { + pp = 0; + } + progressBar.style.width = pp + 'px'; + pi.style.marginLeft = pp + 'px'; + var seekable_window = document.getElementById('seekable_window'); + var unseekable_overlay = document.getElementById('unseekable_overlay'); + if (this.isLiveContent) { + if (this.liveSeekableRange) { + // Use the liveSeekableRange to draw the seekable and unseekable windows + var seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) - + this.mediaInfo.metadata.sectionStartTimeInMedia; + var seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration); + if (seekableWidth > PROGRESS_BAR_WIDTH) { + seekableWidth = PROGRESS_BAR_WIDTH; + } + else if (seekableWidth < 0) { + seekableWidth = 0; + } + seekable_window.style.width = seekableWidth + 'px'; + var unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) - + this.mediaInfo.metadata.sectionStartTimeInMedia; + var unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration); + if (unseekableWidth > PROGRESS_BAR_WIDTH) { + unseekableWidth = PROGRESS_BAR_WIDTH; + } + else if (unseekableWidth < 0) { + unseekableWidth = 0; + } + unseekable_overlay.style.width = unseekableWidth + 'px'; + } + else { + // Nothing is seekable if no liveSeekableRange + seekable_window.style.width = '0px'; + unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px'; + } + } + else { + // Default to everything seekable + seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px'; + unseekable_overlay.style.width = '0px'; + } + if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) { + this.endPlayback(); + } + }; + /** + * End playback. Called when media ends. + */ + CastPlayer.prototype.endPlayback = function () { + this.currentMediaTime = 0; + this.stopProgressTimer(); + this.playerState = PLAYER_STATE.IDLE; + this.playerHandler.updateDisplay(); + var play = document.getElementById('play'); + if (play && play.style && play.display) + play.style.display = 'block'; + var pause = document.getElementById('pause'); + if (pause && pause.style && pause.style.display) + pause.style.display = 'none'; + }; + /** + * @param {?number} timestamp Linux timestamp + * @return {?string} media time string. Null if time is invalid. + */ + CastPlayer.prototype.getMediaTimeString = function (timestamp) { + if (timestamp == undefined || timestamp == null) { + return null; + } + var isNegative = false; + if (timestamp < 0) { + isNegative = true; + timestamp *= -1; + } + var hours = Math.floor(timestamp / 3600); + var minutes = Math.floor((timestamp - (hours * 3600)) / 60); + var seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60)); + if (hours < 10) + hours = '0' + hours; + if (minutes < 10) + minutes = '0' + minutes; + if (seconds < 10) + seconds = '0' + seconds; + return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds; + }; + /** + * @param {number} timestamp Linux timestamp + * @return {?string} ClockTime string. Null if time is invalid. + */ + CastPlayer.prototype.getClockTimeString = function (timestamp) { + if (!timestamp) + return "0:00:00"; + var date = new Date(timestamp * 1000); + var hours = date.getHours(); + var minutes = date.getMinutes(); + var seconds = date.getSeconds(); + var ampm = hours >= 12 ? 'PM' : 'AM'; + hours = hours % 12; + // Hour '0' should be '12' + hours = hours ? hours : 12; + minutes = ('0' + minutes).slice(-2); + seconds = ('0' + seconds).slice(-2); + var clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm; + return clockTime; + }; + /** + * Updates Ad markers in UI + */ + CastPlayer.prototype.updateAdMarkers = function () { + var castSession = cast.framework.CastContext.getInstance().getCurrentSession(); + if (!castSession) + return; + var media = castSession.getMediaSession(); + if (!media) + return; + var mediaInfo = media.media; + if (!mediaInfo) + return; + var breaks = mediaInfo.breaks; + var contentDuration = mediaInfo.duration; + if (!breaks) { + return; + } + for (var i = 0; i < breaks.length; i++) { + var adBreak = breaks[i]; + // Server-side stitched Ads (embedded) are skipped when the position is beyond + // the duration, so they shouldn't be shown with an ad marker on the UI. + if (adBreak.position > contentDuration && adBreak.isEmbedded) { + continue; + } + // Place marker if not already set in position + if (!document.getElementById('ad' + adBreak.position)) { + var div = document.getElementById('progress'); + div.innerHTML += '
'; + } + } + }; + /** + * Remove Ad markers in UI + */ + CastPlayer.prototype.removeAdMarkers = function () { + document.querySelectorAll('.adMarker').forEach(function (adMarker) { + adMarker.remove(); + }); + }; + /** + * Position of the ad marker from the margin + */ + CastPlayer.prototype.adPositionToMargin = function (position, contentDuration) { + // Post-roll + if (position == -1) { + return PROGRESS_BAR_WIDTH; + } + // Client stitched Ads (not embedded) beyond the duration, will play at the + // end of the content. + if (position > contentDuration) { + return PROGRESS_BAR_WIDTH; + } + // Convert Ad position to margin + return (PROGRESS_BAR_WIDTH * position) / contentDuration; + }; + /** + * Handle BREAK_CLIP_ID_CHANGED event + */ + CastPlayer.prototype.onBreakClipIdChanged = function () { + // Hide skip button when switching to a new breakClip + var skip = document.getElementById('skip'); + if (skip && skip.style && skip.style.display) + skip.style.display = 'none'; + }; + /** + * Disable progress bar if playing a break. + */ + CastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) { + this.enableProgressBar(!isPlayingBreak); + }; + /** + * Handle WHEN_SKIPPABLE_CHANGED event + */ + CastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) { + this.whenSkippable = whenSkippable; + }; + /** + * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event + */ + CastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) { + var skip = document.getElementById('skip'); + // Unskippable + if (this.whenSkippable == undefined || this.whenSkippable < 0) { + // Hide skip button + if (skip && skip.style && skip.style.display) + skip.style.display = 'none'; + } + // Skippable + else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) { + // Show skip button + if (skip && skip.style && skip.style.display) + skip.style.display = 'block'; + } + // Not ready to be skipped + else { + // Hide skip button + if (skip && skip.style && skip.style.display) + skip.style.display = 'none'; + } + }; + /** + * Skip the current Ad + */ + CastPlayer.prototype.skipAd = function () { + this.remotePlayerController.skipAd(); + }; + /** + * Enable/disable progress bar + */ + CastPlayer.prototype.enableProgressBar = function (enable) { + var progress = document.getElementById('progress'); + var progress_indicator = document.getElementById('progress_indicator'); + var seekable_window = document.getElementById('seekable_window'); + if (enable) { + // Enable UI + progress.style.backgroundImage = "url('./assets/imagefiles/timeline_bg_progress.png')"; + progress.style.cursor = "pointer"; + seekable_window.style.cursor = "pointer"; + progress_indicator.style.cursor = "pointer"; + progress_indicator.draggable = true; + // Add listeners + progress.addEventListener('click', this.seekMediaListener); + seekable_window.addEventListener('click', this.seekMediaListener); + progress_indicator.addEventListener('dragend', this.seekMediaListener); + } + else { + // Disable UI + progress.style.backgroundImage = "url('./assets/imagefiles/timeline_bg_buffer.png')"; + progress.style.cursor = "default"; + seekable_window.style.cursor = "default"; + progress_indicator.style.cursor = "default"; + progress_indicator.draggable = false; + // Remove listeners + progress.removeEventListener('click', this.seekMediaListener); + seekable_window.removeEventListener('click', this.seekMediaListener); + progress_indicator.removeEventListener('dragend', this.seekMediaListener); + } + }; + /** + * Request full screen mode + */ + CastPlayer.prototype.requestFullScreen = function () { + // Supports most browsers and their versions + var element = document.getElementById('video_element'); + var requestMethod = element['requestFullScreen'] || element['webkitRequestFullScreen']; + if (requestMethod) { + // Native full screen. + requestMethod.call(element); + console.log('Requested fullscreen'); + } + }; + /** + * Exit full screen mode + */ + CastPlayer.prototype.cancelFullScreen = function () { + // Supports most browsers and their versions. + var requestMethod = document['cancelFullScreen'] || document['webkitCancelFullScreen']; + if (requestMethod) { + requestMethod.call(document); + } + }; + /** + * Exit fullscreen mode by escape + */ + CastPlayer.prototype.fullscreenChangeHandler = function () { + this.fullscreen = !this.fullscreen; + }; + /** + * Show expand/collapse fullscreen button + */ + CastPlayer.prototype.showFullscreenButton = function () { + var fullscreen_expand = document.getElementById('fullscreen_expand'); + var fullscreen_collapse = document.getElementById('fullscreen_collapse'); + if (this.fullscreen) { + if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) + fullscreen_expand.style.display = 'none'; + if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display) + fullscreen_collapse.style.display = 'block'; + } + else { + if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) + fullscreen_expand.style.display = 'block'; + if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display) + fullscreen_collapse.style.display = 'none'; + } + }; + /** + * Hide expand/collapse fullscreen button + */ + CastPlayer.prototype.hideFullscreenButton = function () { + var fullscreen_expand = document.getElementById('fullscreen_expand'); + var fullscreen_collapse = document.getElementById('fullscreen_collapse'); + if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) + fullscreen_expand.style.display = 'none'; + if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display) + fullscreen_collapse.style.display = 'none'; + }; + /** + * Show the media control + */ + CastPlayer.prototype.showMediaControl = function () { + var media_control = document.getElementById('media_control'); + if (media_control && media_control.style && media_control.opacity) + media_control.style.opacity = 0.7; + }; + /** + * Hide the media control + */ + CastPlayer.prototype.hideMediaControl = function () { + if (typeof cast !== 'undefined') { + var context = cast.framework.CastContext.getInstance(); + if (context && context.getCurrentSession()) { + // Do not hide controls during an active cast session. + document.getElementById('media_control').style.opacity = 0.7; + } + else { + document.getElementById('media_control').style.opacity = 0; + } + } + }; + /** + * Show the volume slider + */ + CastPlayer.prototype.showVolumeSlider = function () { + if (!this.playerHandler.isMuted()) { + document.getElementById('audio_bg').style.opacity = 1; + document.getElementById('audio_bg_track').style.opacity = 1; + document.getElementById('audio_bg_level').style.opacity = 1; + document.getElementById('audio_indicator').style.opacity = 1; + } + }; + /** + * Hide the volume slider + */ + CastPlayer.prototype.hideVolumeSlider = function () { + document.getElementById('audio_bg').style.opacity = 0; + document.getElementById('audio_bg_track').style.opacity = 0; + document.getElementById('audio_bg_level').style.opacity = 0; + document.getElementById('audio_indicator').style.opacity = 0; + }; + /** + * Reset the volume slider + */ + CastPlayer.prototype.resetVolumeSlider = function () { + var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight; + var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight; + document.getElementById('audio_bg_level').style.height = + defaultVolumeSliderHeight + 'px'; + document.getElementById('audio_on').style.display = 'block'; + document.getElementById('audio_off').style.display = 'none'; + }; + /** + * Initialize UI components and add event listeners + */ + CastPlayer.prototype.initializeUI = function () { + // Set initial values for title and subtitle. + if (this.mediaContents && this.mediaContents.length > 0) { + document.getElementById('media_title').innerHTML = + this.mediaContents[0]['title']; + document.getElementById('media_subtitle').innerHTML = + this.mediaContents[this.currentMediaIndex]['subtitle']; + } + document.getElementById('seekable_window').addEventListener('click', this.seekMediaListener); + document.getElementById('progress').addEventListener('click', this.seekMediaListener); + document.getElementById('progress_indicator').addEventListener('dragend', this.seekMediaListener); + document.getElementById('skip').addEventListener('click', this.skipAd.bind(this)); + document.getElementById('audio_on').addEventListener('click', this.playerHandler.mute.bind(this.playerHandler)); + document.getElementById('audio_off').addEventListener('click', this.playerHandler.unMute.bind(this.playerHandler)); + document.getElementById('audio_bg').addEventListener('mouseover', this.showVolumeSlider.bind(this)); + document.getElementById('audio_on').addEventListener('mouseover', this.showVolumeSlider.bind(this)); + document.getElementById('audio_bg_level').addEventListener('mouseover', this.showVolumeSlider.bind(this)); + document.getElementById('audio_bg_track').addEventListener('mouseover', this.showVolumeSlider.bind(this)); + document.getElementById('audio_bg_level').addEventListener('click', this.setVolume.bind(this)); + document.getElementById('audio_bg_track').addEventListener('click', this.setVolume.bind(this)); + document.getElementById('audio_bg').addEventListener('mouseout', this.hideVolumeSlider.bind(this)); + document.getElementById('audio_on').addEventListener('mouseout', this.hideVolumeSlider.bind(this)); + var main_video = document.getElementById('main_video'); + if (typeof main_video !== 'undefined' && main_video) { + main_video.addEventListener('mouseover', this.showMediaControl.bind(this)); + main_video.addEventListener('mouseout', this.hideMediaControl.bind(this)); + } + document.getElementById('media_control').addEventListener('mouseover', this.showMediaControl.bind(this)); + document.getElementById('media_control').addEventListener('mouseout', this.hideMediaControl.bind(this)); + document.getElementById('fullscreen_expand').addEventListener('click', this.requestFullScreen.bind(this)); + document.getElementById('fullscreen_collapse').addEventListener('click', this.cancelFullScreen.bind(this)); + document.addEventListener('fullscreenchange', this.fullscreenChangeHandler.bind(this), false); + document.addEventListener('webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false); + // Enable play/pause buttons + document.getElementById('play').addEventListener('click', this.playerHandler.play.bind(this.playerHandler)); + document.getElementById('pause').addEventListener('click', this.playerHandler.pause.bind(this.playerHandler)); + document.getElementById('progress_indicator').draggable = true; + // Set up feature radio buttons + var noneRadio = document.getElementById('none'); + noneRadio.onclick = function () { + ENABLE_LIVE = false; + ENABLE_ADS = false; + console.log("Features have been removed"); + }; + var adsRadio = document.getElementById('ads'); + adsRadio.onclick = function () { + ENABLE_LIVE = false; + ENABLE_ADS = true; + console.log("Ads have been enabled"); + }; + var liveRadio = document.getElementById('live'); + liveRadio.onclick = function () { + ENABLE_LIVE = true; + ENABLE_ADS = false; + console.log("Live has been enabled"); + }; + if (ENABLE_ADS) { + if (ENABLE_LIVE) { + console.error('Only one feature can be enabled at a time. Enabling ads.'); + } + adsRadio.checked = true; + console.log("Ads are enabled"); + } + else if (ENABLE_LIVE) { + liveRadio.checked = true; + console.log("Live is enabled"); + } + else { + noneRadio.checked = true; + console.log("No features are enabled"); + } + }; + /** + * Add video thumbnails div's to UI for media JSON contents + */ + CastPlayer.prototype.addVideoThumbs = function () { + if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) { + this.mediaContents = this.mediaJSON['categories'][0]['videos']; + var ni = document.getElementById('carousel'); + var newdiv = null; + var divIdName = null; + for (var i = 0; i < this.mediaContents.length; i++) { + newdiv = document.createElement('div'); + divIdName = 'thumb' + i + 'Div'; + newdiv.setAttribute('id', divIdName); + newdiv.setAttribute('class', 'thumb'); + newdiv.innerHTML = + ''; + newdiv.addEventListener('click', this.selectMedia.bind(this, i)); + ni.appendChild(newdiv); + } + } + }; + /** + * Makes human-readable message from chrome.cast.Error + * @param {chrome.cast.Error} error + * @return {string} error message + */ + CastPlayer.getErrorMessage = function (error) { + switch (error.code) { + case chrome.cast.ErrorCode.API_NOT_INITIALIZED: + return 'The API is not initialized.' + + (error.description ? ' :' + error.description : ''); + case chrome.cast.ErrorCode.CANCEL: + return 'The operation was canceled by the user' + + (error.description ? ' :' + error.description : ''); + case chrome.cast.ErrorCode.CHANNEL_ERROR: + return 'A channel to the receiver is not available.' + + (error.description ? ' :' + error.description : ''); + case chrome.cast.ErrorCode.EXTENSION_MISSING: + return 'The Cast extension is not available.' + + (error.description ? ' :' + error.description : ''); + case chrome.cast.ErrorCode.INVALID_PARAMETER: + return 'The parameters to the operation were not valid.' + + (error.description ? ' :' + error.description : ''); + case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE: + return 'No receiver was compatible with the session request.' + + (error.description ? ' :' + error.description : ''); + case chrome.cast.ErrorCode.SESSION_ERROR: + return 'A session could not be created, or a session was invalid.' + + (error.description ? ' :' + error.description : ''); + case chrome.cast.ErrorCode.TIMEOUT: + return 'The operation timed out.' + + (error.description ? ' :' + error.description : ''); + default: + return error; + } + }; + var castPlayer = new CastPlayer(); + window['__onGCastApiAvailable'] = function (isAvailable) { + if (isAvailable) { + castPlayer.initializeCastPlayer(); + } + }; + window.CastPlayer = castPlayer; - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */ - /* global Reflect, Promise */ - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) - if (b.hasOwnProperty(p)) - d[p] = b[p]; }; - return extendStatics(d, b); - }; - function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - } - var __assign = function () { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - function __rest(s, e) { - var t = {}; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { - if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) - t[p[i]] = s[p[i]]; - } - return t; - } - function __decorate(decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") - r = Reflect.decorate(decorators, target, key, desc); - else - for (var i = decorators.length - 1; i >= 0; i--) - if (d = decorators[i]) - r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - } - function __param(paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); }; - } - function __metadata(metadataKey, metadataValue) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") - return Reflect.metadata(metadataKey, metadataValue); - } - function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { - step(generator.next(value)); - } - catch (e) { - reject(e); - } } - function rejected(value) { try { - step(generator["throw"](value)); - } - catch (e) { - reject(e); - } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - } - function __generator(thisArg, body) { - var _ = { label: 0, sent: function () { if (t[0] & 1) - throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) - throw new TypeError("Generator is already executing."); - while (_) - try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) - return t; - if (y = 0, t) - op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: - case 1: - t = op; - break; - case 4: - _.label++; - return { value: op[1], done: false }; - case 5: - _.label++; - y = op[1]; - op = [0]; - continue; - case 7: - op = _.ops.pop(); - _.trys.pop(); - continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { - _ = 0; - continue; - } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { - _.label = op[1]; - break; - } - if (op[0] === 6 && _.label < t[1]) { - _.label = t[1]; - t = op; - break; - } - if (t && _.label < t[2]) { - _.label = t[2]; - _.ops.push(op); - break; - } - if (t[2]) - _.ops.pop(); - _.trys.pop(); - continue; - } - op = body.call(thisArg, _); - } - catch (e) { - op = [6, e]; - y = 0; - } - finally { - f = t = 0; - } - if (op[0] & 5) - throw op[1]; - return { value: op[0] ? op[1] : void 0, done: true }; - } - } - function __createBinding(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - } - function __exportStar(m, exports) { - for (var p in m) - if (p !== "default" && !exports.hasOwnProperty(p)) - exports[p] = m[p]; - } - function __values(o) { - var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) - return m.call(o); - if (o && typeof o.length === "number") - return { - next: function () { - if (o && i >= o.length) - o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); - } - function __read(o, n) { - var m = typeof Symbol === "function" && o[Symbol.iterator]; - if (!m) - return o; - var i = m.call(o), r, ar = [], e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) - ar.push(r.value); - } - catch (error) { - e = { error: error }; - } - finally { - try { - if (r && !r.done && (m = i["return"])) - m.call(i); - } - finally { - if (e) - throw e.error; - } - } - return ar; - } - function __spread() { - for (var ar = [], i = 0; i < arguments.length; i++) - ar = ar.concat(__read(arguments[i])); - return ar; - } - function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) - s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; - } - ; - function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); - } - function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) - throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; - function verb(n) { if (g[n]) - i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } - function resume(n, v) { try { - step(g[n](v)); - } - catch (e) { - settle(q[0][3], e); - } } - function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } - function fulfill(value) { resume("next", value); } - function reject(value) { resume("throw", value); } - function settle(f, v) { if (f(v), q.shift(), q.length) - resume(q[0][0], q[0][1]); } - } - function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; - function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } - } - function __asyncValues(o) { - if (!Symbol.asyncIterator) - throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); - function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } - function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); } - } - function __makeTemplateObject(cooked, raw) { - if (Object.defineProperty) { - Object.defineProperty(cooked, "raw", { value: raw }); - } - else { - cooked.raw = raw; - } - return cooked; - } - ; - function __importStar(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) - for (var k in mod) - if (Object.hasOwnProperty.call(mod, k)) - result[k] = mod[k]; - result.default = mod; - return result; - } - function __importDefault(mod) { - return (mod && mod.__esModule) ? mod : { default: mod }; - } - function __classPrivateFieldGet(receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); - } - function __classPrivateFieldSet(receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; - } + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. - exports.ɵa = /** @class */ (function () { - function NgCastComponent(ngCastService) { - this.ngCastService = ngCastService; - } - NgCastComponent.prototype.ngOnInit = function () { - this.window = window; - var ngCastService = this.ngCastService; - this.window['__onGCastApiAvailable'] = function (isAvailable) { - if (isAvailable) { - ngCastService.initializeCastApi(); - } - }; - this.castingStatus = this.ngCastService.getStatus(); - }; - NgCastComponent.prototype.openSession = function () { - this.ngCastService.discoverDevices(); - }; - NgCastComponent.prototype.closeSession = function () { - this.ngCastService.stop(); - }; - return NgCastComponent; - }()); - exports.ɵa = __decorate([ - core.Component({ - selector: 'ng-cast', - template: "cast\ncast_connected", - styles: [""] - }) - ], exports.ɵa); + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + /* global Reflect, Promise */ + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) + if (b.hasOwnProperty(p)) + d[p] = b[p]; }; + return extendStatics(d, b); + }; + function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + function __rest(s, e) { + var t = {}; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; + } + function __decorate(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") + r = Reflect.decorate(decorators, target, key, desc); + else + for (var i = decorators.length - 1; i >= 0; i--) + if (d = decorators[i]) + r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + } + function __param(paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); }; + } + function __metadata(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") + return Reflect.metadata(metadataKey, metadataValue); + } + function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { + step(generator.next(value)); + } + catch (e) { + reject(e); + } } + function rejected(value) { try { + step(generator["throw"](value)); + } + catch (e) { + reject(e); + } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + } + function __generator(thisArg, body) { + var _ = { label: 0, sent: function () { if (t[0] & 1) + throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) + throw new TypeError("Generator is already executing."); + while (_) + try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) + return t; + if (y = 0, t) + op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: + case 1: + t = op; + break; + case 4: + _.label++; + return { value: op[1], done: false }; + case 5: + _.label++; + y = op[1]; + op = [0]; + continue; + case 7: + op = _.ops.pop(); + _.trys.pop(); + continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { + _ = 0; + continue; + } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { + _.label = op[1]; + break; + } + if (op[0] === 6 && _.label < t[1]) { + _.label = t[1]; + t = op; + break; + } + if (t && _.label < t[2]) { + _.label = t[2]; + _.ops.push(op); + break; + } + if (t[2]) + _.ops.pop(); + _.trys.pop(); + continue; + } + op = body.call(thisArg, _); + } + catch (e) { + op = [6, e]; + y = 0; + } + finally { + f = t = 0; + } + if (op[0] & 5) + throw op[1]; + return { value: op[0] ? op[1] : void 0, done: true }; + } + } + function __createBinding(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + } + function __exportStar(m, exports) { + for (var p in m) + if (p !== "default" && !exports.hasOwnProperty(p)) + exports[p] = m[p]; + } + function __values(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) + return m.call(o); + if (o && typeof o.length === "number") + return { + next: function () { + if (o && i >= o.length) + o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); + } + function __read(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) + return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) + ar.push(r.value); + } + catch (error) { + e = { error: error }; + } + finally { + try { + if (r && !r.done && (m = i["return"])) + m.call(i); + } + finally { + if (e) + throw e.error; + } + } + return ar; + } + function __spread() { + for (var ar = [], i = 0; i < arguments.length; i++) + ar = ar.concat(__read(arguments[i])); + return ar; + } + function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) + s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; + } + ; + function __await(v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); + } + function __asyncGenerator(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) + throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; + function verb(n) { if (g[n]) + i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + function resume(n, v) { try { + step(g[n](v)); + } + catch (e) { + settle(q[0][3], e); + } } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function fulfill(value) { resume("next", value); } + function reject(value) { resume("throw", value); } + function settle(f, v) { if (f(v), q.shift(), q.length) + resume(q[0][0], q[0][1]); } + } + function __asyncDelegator(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; + function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } + } + function __asyncValues(o) { + if (!Symbol.asyncIterator) + throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); } + } + function __makeTemplateObject(cooked, raw) { + if (Object.defineProperty) { + Object.defineProperty(cooked, "raw", { value: raw }); + } + else { + cooked.raw = raw; + } + return cooked; + } + ; + function __importStar(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (Object.hasOwnProperty.call(mod, k)) + result[k] = mod[k]; + result.default = mod; + return result; + } + function __importDefault(mod) { + return (mod && mod.__esModule) ? mod : { default: mod }; + } + function __classPrivateFieldGet(receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); + } + function __classPrivateFieldSet(receiver, privateMap, value) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to set private field on non-instance"); + } + privateMap.set(receiver, value); + return value; + } - exports.NgCastService = /** @class */ (function () { - function NgCastService() { - var _this = this; - this.window = window; - this.status = { - casting: false - }; - this.onInitSuccess = function () { - console.log('GCast initialization success'); - }; - this.onError = function (err) { - console.log('GCast initialization failed', err); - }; - this.discoverDevices = function () { - var self = _this; - var subj = new rxjs.Subject(); - _this.cast.requestSession(function (s) { - self.session = s; - self.setCasting(true); - subj.next('CONNECTED'); - }, function (err) { - self.setCasting(false); - if (err.code === 'cancel') { - self.session = undefined; - subj.next('CANCEL'); - } - else { - console.error('Error selecting a cast device', err); - } - }); - return subj; - }; - this.onMediaDiscovered = function (categories) { - var script = window['document'].createElement('script'); - script.setAttribute('type', 'text/javascript'); - script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1'); - window['document'].body.appendChild(script); - mediaJSON.categories = categories; - }; - this.play = function () { - _this.currentMedia.play(null); - }; - this.pause = function () { - _this.currentMedia.pause(null); - }; - this.stop = function () { - _this.currentMedia.stop(null); - }; - this.onMediaError = function (err) { - console.error('Error launching media', err); - }; - } - NgCastService.prototype.initializeCastApi = function () { - var _this = this; - this.cast = this.window['chrome'].cast; - var sessionRequest = new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID); - var apiConfig = new this.cast.ApiConfig(sessionRequest, function () { }, function (status) { if (status === _this.cast.ReceiverAvailability.AVAILABLE) { } }); - var x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError); - }; - ; - NgCastService.prototype.setCasting = function (value) { - this.status.casting = value; - }; - NgCastService.prototype.getStatus = function () { - return this.status; - }; - return NgCastService; - }()); - exports.NgCastService = __decorate([ - core.Injectable() - ], exports.NgCastService); + exports.ɵa = /** @class */ (function () { + function NgCastComponent(ngCastService) { + this.ngCastService = ngCastService; + } + NgCastComponent.prototype.ngOnInit = function () { + this.window = window; + var ngCastService = this.ngCastService; + this.window['__onGCastApiAvailable'] = function (isAvailable) { + if (isAvailable) { + ngCastService.initializeCastApi(); + } + }; + this.castingStatus = this.ngCastService.getStatus(); + }; + NgCastComponent.prototype.openSession = function () { + this.ngCastService.discoverDevices(); + }; + NgCastComponent.prototype.closeSession = function () { + this.ngCastService.discoverDevices(); + }; + return NgCastComponent; + }()); + exports.ɵa = __decorate([ + core.Component({ + selector: 'ng-cast', + template: "cast\ncast_connected", + styles: [""] + }) + ], exports.ɵa); - exports.NgCastModule = /** @class */ (function () { - function NgCastModule() { - } - return NgCastModule; - }()); - exports.NgCastModule = __decorate([ - core.NgModule({ - schemas: [core.CUSTOM_ELEMENTS_SCHEMA], - imports: [ - common.CommonModule - ], - exports: [exports.ɵa], - providers: [exports.NgCastService], - declarations: [exports.ɵa] - }) - ], exports.NgCastModule); + exports.NgCastService = /** @class */ (function () { + function NgCastService() { + var _this = this; + this.window = window; + this.status = { + casting: false + }; + this.onInitSuccess = function () { + console.log('GCast initialization success'); + }; + this.onError = function (err) { + console.log('GCast initialization failed', err); + }; + this.discoverDevices = function () { + var self = _this; + var subj = new rxjs.Subject(); + _this.cast.requestSession(function (s) { + self.session = s; + self.setCasting(true); + subj.next('CONNECTED'); + }, function (err) { + self.setCasting(false); + if (err.code === 'cancel') { + self.session = undefined; + subj.next('CANCEL'); + } + else { + console.error('Error selecting a cast device', err); + } + }); + return subj; + }; + this.onMediaDiscovered = function (categories) { + var script = window['document'].createElement('script'); + script.setAttribute('type', 'text/javascript'); + script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1'); + window['document'].body.appendChild(script); + globalThis.CastPlayer.mediaJSON.categories = categories; + }; + this.play = function () { + _this.currentMedia.play(null); + }; + this.pause = function () { + _this.currentMedia.pause(null); + }; + this.stop = function () { + _this.currentMedia.stop(null); + }; + this.onMediaError = function (err) { + console.error('Error launching media', err); + }; + globalThis.CastPlayer.mediaJSON = { + categories: [] + }; + } + NgCastService.prototype.initializeCastApi = function () { + var _this = this; + this.cast = this.window['chrome'].cast; + var sessionRequest = new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID); + var apiConfig = new this.cast.ApiConfig(sessionRequest, function () { }, function (status) { if (status === _this.cast.ReceiverAvailability.AVAILABLE) { } }); + var x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError); + }; + ; + NgCastService.prototype.setCasting = function (value) { + globalThis.CastPlayer.addVideoThumbs(); + this.status.casting = value; + }; + NgCastService.prototype.getStatus = function () { + return this.status; + }; + return NgCastService; + }()); + exports.NgCastService = __decorate([ + core.Injectable() + ], exports.NgCastService); - 'use strict'; - var mediaJSON$1 = { - 'categories': [] - }; - /** Cleaner UI for demo purposes. */ - var DEMO_MODE = false; - /** @const {string} Media source root URL */ - var MEDIA_SOURCE_ROOT = 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/'; - /** - * Controls if Ads are enabled. Controlled by radio button. - * @type {boolean} - */ - var ENABLE_ADS = false; - /** - * Controls if Live stream is played. Controlled by radio button. - * @type {boolean} - */ - var ENABLE_LIVE = false; - /** - * Buffer to decide if the live indicator should be displayed to show that - * playback is at the playback head. - * @const {number} - */ - var LIVE_INDICATOR_BUFFER = 50; - /** - * Width of progress bar in pixels. - * @const {number} - */ - var PROGRESS_BAR_WIDTH = 700; - /** - * Time in milliseconds for minimal progress update. - * @const {number} - */ - var TIMER_STEP = 1000; - /** - * Cast volume upon initial connection. - * @const {number} - */ - var DEFAULT_VOLUME = 0.5; - /** - * Height, in pixels, of volume bar. - * @const {number} - */ - var FULL_VOLUME_HEIGHT = 100; - /** @enum {string} Constants of states for media for both local and remote playback */ - var PLAYER_STATE = { - // No media is loaded into the player. For remote playback, maps to - // the PlayerState.IDLE state. - IDLE: 'IDLE', - // Player is in PLAY mode but not actively playing content. For remote - // playback, maps to the PlayerState.BUFFERING state. - BUFFERING: 'BUFFERING', - // The media is loaded but not playing. - LOADED: 'LOADED', - // The media is playing. For remote playback, maps to the PlayerState.PLAYING state. - PLAYING: 'PLAYING', - // The media is paused. For remote playback, maps to the PlayerState.PAUSED state. - PAUSED: 'PAUSED' - }; - /** - * Cast player object - * Main variables: - * - PlayerHandler object for handling media playback - * - Cast player variables for controlling Cast mode media playback - * - Current media variables for transition between Cast and local modes - * - Current ad variables for controlling UI based on ad playback - * - Current live variables for controlling UI based on ad playback - * @struct @constructor - */ - var CastPlayer = function () { - /** @type {PlayerHandler} Delegation proxy for media playback */ - this.playerHandler = new PlayerHandler(this); - /** @type {PLAYER_STATE} A state for media playback */ - this.playerState = PLAYER_STATE.IDLE; - /** - * @type {PLAYER_STATE} Player state before switching between local and - * remote playback. - */ - this.playerStateBeforeSwitch = null; - /* Cast player variables */ - /** @type {cast.framework.RemotePlayer} */ - this.remotePlayer = null; - /** @type {cast.framework.RemotePlayerController} */ - this.remotePlayerController = null; - /* Local+Remote player variables */ - /** @type {number} A number for current time in seconds. Maintained in media time. */ - this.currentMediaTime = 0; - /** - * @type {?number} A number for current duration in seconds. Maintained in media time. - * Null if duration should not be shown. - */ - this.mediaDuration = -1; - /** @type {?number} A timer for tracking progress of media */ - this.timer = null; - /** @type {function()} Listener for handling current time increments */ - this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this); - /** @type {function()} Listener to be added/removed for the seek action */ - this.seekMediaListener = this.seekMedia.bind(this); - /* Local player variables */ - /** @type {number} A number for current media index */ - this.currentMediaIndex = 0; - /** @type {?Object} media contents from JSON */ - this.mediaContents = null; - /** @type {boolean} Fullscreen mode on/off */ - this.fullscreen = false; - /* Remote Player variables */ - /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */ - this.mediaInfo = null; - /* Ad variables */ - /** - * @type {?number} The time in seconds when the break clip becomes skippable. - * 5 means that the end user can skip this break clip after 5 seconds. If - * negative or not defined, it means that the current break clip is not skippable. - */ - this.whenSkippable = null; - /* Live variables */ - /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */ - this.liveSeekableRange = null; - /** @type {boolean} Remote player is playing live content. */ - this.isLiveContent = false; - this.setupLocalPlayer(); - this.addVideoThumbs(); - this.initializeUI(); - }; - CastPlayer.prototype.initializeCastPlayer = function () { - var options = {}; - // Set the receiver application ID to your own (created in the - // Google Cast Developer Console), or optionally - // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID - options.receiverApplicationId = 'C0868879'; - // Auto join policy can be one of the following three: - // ORIGIN_SCOPED - Auto connect from same appId and page origin - // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab - // PAGE_SCOPED - No auto connect - options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED; - cast.framework.CastContext.getInstance().setOptions(options); - this.remotePlayer = new cast.framework.RemotePlayer(); - this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, function (e) { - this.switchPlayer(e.value); - }.bind(this)); - }; - /** - * Switch between the remote and local players. - */ - CastPlayer.prototype.switchPlayer = function () { - this.playerStateBeforeSwitch = this.playerState; - this.stopProgressTimer(); - this.resetVolumeSlider(); - // Session is active - if (cast && cast.framework && this.remotePlayer.isConnected) { - // Pause local playback - this.playerHandler.pause(); - this.setupRemotePlayer(); - } - else { - this.setupLocalPlayer(); - } - }; - /** - * PlayerHandler - * - * This is a handler through which the application will interact - * with both the RemotePlayer and LocalPlayer. Combining these two into - * one interface is one approach to the dual-player nature of a Cast - * Chrome application. Otherwise, the state of the RemotePlayer can be - * queried at any time to decide whether to interact with the local - * or remote players. - * - * To set the player used, implement the following methods for a target object - * and call setTarget(target). - * - * Methods to implement: - * - play() - * - pause() - * - stop() - * - seekTo(time) - * - load(mediaIndex) - * - isMediaLoaded(mediaIndex) - * - prepareToPlay() - * - getMediaDuration() - * - getCurrentMediaTime() - * - setVolume(volumeSliderPosition) - * - mute() - * - unMute() - * - isMuted() - * - updateDisplay() - * - updateCurrentTimeDisplay() - * - updateDurationDisplay() - * - setTimeString(element, time) - */ - var PlayerHandler = function (castPlayer) { - this.target = {}; - this.setTarget = function (target) { - this.target = target; - }; - this.play = function () { - if (castPlayer.playerState == PLAYER_STATE.IDLE || - !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) { - this.load(castPlayer.currentMediaIndex); - return; - } - castPlayer.playerState = PLAYER_STATE.PLAYING; - this.target.play(); - document.getElementById('play').style.display = 'none'; - document.getElementById('pause').style.display = 'block'; - }; - this.pause = function () { - this.target.pause(); - castPlayer.playerState = PLAYER_STATE.PAUSED; - document.getElementById('play').style.display = 'block'; - document.getElementById('pause').style.display = 'none'; - }; - this.stop = function () { - castPlayer.playerState = PLAYER_STATE.IDLE; - this.target.stop(); - }; - this.load = function (mediaIndex) { - if (mediaIndex === void 0) { mediaIndex = null; } - if (!mediaIndex) { - mediaIndex = castPlayer.currentMediaIndex; - } - castPlayer.playerState = PLAYER_STATE.BUFFERING; - this.target.load(mediaIndex); - }; - /** - * Check if media has been loaded on the target player. - * @param {number?} mediaIndex The desired media index. If null, verify if - * any media is loaded. - */ - this.isMediaLoaded = function (mediaIndex) { - return this.target.isMediaLoaded(mediaIndex); - }; - /** - * Called after media has been successfully loaded and is ready to start playback. - * When local, will start playing the video, start the timer, and update the UI. - * When remote, will set the UI to PLAYING and start the timer to update the - * UI based on remote playback. - */ - this.prepareToPlay = function () { - castPlayer.mediaDuration = this.getMediaDuration(); - castPlayer.playerHandler.updateDurationDisplay(); - castPlayer.playerState = PLAYER_STATE.LOADED; - this.play(); - castPlayer.startProgressTimer(); - this.updateDisplay(); - }; - this.getCurrentMediaTime = function () { - return this.target.getCurrentMediaTime(); - }; - this.getMediaDuration = function () { - return this.target.getMediaDuration(); - }; - this.updateDisplay = function () { - // Update local variables - this.currentMediaTime = this.target.getCurrentMediaTime(); - this.mediaDuration = this.target.getMediaDuration(); - this.target.updateDisplay(); - }; - this.updateCurrentTimeDisplay = function () { - this.target.updateCurrentTimeDisplay(); - }; - this.updateDurationDisplay = function () { - this.target.updateDurationDisplay(); - }; - /** - * Determines the correct time string (media or clock) and sets it for the given element. - */ - this.setTimeString = function (element, time) { - this.target.setTimeString(element, time); - }; - this.setVolume = function (volumeSliderPosition) { - this.target.setVolume(volumeSliderPosition); - }; - this.mute = function () { - this.target.mute(); - document.getElementById('audio_on').style.display = 'none'; - document.getElementById('audio_off').style.display = 'block'; - }; - this.unMute = function () { - this.target.unMute(); - document.getElementById('audio_on').style.display = 'block'; - document.getElementById('audio_off').style.display = 'none'; - }; - this.isMuted = function () { - return this.target.isMuted(); - }; - this.seekTo = function (time) { - this.target.seekTo(time); - }; - }; - /** - * Set the PlayerHandler target to use the video-element player - */ - CastPlayer.prototype.setupLocalPlayer = function () { - // Cleanup remote player UI - var live_indicator = document.getElementById('live_indicator'); - if (live_indicator && live_indicator.style && live_indicator.style.display) { - live_indicator.style.display = 'none'; - } - this.removeAdMarkers(); - document.getElementById('skip').style.display = 'none'; - var localPlayer = document.getElementById('video_element'); - localPlayer.addEventListener('loadeddata', this.onMediaLoadedLocally.bind(this)); - // This object will implement PlayerHandler callbacks with localPlayer - var playerTarget = {}; - playerTarget.play = function () { - localPlayer.play(); - var vi = document.getElementById('video_image'); - vi.style.display = 'none'; - localPlayer.style.display = 'block'; - }; - playerTarget.pause = function () { - localPlayer.pause(); - }; - playerTarget.stop = function () { - localPlayer.stop(); - }; - playerTarget.load = function (mediaIndex) { - localPlayer.src = this.mediaContents[mediaIndex]['sources'][0]; - localPlayer.load(); - }.bind(this); - playerTarget.isMediaLoaded = function (mediaIndex) { - if (!mediaIndex) { - return (localPlayer.src !== null && localPlayer.src !== ""); - } - else { - return (localPlayer.src == this.mediaContents[mediaIndex]['sources'][0]); - } - }.bind(this); - playerTarget.getCurrentMediaTime = function () { - return localPlayer.currentTime; - }; - playerTarget.getMediaDuration = function () { - return localPlayer.duration; - }; - playerTarget.updateDisplay = function () { - // playerstate view - document.getElementById('playerstate').style.display = 'none'; - document.getElementById('playerstatebg').style.display = 'none'; - document.getElementById('video_image_overlay').style.display = 'none'; - // media_info view - document.getElementById('media_title').innerHTML = - castPlayer.mediaContents[castPlayer.currentMediaIndex]['title']; - document.getElementById('media_subtitle').innerHTML = - castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle']; - }; - playerTarget.updateCurrentTimeDisplay = function () { - // Increment for local playback - this.currentMediaTime += 1; - this.playerHandler.setTimeString(document.getElementById('currentTime'), this.currentMediaTime); - }.bind(this); - playerTarget.updateDurationDisplay = function () { - this.playerHandler.setTimeString(document.getElementById('duration'), this.mediaDuration); - }.bind(this); - playerTarget.setTimeString = function (element, time) { - var currentTimeString = this.getMediaTimeString(time); - if (currentTimeString !== null) { - element.style.display = ''; - element.innerHTML = currentTimeString; - } - else { - element.style.display = 'none'; - } - }.bind(this); - playerTarget.setVolume = function (volumeSliderPosition) { - localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ? - volumeSliderPosition / FULL_VOLUME_HEIGHT : 1; - var p = document.getElementById('audio_bg_level'); - p.style.height = volumeSliderPosition + 'px'; - p.style.marginTop = -volumeSliderPosition + 'px'; - }; - playerTarget.mute = function () { - localPlayer.muted = true; - }; - playerTarget.unMute = function () { - localPlayer.muted = false; - }; - playerTarget.isMuted = function () { - return localPlayer.muted; - }; - playerTarget.seekTo = function (time) { - localPlayer.currentTime = time; - }; - this.playerHandler.setTarget(playerTarget); - this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT); - this.showFullscreenButton(); - this.enableProgressBar(true); - if (this.currentMediaTime > 0) { - this.playerHandler.load(); - this.playerHandler.play(); - } - }; - /** - * Set the PlayerHandler target to use the remote player - * Add event listeners for player changes which may occur outside sender app. - */ - CastPlayer.prototype.setupRemotePlayer = function () { - // Triggers when the media info or the player state changes - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED, function (event) { - var session = cast.framework.CastContext.getInstance().getCurrentSession(); - if (!session) { - this.mediaInfo = null; - this.isLiveContent = false; - this.playerHandler.updateDisplay(); - return; - } - var media = session.getMediaSession(); - if (!media) { - this.mediaInfo = null; - this.isLiveContent = false; - this.playerHandler.updateDisplay(); - return; - } - this.mediaInfo = media.media; - if (this.mediaInfo) { - this.isLiveContent = (this.mediaInfo.streamType == - chrome.cast.media.StreamType.LIVE); - } - else { - this.isLiveContent = false; - } - if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) { - this.playerHandler.prepareToPlay(); - } - this.removeAdMarkers(); - this.updateAdMarkers(); - this.playerHandler.updateDisplay(); - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED, function (event) { - this.enableProgressBar(event.value); - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, function () { - if (this.remotePlayer.isPaused) { - this.playerHandler.pause(); - } - else if (this.playerState !== PLAYER_STATE.PLAYING) { - // If currently not playing, start to play. - // This occurs if starting to play from local, but this check is - // required if the state is changed remotely. - this.playerHandler.play(); - } - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED, function () { - if (this.remotePlayer.isMuted) { - this.playerHandler.mute(); - } - else { - this.playerHandler.unMute(); - } - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED, function () { - var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; - var p = document.getElementById('audio_bg_level'); - p.style.height = newVolume + 'px'; - p.style.marginTop = -newVolume + 'px'; - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED, function (event) { - this.isPlayingBreak(event.value); - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED, function (event) { - this.onWhenSkippableChanged(event.value); - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED, function (event) { - this.onCurrentBreakClipTimeChanged(event.value); - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED, function (event) { - this.onBreakClipIdChanged(event.value); - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED, function (event) { - console.log('LIVE_SEEKABLE_RANGE_CHANGED'); - this.liveSeekableRange = event.value; - }.bind(this)); - // This object will implement PlayerHandler callbacks with - // remotePlayerController, and makes necessary UI updates specific - // to remote playback. - var playerTarget = {}; - playerTarget.play = function () { - if (this.remotePlayer.isPaused) { - this.remotePlayerController.playOrPause(); - } - var vi = document.getElementById('video_image'); - vi.style.display = ''; - var localPlayer = document.getElementById('video_element'); - localPlayer.style.display = 'none'; - }.bind(this); - playerTarget.pause = function () { - if (!this.remotePlayer.isPaused) { - this.remotePlayerController.playOrPause(); - } - }.bind(this); - playerTarget.stop = function () { - this.remotePlayerController.stop(); - }.bind(this); - // Load request for local -> remote - playerTarget.load = function (mediaIndex) { - console.log('Loading...' + this.mediaContents[mediaIndex]['title']); - var mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4'); - mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED; - mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata(); - mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title']; - mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle']; - mediaInfo.metadata.images = [{ - 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'] - }]; - var request = new chrome.cast.media.LoadRequest(mediaInfo); - request.currentTime = this.currentMediaTime; - if (ENABLE_ADS) { - // Add sample breaks and breakClips. - mediaInfo.breakClips = breakClipsJSON; - mediaInfo.breaks = breaksJSON; - } - else if (ENABLE_LIVE) { - // Change the streamType and add live specific metadata. - mediaInfo.streamType = chrome.cast.media.StreamType.LIVE; - // TODO: Set the metadata on the receiver side in your implementation. - // startAbsoluteTime and sectionStartTimeInMedia will be set for you. - // See https://developers.google.com/cast/docs/caf_receiver/live. - // TODO: Start time, is a fake timestamp. Use correct values for your implementation. - var currentTime = new Date(); - // Convert from milliseconds to seconds. - currentTime = currentTime / 1000; - var sectionStartAbsoluteTime = currentTime; - // Duration should be -1 for live streams. - mediaInfo.duration = -1; - // TODO: Set on the receiver for your implementation. - mediaInfo.startAbsoluteTime = currentTime; - mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime; - // TODO: Set on the receiver for your implementation. - mediaInfo.metadata.sectionStartTimeInMedia = 0; - mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration']; - var item = new chrome.cast.media.QueueItem(mediaInfo); - request.queueData = new chrome.cast.media.QueueData(); - request.queueData.items = [item]; - request.queueData.name = "Sample Queue for Live"; - } - // Do not immediately start playing if the player was previously PAUSED. - if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) { - request.autoplay = false; - } - else { - request.autoplay = true; - } - cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(function () { - console.log('Remote media loaded'); - }.bind(this), function (errorCode) { - this.playerState = PLAYER_STATE.IDLE; - console.log('Remote media load error: ' + - CastPlayer.getErrorMessage(errorCode)); - this.playerHandler.updateDisplay(); - }.bind(this)); - }.bind(this); - playerTarget.isMediaLoaded = function (mediaIndex) { - var session = cast.framework.CastContext.getInstance().getCurrentSession(); - if (!session) - return false; - var media = session.getMediaSession(); - if (!media) - return false; - if (media.playerState == PLAYER_STATE.IDLE) { - return false; - } - // No need to verify local mediaIndex content. - return true; - }.bind(this); - /** - * @return {number?} Current media time for the content. Always returns - * media time even if in clock time (conversion done when displaying). - */ - playerTarget.getCurrentMediaTime = function () { - if (this.isLiveContent && this.mediaInfo.metadata && - this.mediaInfo.metadata.sectionStartTimeInMedia) { - return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia; - } - else { - // VOD and live scenerios where live metadata is not provided. - return this.remotePlayer.currentTime; - } - }.bind(this); - /** - * @return {number?} media time duration for the content. Always returns - * media time even if in clock time (conversion done when displaying). - */ - playerTarget.getMediaDuration = function () { - if (this.isLiveContent) { - // Scenerios when live metadata is not provided. - if (this.mediaInfo.metadata == undefined || - this.mediaInfo.metadata.sectionDuration == undefined || - this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) { - return null; - } - return this.mediaInfo.metadata.sectionDuration; - } - else { - return this.remotePlayer.duration; - } - }.bind(this); - playerTarget.updateDisplay = function () { - var castSession = cast.framework.CastContext.getInstance().getCurrentSession(); - if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) { - var media = castSession.getMediaSession(); - var mediaInfo = media.media; - // image placeholder for video view - var vi = document.getElementById('video_image'); - if (mediaInfo.metadata && mediaInfo.metadata.images && - mediaInfo.metadata.images.length > 0) { - vi.src = mediaInfo.metadata.images[0].url; - } - // playerstate view - document.getElementById('playerstate').style.display = 'block'; - document.getElementById('playerstatebg').style.display = 'block'; - document.getElementById('video_image_overlay').style.display = 'block'; - var mediaTitle = ''; - var mediaEpisodeTitle = ''; - var mediaSubtitle = ''; - if (mediaInfo.metadata) { - mediaTitle = mediaInfo.metadata.title; - mediaEpisodeTitle = mediaInfo.metadata.episodeTitle; - // Append episode title if present - mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle; - // Do not display mediaTitle if not defined. - mediaTitle = (mediaTitle) ? mediaTitle + ' ' : ''; - mediaSubtitle = mediaInfo.metadata.subtitle; - mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : ''; - } - if (DEMO_MODE) { - document.getElementById('playerstate').innerHTML = - (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast'; - // media_info view - document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video'); - document.getElementById('media_subtitle').innerHTML = ''; - } - else { - document.getElementById('playerstate').innerHTML = - mediaTitle + media.playerState + ' on ' + - castSession.getCastDevice().friendlyName; - // media_info view - document.getElementById('media_title').innerHTML = mediaTitle; - document.getElementById('media_subtitle').innerHTML = mediaSubtitle; - } - // live information - if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) { - this.liveSeekableRange = media.liveSeekableRange; - var live_indicator = document.getElementById('live_indicator'); - live_indicator.style.display = 'block'; - // Display indicator if current time is close to the end of - // the seekable range. - if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) { - live_indicator.src = "imagefiles/live_indicator_active.png"; - } - else { - live_indicator.src = "imagefiles/live_indicator_inactive.png"; - } - } - else { - document.getElementById('live_indicator').style.display = 'none'; - } - } - else { - // playerstate view - document.getElementById('playerstate').style.display = 'none'; - document.getElementById('playerstatebg').style.display = 'none'; - document.getElementById('video_image_overlay').style.display = 'none'; - // media_info view - document.getElementById('media_title').innerHTML = ""; - document.getElementById('media_subtitle').innerHTML = ""; - } - }.bind(this); - playerTarget.updateCurrentTimeDisplay = function () { - this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime()); - }.bind(this); - playerTarget.updateDurationDisplay = function () { - this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration()); - }.bind(this); - playerTarget.setTimeString = function (element, time) { - var currentTimeString = this.getMediaTimeString(time); - if (this.isLiveContent) { - if (currentTimeString == null) { - element.style.display = 'none'; - return; - } - // clock time - if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) { - element.style.display = 'flex'; - element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime); - } - else { - // media time - element.style.display = 'flex'; - element.innerHTML = currentTimeString; - } - } - else { - if (currentTimeString !== null) { - element.style.display = 'flex'; - element.innerHTML = currentTimeString; - } - else { - element.style.display = 'none'; - } - } - }.bind(this); - playerTarget.setVolume = function (volumeSliderPosition) { - var currentVolume = this.remotePlayer.volumeLevel; - var p = document.getElementById('audio_bg_level'); - if (volumeSliderPosition < FULL_VOLUME_HEIGHT) { - p.style.height = volumeSliderPosition + 'px'; - p.style.marginTop = -volumeSliderPosition + 'px'; - currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT; - } - else { - currentVolume = 1; - } - this.remotePlayer.volumeLevel = currentVolume; - this.remotePlayerController.setVolumeLevel(); - }.bind(this); - playerTarget.mute = function () { - if (!this.remotePlayer.isMuted) { - this.remotePlayerController.muteOrUnmute(); - } - }.bind(this); - playerTarget.unMute = function () { - if (this.remotePlayer.isMuted) { - this.remotePlayerController.muteOrUnmute(); - } - }.bind(this); - playerTarget.isMuted = function () { - return this.remotePlayer.isMuted; - }.bind(this); - playerTarget.seekTo = function (time) { - this.remotePlayer.currentTime = time; - this.remotePlayerController.seek(); - }.bind(this); - this.playerHandler.setTarget(playerTarget); - // Setup remote player properties on setup - if (this.remotePlayer.isMuted) { - this.playerHandler.mute(); - } - this.enableProgressBar(this.remotePlayer.canSeek); - // The remote player may have had a volume set from previous playback - var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; - var p = document.getElementById('audio_bg_level'); - p.style.height = currentVolume + 'px'; - p.style.marginTop = -currentVolume + 'px'; - // Show media_control - document.getElementById('media_control').style.opacity = 0.7; - this.hideFullscreenButton(); - // If resuming a session, take the remote properties and continue the existing - // playback. Otherwise, load local content. - if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() == - cast.framework.SessionState.SESSION_RESUMED) { - console.log('Resuming session'); - this.playerHandler.prepareToPlay(); - // New media has been loaded so the previous ad markers should - // be removed. - this.removeAdMarkers(); - this.updateAdMarkers(); - } - else { - this.playerHandler.load(); - } - }; - /** - * Callback when media is loaded in local player - */ - CastPlayer.prototype.onMediaLoadedLocally = function () { - var localPlayer = document.getElementById('video_element'); - localPlayer.currentTime = this.currentMediaTime; - this.playerHandler.prepareToPlay(); - }; - /** - * Select a media content - * @param {number} mediaIndex A number for media index - */ - CastPlayer.prototype.selectMedia = function (mediaIndex) { - console.log('Media index selected: ' + mediaIndex); - this.currentMediaIndex = mediaIndex; - // Clear currentMediaInfo when playing content from the sender. - this.playerHandler.currentMediaInfo = undefined; - // Set video image - var vi = document.getElementById('video_image'); - vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']; - // Reset progress bar - var pi = document.getElementById('progress_indicator'); - pi.style.marginLeft = '0px'; - var progress = document.getElementById('progress'); - progress.style.width = '0px'; - var seekable_window = document.getElementById('seekable_window'); - var unseekable_overlay = document.getElementById('unseekable_overlay'); - seekable_window.style.width = PROGRESS_BAR_WIDTH; - unseekable_overlay.style.width = '0px'; - // Stop timer and reset time displays - this.stopProgressTimer(); - this.currentMediaTime = 0; - this.playerHandler.setTimeString(document.getElementById('currentTime'), 0); - this.playerHandler.setTimeString(document.getElementById('duration'), 0); - this.playerState = PLAYER_STATE.IDLE; - this.playerHandler.play(); - }; - /** - * Media seek function - * @param {Event} event An event object from seek - */ - CastPlayer.prototype.seekMedia = function (event) { - if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) { - console.log('Error - Not seekable'); - return; - } - if (this.isLiveContent && !this.liveSeekableRange) { - console.log('Live content has no seekable range.'); - return; - } - var position = parseInt(event.offsetX, 10); - var pi = document.getElementById('progress_indicator'); - var progress = document.getElementById('progress'); - var seekTime = 0; - var pp = 0; - var pw = 0; - if (event.currentTarget.id == 'progress_indicator') { - seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position / - PROGRESS_BAR_WIDTH, 10); - pp = parseInt(pi.style.marginLeft, 10) + position; - pw = parseInt(progress.style.width, 10) + position; - } - else { - seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10); - pp = position; - pw = position; - } - if (this.playerState === PLAYER_STATE.PLAYING || - this.playerState === PLAYER_STATE.PAUSED) { - this.currentMediaTime = seekTime; - progress.style.width = pw + 'px'; - pi.style.marginLeft = pp + 'px'; - } - if (this.isLiveContent) { - seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia; - } - this.playerHandler.seekTo(seekTime); - }; - /** - * Set current player volume - * @param {Event} mouseEvent - */ - CastPlayer.prototype.setVolume = function (mouseEvent) { - var p = document.getElementById('audio_bg_level'); - var pos = 0; - if (mouseEvent.currentTarget.id === 'audio_bg_track') { - pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10); - } - else { - pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10); - } - this.playerHandler.setVolume(pos); - }; - /** - * Starts the timer to increment the media progress bar - */ - CastPlayer.prototype.startProgressTimer = function () { - this.stopProgressTimer(); - // Start progress timer - this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP); - }; - /** - * Stops the timer to increment the media progress bar - */ - CastPlayer.prototype.stopProgressTimer = function () { - if (this.timer) { - clearInterval(this.timer); - this.timer = null; - } - }; - /** - * Increment media current time depending on remote or local playback - */ - CastPlayer.prototype.incrementMediaTime = function () { - // First sync with the current player's time - this.currentMediaTime = this.playerHandler.getCurrentMediaTime(); - this.mediaDuration = this.playerHandler.getMediaDuration(); - this.playerHandler.updateDurationDisplay(); - if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) { - this.playerHandler.updateCurrentTimeDisplay(); - this.updateProgressBarByTimer(); - } - else if (this.mediaDuration > 0) { - this.endPlayback(); - } - }; - /** - * Update progress bar and currentTime based on timer - */ - CastPlayer.prototype.updateProgressBarByTimer = function () { - var progressBar = document.getElementById('progress'); - var pi = document.getElementById('progress_indicator'); - // Live situation where the progress and duration is unknown. - if (this.mediaDuration == null) { - if (!this.isLiveContent) { - console.log('Error - Duration is not defined for a VOD stream.'); - } - progressBar.style.width = '0px'; - var skip = document.getElementById('skip'); - if (skip && skip.style && skip.style.display) { - skip.style.display = 'none'; - } - pi.style.display = 'none'; - var seekable_window_1 = document.getElementById('seekable_window'); - if (seekable_window_1 && seekable_window_1.style && seekable_window_1.style.width) - seekable_window_1.style.width = '0px'; - var unseekable_overlay_1 = document.getElementById('unseekable_overlay'); - if (unseekable_overlay_1 && unseekable_overlay_1.style && unseekable_overlay_1.style.width) - unseekable_overlay_1.style.width = '0px'; - return; - } - else { - pi.style.display = ''; - } - if (isNaN(parseInt(progressBar.style.width, 10))) { - progressBar.style.width = '0px'; - } - // Prevent indicator from exceeding the max width. Happens during - // short media when each progress step is large - var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration); - if (pp > PROGRESS_BAR_WIDTH) { - pp = PROGRESS_BAR_WIDTH; - } - else if (pp < 0) { - pp = 0; - } - progressBar.style.width = pp + 'px'; - pi.style.marginLeft = pp + 'px'; - var seekable_window = document.getElementById('seekable_window'); - var unseekable_overlay = document.getElementById('unseekable_overlay'); - if (this.isLiveContent) { - if (this.liveSeekableRange) { - // Use the liveSeekableRange to draw the seekable and unseekable windows - var seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) - - this.mediaInfo.metadata.sectionStartTimeInMedia; - var seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration); - if (seekableWidth > PROGRESS_BAR_WIDTH) { - seekableWidth = PROGRESS_BAR_WIDTH; - } - else if (seekableWidth < 0) { - seekableWidth = 0; - } - seekable_window.style.width = seekableWidth + 'px'; - var unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) - - this.mediaInfo.metadata.sectionStartTimeInMedia; - var unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration); - if (unseekableWidth > PROGRESS_BAR_WIDTH) { - unseekableWidth = PROGRESS_BAR_WIDTH; - } - else if (unseekableWidth < 0) { - unseekableWidth = 0; - } - unseekable_overlay.style.width = unseekableWidth + 'px'; - } - else { - // Nothing is seekable if no liveSeekableRange - seekable_window.style.width = '0px'; - unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px'; - } - } - else { - // Default to everything seekable - seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px'; - unseekable_overlay.style.width = '0px'; - } - if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) { - this.endPlayback(); - } - }; - /** - * End playback. Called when media ends. - */ - CastPlayer.prototype.endPlayback = function () { - this.currentMediaTime = 0; - this.stopProgressTimer(); - this.playerState = PLAYER_STATE.IDLE; - this.playerHandler.updateDisplay(); - var play = document.getElementById('play'); - if (play && play.style && play.display) - play.style.display = 'block'; - var pause = document.getElementById('pause'); - if (pause && pause.style && pause.style.display) - pause.style.display = 'none'; - }; - /** - * @param {?number} timestamp Linux timestamp - * @return {?string} media time string. Null if time is invalid. - */ - CastPlayer.prototype.getMediaTimeString = function (timestamp) { - if (timestamp == undefined || timestamp == null) { - return null; - } - var isNegative = false; - if (timestamp < 0) { - isNegative = true; - timestamp *= -1; - } - var hours = Math.floor(timestamp / 3600); - var minutes = Math.floor((timestamp - (hours * 3600)) / 60); - var seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60)); - if (hours < 10) - hours = '0' + hours; - if (minutes < 10) - minutes = '0' + minutes; - if (seconds < 10) - seconds = '0' + seconds; - return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds; - }; - /** - * @param {number} timestamp Linux timestamp - * @return {?string} ClockTime string. Null if time is invalid. - */ - CastPlayer.prototype.getClockTimeString = function (timestamp) { - if (!timestamp) - return "0:00:00"; - var date = new Date(timestamp * 1000); - var hours = date.getHours(); - var minutes = date.getMinutes(); - var seconds = date.getSeconds(); - var ampm = hours >= 12 ? 'PM' : 'AM'; - hours = hours % 12; - // Hour '0' should be '12' - hours = hours ? hours : 12; - minutes = ('0' + minutes).slice(-2); - seconds = ('0' + seconds).slice(-2); - var clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm; - return clockTime; - }; - /** - * Updates Ad markers in UI - */ - CastPlayer.prototype.updateAdMarkers = function () { - var castSession = cast.framework.CastContext.getInstance().getCurrentSession(); - if (!castSession) - return; - var media = castSession.getMediaSession(); - if (!media) - return; - var mediaInfo = media.media; - if (!mediaInfo) - return; - var breaks = mediaInfo.breaks; - var contentDuration = mediaInfo.duration; - if (!breaks) { - return; - } - for (var i = 0; i < breaks.length; i++) { - var adBreak = breaks[i]; - // Server-side stitched Ads (embedded) are skipped when the position is beyond - // the duration, so they shouldn't be shown with an ad marker on the UI. - if (adBreak.position > contentDuration && adBreak.isEmbedded) { - continue; - } - // Place marker if not already set in position - if (!document.getElementById('ad' + adBreak.position)) { - var div = document.getElementById('progress'); - div.innerHTML += '
'; - } - } - }; - /** - * Remove Ad markers in UI - */ - CastPlayer.prototype.removeAdMarkers = function () { - document.querySelectorAll('.adMarker').forEach(function (adMarker) { - adMarker.remove(); - }); - }; - /** - * Position of the ad marker from the margin - */ - CastPlayer.prototype.adPositionToMargin = function (position, contentDuration) { - // Post-roll - if (position == -1) { - return PROGRESS_BAR_WIDTH; - } - // Client stitched Ads (not embedded) beyond the duration, will play at the - // end of the content. - if (position > contentDuration) { - return PROGRESS_BAR_WIDTH; - } - // Convert Ad position to margin - return (PROGRESS_BAR_WIDTH * position) / contentDuration; - }; - /** - * Handle BREAK_CLIP_ID_CHANGED event - */ - CastPlayer.prototype.onBreakClipIdChanged = function () { - // Hide skip button when switching to a new breakClip - var skip = document.getElementById('skip'); - if (skip && skip.style && skip.style.display) - skip.style.display = 'none'; - }; - /** - * Disable progress bar if playing a break. - */ - CastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) { - this.enableProgressBar(!isPlayingBreak); - }; - /** - * Handle WHEN_SKIPPABLE_CHANGED event - */ - CastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) { - this.whenSkippable = whenSkippable; - }; - /** - * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event - */ - CastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) { - var skip = document.getElementById('skip'); - // Unskippable - if (this.whenSkippable == undefined || this.whenSkippable < 0) { - // Hide skip button - if (skip && skip.style && skip.style.display) - skip.style.display = 'none'; - } - // Skippable - else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) { - // Show skip button - if (skip && skip.style && skip.style.display) - skip.style.display = 'block'; - } - // Not ready to be skipped - else { - // Hide skip button - if (skip && skip.style && skip.style.display) - skip.style.display = 'none'; - } - }; - /** - * Skip the current Ad - */ - CastPlayer.prototype.skipAd = function () { - this.remotePlayerController.skipAd(); - }; - /** - * Enable/disable progress bar - */ - CastPlayer.prototype.enableProgressBar = function (enable) { - var progress = document.getElementById('progress'); - var progress_indicator = document.getElementById('progress_indicator'); - var seekable_window = document.getElementById('seekable_window'); - if (enable) { - // Enable UI - progress.style.backgroundImage = "url('./assets/imagefiles/timeline_bg_progress.png')"; - progress.style.cursor = "pointer"; - seekable_window.style.cursor = "pointer"; - progress_indicator.style.cursor = "pointer"; - progress_indicator.draggable = true; - // Add listeners - progress.addEventListener('click', this.seekMediaListener); - seekable_window.addEventListener('click', this.seekMediaListener); - progress_indicator.addEventListener('dragend', this.seekMediaListener); - } - else { - // Disable UI - progress.style.backgroundImage = "url('./assets/imagefiles/timeline_bg_buffer.png')"; - progress.style.cursor = "default"; - seekable_window.style.cursor = "default"; - progress_indicator.style.cursor = "default"; - progress_indicator.draggable = false; - // Remove listeners - progress.removeEventListener('click', this.seekMediaListener); - seekable_window.removeEventListener('click', this.seekMediaListener); - progress_indicator.removeEventListener('dragend', this.seekMediaListener); - } - }; - /** - * Request full screen mode - */ - CastPlayer.prototype.requestFullScreen = function () { - // Supports most browsers and their versions - var element = document.getElementById('video_element'); - var requestMethod = element['requestFullScreen'] || element['webkitRequestFullScreen']; - if (requestMethod) { - // Native full screen. - requestMethod.call(element); - console.log('Requested fullscreen'); - } - }; - /** - * Exit full screen mode - */ - CastPlayer.prototype.cancelFullScreen = function () { - // Supports most browsers and their versions. - var requestMethod = document['cancelFullScreen'] || document['webkitCancelFullScreen']; - if (requestMethod) { - requestMethod.call(document); - } - }; - /** - * Exit fullscreen mode by escape - */ - CastPlayer.prototype.fullscreenChangeHandler = function () { - this.fullscreen = !this.fullscreen; - }; - /** - * Show expand/collapse fullscreen button - */ - CastPlayer.prototype.showFullscreenButton = function () { - var fullscreen_expand = document.getElementById('fullscreen_expand'); - var fullscreen_collapse = document.getElementById('fullscreen_collapse'); - if (this.fullscreen) { - if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) - fullscreen_expand.style.display = 'none'; - if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display) - fullscreen_collapse.style.display = 'block'; - } - else { - if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) - fullscreen_expand.style.display = 'block'; - if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display) - fullscreen_collapse.style.display = 'none'; - } - }; - /** - * Hide expand/collapse fullscreen button - */ - CastPlayer.prototype.hideFullscreenButton = function () { - var fullscreen_expand = document.getElementById('fullscreen_expand'); - var fullscreen_collapse = document.getElementById('fullscreen_collapse'); - if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) - fullscreen_expand.style.display = 'none'; - if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display) - fullscreen_collapse.style.display = 'none'; - }; - /** - * Show the media control - */ - CastPlayer.prototype.showMediaControl = function () { - var media_control = document.getElementById('media_control'); - if (media_control && media_control.style && media_control.opacity) - media_control.style.opacity = 0.7; - }; - /** - * Hide the media control - */ - CastPlayer.prototype.hideMediaControl = function () { - if (cast && cast.framework && cast.framework.CastContext) { - var context = cast.framework.CastContext.getInstance(); - if (context && context.getCurrentSession()) { - // Do not hide controls during an active cast session. - document.getElementById('media_control').style.opacity = 0.7; - } - else { - document.getElementById('media_control').style.opacity = 0; - } - } - }; - /** - * Show the volume slider - */ - CastPlayer.prototype.showVolumeSlider = function () { - if (!this.playerHandler.isMuted()) { - document.getElementById('audio_bg').style.opacity = 1; - document.getElementById('audio_bg_track').style.opacity = 1; - document.getElementById('audio_bg_level').style.opacity = 1; - document.getElementById('audio_indicator').style.opacity = 1; - } - }; - /** - * Hide the volume slider - */ - CastPlayer.prototype.hideVolumeSlider = function () { - document.getElementById('audio_bg').style.opacity = 0; - document.getElementById('audio_bg_track').style.opacity = 0; - document.getElementById('audio_bg_level').style.opacity = 0; - document.getElementById('audio_indicator').style.opacity = 0; - }; - /** - * Reset the volume slider - */ - CastPlayer.prototype.resetVolumeSlider = function () { - var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight; - var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight; - document.getElementById('audio_bg_level').style.height = - defaultVolumeSliderHeight + 'px'; - document.getElementById('audio_on').style.display = 'block'; - document.getElementById('audio_off').style.display = 'none'; - }; - /** - * Initialize UI components and add event listeners - */ - CastPlayer.prototype.initializeUI = function () { - // Set initial values for title and subtitle. - if (this.mediaContents && this.mediaContents.length > 0) { - document.getElementById('media_title').innerHTML = - this.mediaContents[0]['title']; - document.getElementById('media_subtitle').innerHTML = - this.mediaContents[this.currentMediaIndex]['subtitle']; - } - document.getElementById('seekable_window').addEventListener('click', this.seekMediaListener); - document.getElementById('progress').addEventListener('click', this.seekMediaListener); - document.getElementById('progress_indicator').addEventListener('dragend', this.seekMediaListener); - document.getElementById('skip').addEventListener('click', this.skipAd.bind(this)); - document.getElementById('audio_on').addEventListener('click', this.playerHandler.mute.bind(this.playerHandler)); - document.getElementById('audio_off').addEventListener('click', this.playerHandler.unMute.bind(this.playerHandler)); - document.getElementById('audio_bg').addEventListener('mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_on').addEventListener('mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_level').addEventListener('mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_track').addEventListener('mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_level').addEventListener('click', this.setVolume.bind(this)); - document.getElementById('audio_bg_track').addEventListener('click', this.setVolume.bind(this)); - document.getElementById('audio_bg').addEventListener('mouseout', this.hideVolumeSlider.bind(this)); - document.getElementById('audio_on').addEventListener('mouseout', this.hideVolumeSlider.bind(this)); - document.getElementById('main_video').addEventListener('mouseover', this.showMediaControl.bind(this)); - document.getElementById('main_video').addEventListener('mouseout', this.hideMediaControl.bind(this)); - document.getElementById('media_control').addEventListener('mouseover', this.showMediaControl.bind(this)); - document.getElementById('media_control').addEventListener('mouseout', this.hideMediaControl.bind(this)); - document.getElementById('fullscreen_expand').addEventListener('click', this.requestFullScreen.bind(this)); - document.getElementById('fullscreen_collapse').addEventListener('click', this.cancelFullScreen.bind(this)); - document.addEventListener('fullscreenchange', this.fullscreenChangeHandler.bind(this), false); - document.addEventListener('webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false); - // Enable play/pause buttons - document.getElementById('play').addEventListener('click', this.playerHandler.play.bind(this.playerHandler)); - document.getElementById('pause').addEventListener('click', this.playerHandler.pause.bind(this.playerHandler)); - document.getElementById('progress_indicator').draggable = true; - // Set up feature radio buttons - var noneRadio = document.getElementById('none'); - noneRadio.onclick = function () { - ENABLE_LIVE = false; - ENABLE_ADS = false; - console.log("Features have been removed"); - }; - var adsRadio = document.getElementById('ads'); - adsRadio.onclick = function () { - ENABLE_LIVE = false; - ENABLE_ADS = true; - console.log("Ads have been enabled"); - }; - var liveRadio = document.getElementById('live'); - liveRadio.onclick = function () { - ENABLE_LIVE = true; - ENABLE_ADS = false; - console.log("Live has been enabled"); - }; - if (ENABLE_ADS) { - if (ENABLE_LIVE) { - console.error('Only one feature can be enabled at a time. Enabling ads.'); - } - adsRadio.checked = true; - console.log("Ads are enabled"); - } - else if (ENABLE_LIVE) { - liveRadio.checked = true; - console.log("Live is enabled"); - } - else { - noneRadio.checked = true; - console.log("No features are enabled"); - } - }; - /** - * Add video thumbnails div's to UI for media JSON contents - */ - CastPlayer.prototype.addVideoThumbs = function () { - if (mediaJSON$1 && mediaJSON$1['categories'] && mediaJSON$1['categories'].length > 0) { - this.mediaContents = mediaJSON$1['categories'][0]['videos']; - var ni = document.getElementById('carousel'); - var newdiv = null; - var divIdName = null; - for (var i = 0; i < this.mediaContents.length; i++) { - newdiv = document.createElement('div'); - divIdName = 'thumb' + i + 'Div'; - newdiv.setAttribute('id', divIdName); - newdiv.setAttribute('class', 'thumb'); - newdiv.innerHTML = - ''; - newdiv.addEventListener('click', this.selectMedia.bind(this, i)); - ni.appendChild(newdiv); - } - } - }; - /** - * Makes human-readable message from chrome.cast.Error - * @param {chrome.cast.Error} error - * @return {string} error message - */ - CastPlayer.getErrorMessage = function (error) { - switch (error.code) { - case chrome.cast.ErrorCode.API_NOT_INITIALIZED: - return 'The API is not initialized.' + - (error.description ? ' :' + error.description : ''); - case chrome.cast.ErrorCode.CANCEL: - return 'The operation was canceled by the user' + - (error.description ? ' :' + error.description : ''); - case chrome.cast.ErrorCode.CHANNEL_ERROR: - return 'A channel to the receiver is not available.' + - (error.description ? ' :' + error.description : ''); - case chrome.cast.ErrorCode.EXTENSION_MISSING: - return 'The Cast extension is not available.' + - (error.description ? ' :' + error.description : ''); - case chrome.cast.ErrorCode.INVALID_PARAMETER: - return 'The parameters to the operation were not valid.' + - (error.description ? ' :' + error.description : ''); - case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE: - return 'No receiver was compatible with the session request.' + - (error.description ? ' :' + error.description : ''); - case chrome.cast.ErrorCode.SESSION_ERROR: - return 'A session could not be created, or a session was invalid.' + - (error.description ? ' :' + error.description : ''); - case chrome.cast.ErrorCode.TIMEOUT: - return 'The operation timed out.' + - (error.description ? ' :' + error.description : ''); - default: - return error; - } - }; - var castPlayer = new CastPlayer(); - window['__onGCastApiAvailable'] = function (isAvailable) { - if (isAvailable) { - castPlayer.initializeCastPlayer(); - } - }; + exports.NgCastModule = /** @class */ (function () { + function NgCastModule() { + } + return NgCastModule; + }()); + exports.NgCastModule = __decorate([ + core.NgModule({ + schemas: [core.CUSTOM_ELEMENTS_SCHEMA], + imports: [ + common.CommonModule + ], + exports: [exports.ɵa], + providers: [exports.NgCastService], + declarations: [exports.ɵa] + }) + ], exports.NgCastModule); - /** - * Generated bundle index. Do not edit. - */ + // ------ project path -------- | --- lib --- - Object.defineProperty(exports, '__esModule', { value: true }); + /** + * Generated bundle index. Do not edit. + */ + + Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=thinkam.net-ng-cast.umd.js.map diff --git a/dist/bundles/thinkam.net-ng-cast.umd.js.map b/dist/bundles/thinkam.net-ng-cast.umd.js.map index 3ec3b5e..cca924a 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.js.map +++ b/dist/bundles/thinkam.net-ng-cast.umd.js.map @@ -1 +1 @@ -{"version":3,"file":"thinkam.net-ng-cast.umd.js","sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../CastVideos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.stop();\n }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare var mediaJSON: any;\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n \n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID);\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n mediaJSON.categories = categories;\n };\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","'use strict';\n\nvar mediaJSON = { \n 'categories': []\n};\n\n/** Cleaner UI for demo purposes. */\nconst DEMO_MODE = false;\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/';\n\n/**\n * Controls if Ads are enabled. Controlled by radio button.\n * @type {boolean}\n */\nlet ENABLE_ADS = false;\n\n/**\n * Controls if Live stream is played. Controlled by radio button.\n * @type {boolean}\n */\nlet ENABLE_LIVE = false;\n\n/**\n * Buffer to decide if the live indicator should be displayed to show that\n * playback is at the playback head.\n * @const {number}\n */\nconst LIVE_INDICATOR_BUFFER = 50;\n\n/**\n * Width of progress bar in pixels.\n * @const {number}\n */\nconst PROGRESS_BAR_WIDTH = 700;\n\n/**\n * Time in milliseconds for minimal progress update.\n * @const {number}\n */\nconst TIMER_STEP = 1000;\n\n/**\n * Cast volume upon initial connection.\n * @const {number}\n */\nconst DEFAULT_VOLUME = 0.5;\n\n/**\n * Height, in pixels, of volume bar.\n * @const {number}\n */\nconst FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.setupLocalPlayer();\n this.addVideoThumbs();\n this.initializeUI();\n};\n\nCastPlayer.prototype.initializeCastPlayer = function () {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = 'C0868879';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n this.remotePlayer = new cast.framework.RemotePlayer();\n this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer);\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n function (e) {\n this.switchPlayer(e.value);\n }.bind(this)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = function () {\n this.playerStateBeforeSwitch = this.playerState;\n\n this.stopProgressTimer();\n this.resetVolumeSlider();\n\n // Session is active\n if (cast && cast.framework && this.remotePlayer.isConnected) {\n // Pause local playback\n this.playerHandler.pause();\n this.setupRemotePlayer();\n } else {\n this.setupLocalPlayer();\n }\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n this.updateDurationDisplay = function () {\n this.target.updateDurationDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = function () {\n // Cleanup remote player UI\n let live_indicator = document.getElementById('live_indicator');\n if (live_indicator && live_indicator.style && live_indicator.style.display) {\n live_indicator.style.display = 'none';\n }\n\n this.removeAdMarkers();\n document.getElementById('skip').style.display = 'none';\n\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', this.onMediaLoadedLocally.bind(this));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src = this.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n if (!mediaIndex) {\n return (localPlayer.src !== null && localPlayer.src !== \"\");\n } else {\n return (localPlayer.src == this.mediaContents[mediaIndex]['sources'][0]);\n }\n }.bind(this);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplay = function () {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n };\n\n playerTarget.updateCurrentTimeDisplay = function () {\n // Increment for local playback\n this.currentMediaTime += 1;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.currentMediaTime);\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.mediaDuration);\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n if (currentTimeString !== null) {\n element.style.display = '';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n this.playerHandler.setTarget(playerTarget);\n\n this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n this.showFullscreenButton();\n\n this.enableProgressBar(true);\n\n if (this.currentMediaTime > 0) {\n this.playerHandler.load();\n this.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n this.mediaInfo = media.media;\n\n if (this.mediaInfo) {\n this.isLiveContent = (this.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n this.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) {\n this.playerHandler.prepareToPlay();\n }\n\n this.removeAdMarkers();\n this.updateAdMarkers();\n\n this.playerHandler.updateDisplay();\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n this.enableProgressBar(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (this.remotePlayer.isPaused) {\n this.playerHandler.pause();\n } else if (this.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n this.playerHandler.play();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n } else {\n this.playerHandler.unMute();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n this.isPlayingBreak(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n this.onWhenSkippableChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n this.onCurrentBreakClipTimeChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n this.onBreakClipIdChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n this.liveSeekableRange = event.value;\n }.bind(this)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(this);\n\n playerTarget.pause = function () {\n if (!this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n }.bind(this);\n\n playerTarget.stop = function () {\n this.remotePlayerController.stop();\n }.bind(this);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n\n let mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;\n mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata();\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle'];\n mediaInfo.metadata.images = [{\n 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']\n }];\n\n let request = new chrome.cast.media.LoadRequest(mediaInfo);\n request.currentTime = this.currentMediaTime;\n\n if (ENABLE_ADS) {\n // Add sample breaks and breakClips.\n mediaInfo.breakClips = breakClipsJSON;\n mediaInfo.breaks = breaksJSON;\n } else if (ENABLE_LIVE) {\n // Change the streamType and add live specific metadata.\n mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;\n // TODO: Set the metadata on the receiver side in your implementation.\n // startAbsoluteTime and sectionStartTimeInMedia will be set for you.\n // See https://developers.google.com/cast/docs/caf_receiver/live.\n\n // TODO: Start time, is a fake timestamp. Use correct values for your implementation.\n let currentTime = new Date();\n // Convert from milliseconds to seconds.\n currentTime = currentTime / 1000;\n let sectionStartAbsoluteTime = currentTime;\n\n // Duration should be -1 for live streams.\n mediaInfo.duration = -1;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.startAbsoluteTime = currentTime;\n mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.metadata.sectionStartTimeInMedia = 0;\n mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration'];\n\n let item = new chrome.cast.media.QueueItem(mediaInfo);\n request.queueData = new chrome.cast.media.QueueData();\n request.queueData.items = [item];\n request.queueData.name = \"Sample Queue for Live\";\n }\n\n // Do not immediately start playing if the player was previously PAUSED.\n if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) {\n request.autoplay = false;\n } else {\n request.autoplay = true;\n }\n\n cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(\n function () {\n console.log('Remote media loaded');\n }.bind(this),\n function (errorCode) {\n this.playerState = PLAYER_STATE.IDLE;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n this.playerHandler.updateDisplay();\n }.bind(this));\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(this);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (this.isLiveContent && this.mediaInfo.metadata &&\n this.mediaInfo.metadata.sectionStartTimeInMedia) {\n return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return this.remotePlayer.currentTime;\n }\n }.bind(this);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (this.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (this.mediaInfo.metadata == undefined ||\n this.mediaInfo.metadata.sectionDuration == undefined ||\n this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return this.mediaInfo.metadata.sectionDuration;\n } else {\n return this.remotePlayer.duration;\n }\n }.bind(this);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n this.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(this);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime());\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration());\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n\n if (this.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = this.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n this.remotePlayer.volumeLevel = currentVolume;\n this.remotePlayerController.setVolumeLevel();\n }.bind(this);\n\n playerTarget.mute = function () {\n if (!this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.unMute = function () {\n if (this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.isMuted = function () {\n return this.remotePlayer.isMuted;\n }.bind(this);\n\n playerTarget.seekTo = function (time) {\n this.remotePlayer.currentTime = time;\n this.remotePlayerController.seek();\n }.bind(this);\n\n this.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n }\n this.enableProgressBar(this.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n this.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n this.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n this.removeAdMarkers();\n this.updateAdMarkers();\n } else {\n this.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = this.currentMediaTime;\n\n this.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n this.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n this.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n this.stopProgressTimer();\n this.currentMediaTime = 0;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n this.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (this.isLiveContent && !this.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (this.playerState === PLAYER_STATE.PLAYING ||\n this.playerState === PLAYER_STATE.PAUSED) {\n this.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (this.isLiveContent) {\n seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n this.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n this.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n this.stopProgressTimer();\n\n // Start progress timer\n this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n this.currentMediaTime = this.playerHandler.getCurrentMediaTime();\n this.mediaDuration = this.playerHandler.getMediaDuration();\n\n this.playerHandler.updateDurationDisplay();\n\n if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) {\n this.playerHandler.updateCurrentTimeDisplay();\n this.updateProgressBarByTimer();\n } else if (this.mediaDuration > 0) {\n this.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (this.mediaDuration == null) {\n if (!this.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n \n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n \n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (this.isLiveContent) {\n if (this.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) {\n this.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n this.currentMediaTime = 0;\n this.stopProgressTimer();\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n this.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n this.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (this.whenSkippable == undefined || this.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n this.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', this.seekMediaListener);\n seekable_window.addEventListener('click', this.seekMediaListener);\n progress_indicator.addEventListener('dragend', this.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', this.seekMediaListener);\n seekable_window.removeEventListener('click', this.seekMediaListener);\n progress_indicator.removeEventListener('dragend', this.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n this.fullscreen = !this.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (this.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block'; \n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (cast && cast.framework && cast.framework.CastContext) {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!this.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = function () {\n // Set initial values for title and subtitle.\n if (this.mediaContents && this.mediaContents.length > 0) {\n document.getElementById('media_title').innerHTML =\n this.mediaContents[0]['title'];\n\n document.getElementById('media_subtitle').innerHTML =\n this.mediaContents[this.currentMediaIndex]['subtitle'];\n }\n\n document.getElementById('seekable_window').addEventListener(\n 'click', this.seekMediaListener);\n document.getElementById('progress').addEventListener(\n 'click', this.seekMediaListener);\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', this.seekMediaListener);\n document.getElementById('skip').addEventListener(\n 'click', this.skipAd.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'click', this.playerHandler.mute.bind(this.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', this.playerHandler.unMute.bind(this.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('main_video').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('main_video').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', this.requestFullScreen.bind(this));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', this.cancelFullScreen.bind(this));\n document.addEventListener(\n 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n document.addEventListener(\n 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', this.playerHandler.play.bind(this.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', this.playerHandler.pause.bind(this.playerHandler));\n\n document.getElementById('progress_indicator').draggable = true;\n\n // Set up feature radio buttons\n let noneRadio = document.getElementById('none');\n noneRadio.onclick = function () {\n ENABLE_LIVE = false;\n ENABLE_ADS = false;\n console.log(\"Features have been removed\");\n }\n let adsRadio = document.getElementById('ads');\n adsRadio.onclick = function () {\n ENABLE_LIVE = false;\n ENABLE_ADS = true;\n console.log(\"Ads have been enabled\");\n }\n let liveRadio = document.getElementById('live');\n liveRadio.onclick = function () {\n ENABLE_LIVE = true;\n ENABLE_ADS = false;\n console.log(\"Live has been enabled\");\n }\n\n if (ENABLE_ADS) {\n if (ENABLE_LIVE) {\n console.error('Only one feature can be enabled at a time. Enabling ads.');\n }\n adsRadio.checked = true;\n console.log(\"Ads are enabled\");\n } else if (ENABLE_LIVE) {\n liveRadio.checked = true;\n console.log(\"Live is enabled\");\n } else {\n noneRadio.checked = true;\n console.log(\"No features are enabled\");\n }\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (mediaJSON && mediaJSON['categories'] && mediaJSON['categories'].length > 0) {\n this.mediaContents = mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < this.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', this.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nlet castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["NgCastComponent","Component","NgCastService","Subject","Injectable","NgCastModule","NgModule","CUSTOM_ELEMENTS_SCHEMA","CommonModule","mediaJSON"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"thinkam.net-ng-cast.umd.js","sources":["../../CastVideos.js","../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../index.ts","../../thinkam.net-ng-cast.ts"],"sourcesContent":["'use strict';\n\n/** Cleaner UI for demo purposes. */\nconst DEMO_MODE = false;\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/';\n\n/**\n * Controls if Ads are enabled. Controlled by radio button.\n * @type {boolean}\n */\nlet ENABLE_ADS = false;\n\n/**\n * Controls if Live stream is played. Controlled by radio button.\n * @type {boolean}\n */\nlet ENABLE_LIVE = false;\n\n/**\n * Buffer to decide if the live indicator should be displayed to show that\n * playback is at the playback head.\n * @const {number}\n */\nconst LIVE_INDICATOR_BUFFER = 50;\n\n/**\n * Width of progress bar in pixels.\n * @const {number}\n */\nconst PROGRESS_BAR_WIDTH = 700;\n\n/**\n * Time in milliseconds for minimal progress update.\n * @const {number}\n */\nconst TIMER_STEP = 1000;\n\n/**\n * Cast volume upon initial connection.\n * @const {number}\n */\nconst DEFAULT_VOLUME = 0.5;\n\n/**\n * Height, in pixels, of volume bar.\n * @const {number}\n */\nconst FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.setupLocalPlayer();\n this.addVideoThumbs();\n this.initializeUI();\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = function () {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = 'C0868879';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n this.remotePlayer = new cast.framework.RemotePlayer();\n this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer);\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n function (e) {\n this.switchPlayer(e.value);\n }.bind(this)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = function () {\n this.playerStateBeforeSwitch = this.playerState;\n\n this.stopProgressTimer();\n this.resetVolumeSlider();\n\n // Session is active\n if (cast && cast.framework && this.remotePlayer.isConnected) {\n // Pause local playback\n this.playerHandler.pause();\n this.setupRemotePlayer();\n } else {\n this.setupLocalPlayer();\n }\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n this.updateDurationDisplay = function () {\n this.target.updateDurationDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = function () {\n // Cleanup remote player UI\n let live_indicator = document.getElementById('live_indicator');\n if (live_indicator && live_indicator.style && live_indicator.style.display) {\n live_indicator.style.display = 'none';\n }\n\n this.removeAdMarkers();\n document.getElementById('skip').style.display = 'none';\n\n var localPlayer = document.getElementById('video_element');\n if (typeof localPlayer !== 'undefined' && localPlayer)\n localPlayer.addEventListener(\n 'loadeddata', this.onMediaLoadedLocally.bind(this));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src = this.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n if (!mediaIndex) {\n return (localPlayer.src !== null && localPlayer.src !== \"\");\n } else {\n return (localPlayer.src == this.mediaContents[mediaIndex]['sources'][0]);\n }\n }.bind(this);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplay = function () {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n };\n\n playerTarget.updateCurrentTimeDisplay = function () {\n // Increment for local playback\n this.currentMediaTime += 1;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.currentMediaTime);\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.mediaDuration);\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n if (currentTimeString !== null) {\n element.style.display = '';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n if (localPlayer) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n }\n\n var p = document.getElementById('audio_bg_level');\n if (typeof p !== 'undefined' && p) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n }\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n if (localPlayer)\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n this.playerHandler.setTarget(playerTarget);\n\n this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n this.showFullscreenButton();\n\n this.enableProgressBar(true);\n\n if (this.currentMediaTime > 0) {\n this.playerHandler.load();\n this.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n this.mediaInfo = media.media;\n\n if (this.mediaInfo) {\n this.isLiveContent = (this.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n this.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) {\n this.playerHandler.prepareToPlay();\n }\n\n this.removeAdMarkers();\n this.updateAdMarkers();\n\n this.playerHandler.updateDisplay();\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n this.enableProgressBar(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (this.remotePlayer.isPaused) {\n this.playerHandler.pause();\n } else if (this.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n this.playerHandler.play();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n } else {\n this.playerHandler.unMute();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n this.isPlayingBreak(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n this.onWhenSkippableChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n this.onCurrentBreakClipTimeChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n this.onBreakClipIdChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n this.liveSeekableRange = event.value;\n }.bind(this)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(this);\n\n playerTarget.pause = function () {\n if (!this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n }.bind(this);\n\n playerTarget.stop = function () {\n this.remotePlayerController.stop();\n }.bind(this);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n\n let mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;\n mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata();\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle'];\n mediaInfo.metadata.images = [{\n 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']\n }];\n\n let request = new chrome.cast.media.LoadRequest(mediaInfo);\n request.currentTime = this.currentMediaTime;\n\n if (ENABLE_ADS) {\n // Add sample breaks and breakClips.\n mediaInfo.breakClips = breakClipsJSON;\n mediaInfo.breaks = breaksJSON;\n } else if (ENABLE_LIVE) {\n // Change the streamType and add live specific metadata.\n mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;\n // TODO: Set the metadata on the receiver side in your implementation.\n // startAbsoluteTime and sectionStartTimeInMedia will be set for you.\n // See https://developers.google.com/cast/docs/caf_receiver/live.\n\n // TODO: Start time, is a fake timestamp. Use correct values for your implementation.\n let currentTime = new Date();\n // Convert from milliseconds to seconds.\n currentTime = currentTime / 1000;\n let sectionStartAbsoluteTime = currentTime;\n\n // Duration should be -1 for live streams.\n mediaInfo.duration = -1;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.startAbsoluteTime = currentTime;\n mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.metadata.sectionStartTimeInMedia = 0;\n mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration'];\n\n let item = new chrome.cast.media.QueueItem(mediaInfo);\n request.queueData = new chrome.cast.media.QueueData();\n request.queueData.items = [item];\n request.queueData.name = \"Sample Queue for Live\";\n }\n\n // Do not immediately start playing if the player was previously PAUSED.\n if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) {\n request.autoplay = false;\n } else {\n request.autoplay = true;\n }\n\n cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(\n function () {\n console.log('Remote media loaded');\n }.bind(this),\n function (errorCode) {\n this.playerState = PLAYER_STATE.IDLE;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n this.playerHandler.updateDisplay();\n }.bind(this));\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(this);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (this.isLiveContent && this.mediaInfo.metadata &&\n this.mediaInfo.metadata.sectionStartTimeInMedia) {\n return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return this.remotePlayer.currentTime;\n }\n }.bind(this);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (this.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (this.mediaInfo.metadata == undefined ||\n this.mediaInfo.metadata.sectionDuration == undefined ||\n this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return this.mediaInfo.metadata.sectionDuration;\n } else {\n return this.remotePlayer.duration;\n }\n }.bind(this);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n this.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(this);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime());\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration());\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n\n if (this.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = this.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n this.remotePlayer.volumeLevel = currentVolume;\n this.remotePlayerController.setVolumeLevel();\n }.bind(this);\n\n playerTarget.mute = function () {\n if (!this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.unMute = function () {\n if (this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.isMuted = function () {\n return this.remotePlayer.isMuted;\n }.bind(this);\n\n playerTarget.seekTo = function (time) {\n this.remotePlayer.currentTime = time;\n this.remotePlayerController.seek();\n }.bind(this);\n\n this.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n }\n this.enableProgressBar(this.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n this.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n this.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n this.removeAdMarkers();\n this.updateAdMarkers();\n } else {\n this.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = this.currentMediaTime;\n\n this.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n this.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n this.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n this.stopProgressTimer();\n this.currentMediaTime = 0;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n this.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (this.isLiveContent && !this.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (this.playerState === PLAYER_STATE.PLAYING ||\n this.playerState === PLAYER_STATE.PAUSED) {\n this.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (this.isLiveContent) {\n seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n this.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n this.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n this.stopProgressTimer();\n\n // Start progress timer\n this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n this.currentMediaTime = this.playerHandler.getCurrentMediaTime();\n this.mediaDuration = this.playerHandler.getMediaDuration();\n\n this.playerHandler.updateDurationDisplay();\n\n if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) {\n this.playerHandler.updateCurrentTimeDisplay();\n this.updateProgressBarByTimer();\n } else if (this.mediaDuration > 0) {\n this.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (this.mediaDuration == null) {\n if (!this.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n \n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n \n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (this.isLiveContent) {\n if (this.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) {\n this.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n this.currentMediaTime = 0;\n this.stopProgressTimer();\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n this.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n this.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (this.whenSkippable == undefined || this.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n this.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', this.seekMediaListener);\n seekable_window.addEventListener('click', this.seekMediaListener);\n progress_indicator.addEventListener('dragend', this.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', this.seekMediaListener);\n seekable_window.removeEventListener('click', this.seekMediaListener);\n progress_indicator.removeEventListener('dragend', this.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n this.fullscreen = !this.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (this.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block'; \n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!this.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = function () {\n // Set initial values for title and subtitle.\n if (this.mediaContents && this.mediaContents.length > 0) {\n document.getElementById('media_title').innerHTML =\n this.mediaContents[0]['title'];\n\n document.getElementById('media_subtitle').innerHTML =\n this.mediaContents[this.currentMediaIndex]['subtitle'];\n }\n\n document.getElementById('seekable_window').addEventListener(\n 'click', this.seekMediaListener);\n document.getElementById('progress').addEventListener(\n 'click', this.seekMediaListener);\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', this.seekMediaListener);\n document.getElementById('skip').addEventListener(\n 'click', this.skipAd.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'click', this.playerHandler.mute.bind(this.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', this.playerHandler.unMute.bind(this.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n\n let main_video = document.getElementById('main_video');\n if (typeof main_video !== 'undefined' && main_video) {\n main_video.addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n main_video.addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n }\n \n document.getElementById('media_control').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', this.requestFullScreen.bind(this));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', this.cancelFullScreen.bind(this));\n document.addEventListener(\n 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n document.addEventListener(\n 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', this.playerHandler.play.bind(this.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', this.playerHandler.pause.bind(this.playerHandler));\n\n document.getElementById('progress_indicator').draggable = true;\n\n // Set up feature radio buttons\n let noneRadio = document.getElementById('none');\n noneRadio.onclick = function () {\n ENABLE_LIVE = false;\n ENABLE_ADS = false;\n console.log(\"Features have been removed\");\n }\n let adsRadio = document.getElementById('ads');\n adsRadio.onclick = function () {\n ENABLE_LIVE = false;\n ENABLE_ADS = true;\n console.log(\"Ads have been enabled\");\n }\n let liveRadio = document.getElementById('live');\n liveRadio.onclick = function () {\n ENABLE_LIVE = true;\n ENABLE_ADS = false;\n console.log(\"Live has been enabled\");\n }\n\n if (ENABLE_ADS) {\n if (ENABLE_LIVE) {\n console.error('Only one feature can be enabled at a time. Enabling ads.');\n }\n adsRadio.checked = true;\n console.log(\"Ads are enabled\");\n } else if (ENABLE_LIVE) {\n liveRadio.checked = true;\n console.log(\"Live is enabled\");\n } else {\n noneRadio.checked = true;\n console.log(\"No features are enabled\");\n }\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) {\n this.mediaContents = this.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < this.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', this.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID);\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n };\n\n play = () => { \n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n globalThis.CastPlayer.addVideoThumbs();\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n"," // ------ project path -------- | --- lib ---\nimport \"/home/thinker/dev/thinkam/ngCast/CastVideos.js\";\n\nexport * from './ng.cast.module';\nexport * from './shared/ng-cast.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["NgCastComponent","Component","NgCastService","Subject","Injectable","NgCastModule","NgModule","CUSTOM_ELEMENTS_SCHEMA","CommonModule"],"mappings":"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"} \ No newline at end of file diff --git a/dist/bundles/thinkam.net-ng-cast.umd.min.js b/dist/bundles/thinkam.net-ng-cast.umd.min.js index 0b57314..0f2afb3 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.min.js +++ b/dist/bundles/thinkam.net-ng-cast.umd.min.js @@ -1,16 +1,2 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("@angular/common"),require("rxjs")):"function"==typeof define&&define.amd?define("@thinkam.net/ng-cast",["exports","@angular/core","@angular/common","rxjs"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).thinkam=e.thinkam||{},e.thinkam.net=e.thinkam.net||{},e.thinkam.net["ng-cast"]={}),e.ng.core,e.ng.common,e.rxjs)}(this,(function(e,t,i,n){"use strict"; -/*! ***************************************************************************** - Copyright (c) Microsoft Corporation. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */function a(e,t,i,n){var a,s=arguments.length,r=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,i,n);else for(var o=e.length-1;o>=0;o--)(a=e[o])&&(r=(s<3?a(r):s>3?a(t,i,r):a(t,i))||r);return s>3&&r&&Object.defineProperty(t,i,r),r}e.ɵa=function(){function e(e){this.ngCastService=e}return e.prototype.ngOnInit=function(){this.window=window;var e=this.ngCastService;this.window.__onGCastApiAvailable=function(t){t&&e.initializeCastApi()},this.castingStatus=this.ngCastService.getStatus()},e.prototype.openSession=function(){this.ngCastService.discoverDevices()},e.prototype.closeSession=function(){this.ngCastService.stop()},e}(),e.ɵa=a([t.Component({selector:"ng-cast",template:'cast\ncast_connected',styles:[""]})],e.ɵa),e.NgCastService=function(){function e(){var e=this;this.window=window,this.status={casting:!1},this.onInitSuccess=function(){console.log("GCast initialization success")},this.onError=function(e){console.log("GCast initialization failed",e)},this.discoverDevices=function(){var t=e,i=new n.Subject;return e.cast.requestSession((function(e){t.session=e,t.setCasting(!0),i.next("CONNECTED")}),(function(e){t.setCasting(!1),"cancel"===e.code?(t.session=void 0,i.next("CANCEL")):console.error("Error selecting a cast device",e)})),i},this.onMediaDiscovered=function(e){var t=window.document.createElement("script");t.setAttribute("type","text/javascript"),t.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"),window.document.body.appendChild(t),mediaJSON.categories=e},this.play=function(){e.currentMedia.play(null)},this.pause=function(){e.currentMedia.pause(null)},this.stop=function(){e.currentMedia.stop(null)},this.onMediaError=function(e){console.error("Error launching media",e)}}return e.prototype.initializeCastApi=function(){var e=this;this.cast=this.window.chrome.cast;var t=new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID),i=new this.cast.ApiConfig(t,(function(){}),(function(t){e.cast.ReceiverAvailability.AVAILABLE}));this.cast.initialize(i,this.onInitSuccess,this.onError)},e.prototype.setCasting=function(e){this.status.casting=e},e.prototype.getStatus=function(){return this.status},e}(),e.NgCastService=a([t.Injectable()],e.NgCastService),e.NgCastModule=function(){},e.NgCastModule=a([t.NgModule({schemas:[t.CUSTOM_ELEMENTS_SCHEMA],imports:[i.CommonModule],exports:[e.ɵa],providers:[e.NgCastService],declarations:[e.ɵa]})],e.NgCastModule);var s={categories:[]},r="http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/",o=!1,l=!1,d=700,c=100,u="IDLE",m="BUFFERING",y="LOADED",h="PLAYING",p="PAUSED",g=function(){this.playerHandler=new f(this),this.playerState=u,this.playerStateBeforeSwitch=null,this.remotePlayer=null,this.remotePlayerController=null,this.currentMediaTime=0,this.mediaDuration=-1,this.timer=null,this.incrementMediaTimeHandler=this.incrementMediaTime.bind(this),this.seekMediaListener=this.seekMedia.bind(this),this.currentMediaIndex=0,this.mediaContents=null,this.fullscreen=!1,this.mediaInfo=null,this.whenSkippable=null,this.liveSeekableRange=null,this.isLiveContent=!1,this.setupLocalPlayer(),this.addVideoThumbs(),this.initializeUI()};g.prototype.initializeCastPlayer=function(){var e={receiverApplicationId:"C0868879"};e.autoJoinPolicy=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,cast.framework.CastContext.getInstance().setOptions(e),this.remotePlayer=new cast.framework.RemotePlayer,this.remotePlayerController=new cast.framework.RemotePlayerController(this.remotePlayer),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,function(e){this.switchPlayer(e.value)}.bind(this))},g.prototype.switchPlayer=function(){this.playerStateBeforeSwitch=this.playerState,this.stopProgressTimer(),this.resetVolumeSlider(),cast&&cast.framework&&this.remotePlayer.isConnected?(this.playerHandler.pause(),this.setupRemotePlayer()):this.setupLocalPlayer()};var f=function(e){this.target={},this.setTarget=function(e){this.target=e},this.play=function(){e.playerState!=u&&this.target.isMediaLoaded(e.currentMediaIndex)?(e.playerState=h,this.target.play(),document.getElementById("play").style.display="none",document.getElementById("pause").style.display="block"):this.load(e.currentMediaIndex)},this.pause=function(){this.target.pause(),e.playerState=p,document.getElementById("play").style.display="block",document.getElementById("pause").style.display="none"},this.stop=function(){e.playerState=u,this.target.stop()},this.load=function(t){void 0===t&&(t=null),t||(t=e.currentMediaIndex),e.playerState=m,this.target.load(t)},this.isMediaLoaded=function(e){return this.target.isMediaLoaded(e)},this.prepareToPlay=function(){e.mediaDuration=this.getMediaDuration(),e.playerHandler.updateDurationDisplay(),e.playerState=y,this.play(),e.startProgressTimer(),this.updateDisplay()},this.getCurrentMediaTime=function(){return this.target.getCurrentMediaTime()},this.getMediaDuration=function(){return this.target.getMediaDuration()},this.updateDisplay=function(){this.currentMediaTime=this.target.getCurrentMediaTime(),this.mediaDuration=this.target.getMediaDuration(),this.target.updateDisplay()},this.updateCurrentTimeDisplay=function(){this.target.updateCurrentTimeDisplay()},this.updateDurationDisplay=function(){this.target.updateDurationDisplay()},this.setTimeString=function(e,t){this.target.setTimeString(e,t)},this.setVolume=function(e){this.target.setVolume(e)},this.mute=function(){this.target.mute(),document.getElementById("audio_on").style.display="none",document.getElementById("audio_off").style.display="block"},this.unMute=function(){this.target.unMute(),document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},this.isMuted=function(){return this.target.isMuted()},this.seekTo=function(e){this.target.seekTo(e)}};g.prototype.setupLocalPlayer=function(){var e=document.getElementById("live_indicator");e&&e.style&&e.style.display&&(e.style.display="none"),this.removeAdMarkers(),document.getElementById("skip").style.display="none";var t=document.getElementById("video_element");t.addEventListener("loadeddata",this.onMediaLoadedLocally.bind(this));var i={play:function(){t.play(),document.getElementById("video_image").style.display="none",t.style.display="block"},pause:function(){t.pause()},stop:function(){t.stop()}};i.load=function(e){t.src=this.mediaContents[e].sources[0],t.load()}.bind(this),i.isMediaLoaded=function(e){return e?t.src==this.mediaContents[e].sources[0]:null!==t.src&&""!==t.src}.bind(this),i.getCurrentMediaTime=function(){return t.currentTime},i.getMediaDuration=function(){return t.duration},i.updateDisplay=function(){document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none",document.getElementById("media_title").innerHTML=E.mediaContents[E.currentMediaIndex].title,document.getElementById("media_subtitle").innerHTML=E.mediaContents[E.currentMediaIndex].subtitle},i.updateCurrentTimeDisplay=function(){this.currentMediaTime+=1,this.playerHandler.setTimeString(document.getElementById("currentTime"),this.currentMediaTime)}.bind(this),i.updateDurationDisplay=function(){this.playerHandler.setTimeString(document.getElementById("duration"),this.mediaDuration)}.bind(this),i.setTimeString=function(e,t){var i=this.getMediaTimeString(t);null!==i?(e.style.display="",e.innerHTML=i):e.style.display="none"}.bind(this),i.setVolume=function(e){t.volume=e0&&(this.playerHandler.load(),this.playerHandler.play())},g.prototype.setupRemotePlayer=function(){this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,function(e){var t=cast.framework.CastContext.getInstance().getCurrentSession();if(!t)return this.mediaInfo=null,this.isLiveContent=!1,void this.playerHandler.updateDisplay();var i=t.getMediaSession();if(!i)return this.mediaInfo=null,this.isLiveContent=!1,void this.playerHandler.updateDisplay();this.mediaInfo=i.media,this.mediaInfo?this.isLiveContent=this.mediaInfo.streamType==chrome.cast.media.StreamType.LIVE:this.isLiveContent=!1,i.playerState==h&&this.playerState!==h&&this.playerHandler.prepareToPlay(),this.removeAdMarkers(),this.updateAdMarkers(),this.playerHandler.updateDisplay()}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,function(e){this.enableProgressBar(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,function(){this.remotePlayer.isPaused?this.playerHandler.pause():this.playerState!==h&&this.playerHandler.play()}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,function(){this.remotePlayer.isMuted?this.playerHandler.mute():this.playerHandler.unMute()}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,function(){var e=this.remotePlayer.volumeLevel*c,t=document.getElementById("audio_bg_level");t.style.height=e+"px",t.style.marginTop=-e+"px"}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,function(e){this.isPlayingBreak(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,function(e){this.onWhenSkippableChanged(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,function(e){this.onCurrentBreakClipTimeChanged(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,function(e){this.onBreakClipIdChanged(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,function(e){console.log("LIVE_SEEKABLE_RANGE_CHANGED"),this.liveSeekableRange=e.value}.bind(this));var e={};e.play=function(){this.remotePlayer.isPaused&&this.remotePlayerController.playOrPause(),document.getElementById("video_image").style.display="",document.getElementById("video_element").style.display="none"}.bind(this),e.pause=function(){this.remotePlayer.isPaused||this.remotePlayerController.playOrPause()}.bind(this),e.stop=function(){this.remotePlayerController.stop()}.bind(this),e.load=function(e){console.log("Loading..."+this.mediaContents[e].title);var t=new chrome.cast.media.MediaInfo(this.mediaContents[e].sources[0],"video/mp4");t.streamType=chrome.cast.media.StreamType.BUFFERED,t.metadata=new chrome.cast.media.TvShowMediaMetadata,t.metadata.title=this.mediaContents[e].title,t.metadata.subtitle=this.mediaContents[e].subtitle,t.metadata.images=[{url:r+this.mediaContents[e].thumb}];var i=new chrome.cast.media.LoadRequest(t);if(i.currentTime=this.currentMediaTime,o)t.breakClips=breakClipsJSON,t.breaks=breaksJSON;else if(l){t.streamType=chrome.cast.media.StreamType.LIVE;var n=new Date,a=n/=1e3;t.duration=-1,t.startAbsoluteTime=n,t.metadata.sectionStartAbsoluteTime=a,t.metadata.sectionStartTimeInMedia=0,t.metadata.sectionDuration=this.mediaContents[e].duration;var s=new chrome.cast.media.QueueItem(t);i.queueData=new chrome.cast.media.QueueData,i.queueData.items=[s],i.queueData.name="Sample Queue for Live"}this.playerStateBeforeSwitch&&this.playerStateBeforeSwitch!=p?i.autoplay=!0:i.autoplay=!1,cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(i).then(function(){console.log("Remote media loaded")}.bind(this),function(e){this.playerState=u,console.log("Remote media load error: "+g.getErrorMessage(e)),this.playerHandler.updateDisplay()}.bind(this))}.bind(this),e.isMediaLoaded=function(e){var t=cast.framework.CastContext.getInstance().getCurrentSession();if(!t)return!1;var i=t.getMediaSession();return!!i&&i.playerState!=u}.bind(this),e.getCurrentMediaTime=function(){return this.isLiveContent&&this.mediaInfo.metadata&&this.mediaInfo.metadata.sectionStartTimeInMedia?this.remotePlayer.currentTime-this.mediaInfo.metadata.sectionStartTimeInMedia:this.remotePlayer.currentTime}.bind(this),e.getMediaDuration=function(){return this.isLiveContent?null==this.mediaInfo.metadata||null==this.mediaInfo.metadata.sectionDuration||null==this.mediaInfo.metadata.sectionStartTimeInMedia?null:this.mediaInfo.metadata.sectionDuration:this.remotePlayer.duration}.bind(this),e.updateDisplay=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e&&e.getMediaSession()&&e.getMediaSession().media){var t=e.getMediaSession(),i=t.media,n=document.getElementById("video_image");i.metadata&&i.metadata.images&&i.metadata.images.length>0&&(n.src=i.metadata.images[0].url),document.getElementById("playerstate").style.display="block",document.getElementById("playerstatebg").style.display="block",document.getElementById("video_image_overlay").style.display="block";var a="",s="",r="";if(i.metadata&&(a=i.metadata.title,a=(a=(s=i.metadata.episodeTitle)?a+": "+s:a)?a+" ":"",r=(r=i.metadata.subtitle)?r+" ":""),document.getElementById("playerstate").innerHTML=a+t.playerState+" on "+e.getCastDevice().friendlyName,document.getElementById("media_title").innerHTML=a,document.getElementById("media_subtitle").innerHTML=r,i.streamType==chrome.cast.media.StreamType.LIVE){this.liveSeekableRange=t.liveSeekableRange;var o=document.getElementById("live_indicator");o.style.display="block",this.liveSeekableRange&&Math.abs(t.getEstimatedTime()-this.liveSeekableRange.end)<50?o.src="imagefiles/live_indicator_active.png":o.src="imagefiles/live_indicator_inactive.png"}else document.getElementById("live_indicator").style.display="none"}else document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none",document.getElementById("media_title").innerHTML="",document.getElementById("media_subtitle").innerHTML=""}.bind(this),e.updateCurrentTimeDisplay=function(){this.playerHandler.setTimeString(document.getElementById("currentTime"),this.playerHandler.getCurrentMediaTime())}.bind(this),e.updateDurationDisplay=function(){this.playerHandler.setTimeString(document.getElementById("duration"),this.playerHandler.getMediaDuration())}.bind(this),e.setTimeString=function(e,t){var i=this.getMediaTimeString(t);if(this.isLiveContent){if(null==i)return void(e.style.display="none");this.mediaInfo.metadata&&void 0!==this.mediaInfo.metadata.sectionStartAbsoluteTime?(e.style.display="flex",e.innerHTML=this.getClockTimeString(t+this.mediaInfo.metadata.sectionStartAbsoluteTime)):(e.style.display="flex",e.innerHTML=i)}else null!==i?(e.style.display="flex",e.innerHTML=i):e.style.display="none"}.bind(this),e.setVolume=function(e){var t=this.remotePlayer.volumeLevel,i=document.getElementById("audio_bg_level");e0&&this.endPlayback()},g.prototype.updateProgressBarByTimer=function(){var e=document.getElementById("progress"),t=document.getElementById("progress_indicator");if(null!=this.mediaDuration){t.style.display="",isNaN(parseInt(e.style.width,10))&&(e.style.width="0px");var i=Math.floor(d*this.currentMediaTime/this.mediaDuration);i>d?i=d:i<0&&(i=0),e.style.width=i+"px",t.style.marginLeft=i+"px";var n=document.getElementById("seekable_window"),a=document.getElementById("unseekable_overlay");if(this.isLiveContent)if(this.liveSeekableRange){var s=Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia,this.liveSeekableRange.end)-this.mediaInfo.metadata.sectionStartTimeInMedia,r=Math.floor(d*s/this.mediaDuration);r>d?r=d:r<0&&(r=0),n.style.width=r+"px";var o=Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia,this.liveSeekableRange.start)-this.mediaInfo.metadata.sectionStartTimeInMedia,l=Math.floor(d*o/this.mediaDuration);l>d?l=d:l<0&&(l=0),a.style.width=l+"px"}else n.style.width="0px",a.style.width="700px";else n.style.width="700px",a.style.width="0px";i>=d&&!this.isLiveContent&&this.endPlayback()}else{this.isLiveContent||console.log("Error - Duration is not defined for a VOD stream."),e.style.width="0px";var c=document.getElementById("skip");c&&c.style&&c.style.display&&(c.style.display="none"),t.style.display="none";var u=document.getElementById("seekable_window");u&&u.style&&u.style.width&&(u.style.width="0px");var m=document.getElementById("unseekable_overlay");m&&m.style&&m.style.width&&(m.style.width="0px")}},g.prototype.endPlayback=function(){this.currentMediaTime=0,this.stopProgressTimer(),this.playerState=u,this.playerHandler.updateDisplay();var e=document.getElementById("play");e&&e.style&&e.display&&(e.style.display="block");var t=document.getElementById("pause");t&&t.style&&t.style.display&&(t.style.display="none")},g.prototype.getMediaTimeString=function(e){if(null==e||null==e)return null;var t=!1;e<0&&(t=!0,e*=-1);var i=Math.floor(e/3600),n=Math.floor((e-3600*i)/60),a=Math.floor(e-3600*i-60*n);return i<10&&(i="0"+i),n<10&&(n="0"+n),a<10&&(a="0"+a),(t?"-":"")+i+":"+n+":"+a},g.prototype.getClockTimeString=function(e){if(!e)return"0:00:00";var t=new Date(1e3*e),i=t.getHours(),n=t.getMinutes(),a=t.getSeconds(),s=i>=12?"PM":"AM";return(i=(i%=12)||12)+":"+(n=("0"+n).slice(-2))+":"+(a=("0"+a).slice(-2))+" "+s},g.prototype.updateAdMarkers=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e){var t=e.getMediaSession();if(t){var i=t.media;if(i){var n=i.breaks,a=i.duration;if(n)for(var s=0;sa&&r.isEmbedded))if(!document.getElementById("ad"+r.position))document.getElementById("progress").innerHTML+='
'}}}}},g.prototype.removeAdMarkers=function(){document.querySelectorAll(".adMarker").forEach((function(e){e.remove()}))},g.prototype.adPositionToMargin=function(e,t){return-1==e||e>t?d:d*e/t},g.prototype.onBreakClipIdChanged=function(){var e=document.getElementById("skip");e&&e.style&&e.style.display&&(e.style.display="none")},g.prototype.isPlayingBreak=function(e){this.enableProgressBar(!e)},g.prototype.onWhenSkippableChanged=function(e){this.whenSkippable=e},g.prototype.onCurrentBreakClipTimeChanged=function(e){var t=document.getElementById("skip");null==this.whenSkippable||this.whenSkippable<0?t&&t.style&&t.style.display&&(t.style.display="none"):void 0!==this.whenSkippable||e>=this.whenSkippable?t&&t.style&&t.style.display&&(t.style.display="block"):t&&t.style&&t.style.display&&(t.style.display="none")},g.prototype.skipAd=function(){this.remotePlayerController.skipAd()},g.prototype.enableProgressBar=function(e){var t=document.getElementById("progress"),i=document.getElementById("progress_indicator"),n=document.getElementById("seekable_window");e?(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_progress.png')",t.style.cursor="pointer",n.style.cursor="pointer",i.style.cursor="pointer",i.draggable=!0,t.addEventListener("click",this.seekMediaListener),n.addEventListener("click",this.seekMediaListener),i.addEventListener("dragend",this.seekMediaListener)):(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_buffer.png')",t.style.cursor="default",n.style.cursor="default",i.style.cursor="default",i.draggable=!1,t.removeEventListener("click",this.seekMediaListener),n.removeEventListener("click",this.seekMediaListener),i.removeEventListener("dragend",this.seekMediaListener))},g.prototype.requestFullScreen=function(){var e=document.getElementById("video_element"),t=e.requestFullScreen||e.webkitRequestFullScreen;t&&(t.call(e),console.log("Requested fullscreen"))},g.prototype.cancelFullScreen=function(){var e=document.cancelFullScreen||document.webkitCancelFullScreen;e&&e.call(document)},g.prototype.fullscreenChangeHandler=function(){this.fullscreen=!this.fullscreen},g.prototype.showFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");this.fullscreen?(e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="block")):(e&&e.style&&e.style.display&&(e.style.display="block"),t&&t.style&&t.style.display&&(t.style.display="none"))},g.prototype.hideFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="none")},g.prototype.showMediaControl=function(){var e=document.getElementById("media_control");e&&e.style&&e.opacity&&(e.style.opacity=.7)},g.prototype.hideMediaControl=function(){if(cast&&cast.framework&&cast.framework.CastContext){var e=cast.framework.CastContext.getInstance();e&&e.getCurrentSession()?document.getElementById("media_control").style.opacity=.7:document.getElementById("media_control").style.opacity=0}},g.prototype.showVolumeSlider=function(){this.playerHandler.isMuted()||(document.getElementById("audio_bg").style.opacity=1,document.getElementById("audio_bg_track").style.opacity=1,document.getElementById("audio_bg_level").style.opacity=1,document.getElementById("audio_indicator").style.opacity=1)},g.prototype.hideVolumeSlider=function(){document.getElementById("audio_bg").style.opacity=0,document.getElementById("audio_bg_track").style.opacity=0,document.getElementById("audio_bg_level").style.opacity=0,document.getElementById("audio_indicator").style.opacity=0},g.prototype.resetVolumeSlider=function(){var e=.5*document.getElementById("audio_bg_track").clientHeight;document.getElementById("audio_bg_level").style.height=e+"px",document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},g.prototype.initializeUI=function(){this.mediaContents&&this.mediaContents.length>0&&(document.getElementById("media_title").innerHTML=this.mediaContents[0].title,document.getElementById("media_subtitle").innerHTML=this.mediaContents[this.currentMediaIndex].subtitle),document.getElementById("seekable_window").addEventListener("click",this.seekMediaListener),document.getElementById("progress").addEventListener("click",this.seekMediaListener),document.getElementById("progress_indicator").addEventListener("dragend",this.seekMediaListener),document.getElementById("skip").addEventListener("click",this.skipAd.bind(this)),document.getElementById("audio_on").addEventListener("click",this.playerHandler.mute.bind(this.playerHandler)),document.getElementById("audio_off").addEventListener("click",this.playerHandler.unMute.bind(this.playerHandler)),document.getElementById("audio_bg").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_on").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_bg_level").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_bg_track").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_bg_level").addEventListener("click",this.setVolume.bind(this)),document.getElementById("audio_bg_track").addEventListener("click",this.setVolume.bind(this)),document.getElementById("audio_bg").addEventListener("mouseout",this.hideVolumeSlider.bind(this)),document.getElementById("audio_on").addEventListener("mouseout",this.hideVolumeSlider.bind(this)),document.getElementById("main_video").addEventListener("mouseover",this.showMediaControl.bind(this)),document.getElementById("main_video").addEventListener("mouseout",this.hideMediaControl.bind(this)),document.getElementById("media_control").addEventListener("mouseover",this.showMediaControl.bind(this)),document.getElementById("media_control").addEventListener("mouseout",this.hideMediaControl.bind(this)),document.getElementById("fullscreen_expand").addEventListener("click",this.requestFullScreen.bind(this)),document.getElementById("fullscreen_collapse").addEventListener("click",this.cancelFullScreen.bind(this)),document.addEventListener("fullscreenchange",this.fullscreenChangeHandler.bind(this),!1),document.addEventListener("webkitfullscreenchange",this.fullscreenChangeHandler.bind(this),!1),document.getElementById("play").addEventListener("click",this.playerHandler.play.bind(this.playerHandler)),document.getElementById("pause").addEventListener("click",this.playerHandler.pause.bind(this.playerHandler)),document.getElementById("progress_indicator").draggable=!0;var e=document.getElementById("none");e.onclick=function(){l=!1,o=!1,console.log("Features have been removed")};var t=document.getElementById("ads");t.onclick=function(){l=!1,o=!0,console.log("Ads have been enabled")};var i=document.getElementById("live");i.onclick=function(){l=!0,o=!1,console.log("Live has been enabled")},o?(l&&console.error("Only one feature can be enabled at a time. Enabling ads."),t.checked=!0,console.log("Ads are enabled")):l?(i.checked=!0,console.log("Live is enabled")):(e.checked=!0,console.log("No features are enabled"))},g.prototype.addVideoThumbs=function(){if(s&&s.categories&&s.categories.length>0){this.mediaContents=s.categories[0].videos;for(var e=document.getElementById("carousel"),t=null,i=null,n=0;n',t.addEventListener("click",this.selectMedia.bind(this,n)),e.appendChild(t)}},g.getErrorMessage=function(e){switch(e.code){case chrome.cast.ErrorCode.API_NOT_INITIALIZED:return"The API is not initialized."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CANCEL:return"The operation was canceled by the user"+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CHANNEL_ERROR:return"A channel to the receiver is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.EXTENSION_MISSING:return"The Cast extension is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.INVALID_PARAMETER:return"The parameters to the operation were not valid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:return"No receiver was compatible with the session request."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.SESSION_ERROR:return"A session could not be created, or a session was invalid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.TIMEOUT:return"The operation timed out."+(e.description?" :"+e.description:"");default:return e}};var E=new g;window.__onGCastApiAvailable=function(e){e&&E.initializeCastPlayer()},Object.defineProperty(e,"__esModule",{value:!0})})); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("@angular/common"),require("rxjs")):"function"==typeof define&&define.amd?define("@thinkam.net/ng-cast",["exports","@angular/core","@angular/common","rxjs"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).thinkam=e.thinkam||{},e.thinkam.net=e.thinkam.net||{},e.thinkam.net["ng-cast"]={}),e.ng.core,e.ng.common,e.rxjs)}(this,(function(e,t,i,n){"use strict";var a="http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/",s=!1,r=!1,o=700,l=100,d="IDLE",c="BUFFERING",u="LOADED",m="PLAYING",y="PAUSED",h=function(){this.playerHandler=new p(this),this.playerState=d,this.playerStateBeforeSwitch=null,this.remotePlayer=null,this.remotePlayerController=null,this.currentMediaTime=0,this.mediaDuration=-1,this.timer=null,this.incrementMediaTimeHandler=this.incrementMediaTime.bind(this),this.seekMediaListener=this.seekMedia.bind(this),this.currentMediaIndex=0,this.mediaContents=null,this.fullscreen=!1,this.mediaInfo=null,this.whenSkippable=null,this.liveSeekableRange=null,this.isLiveContent=!1,this.setupLocalPlayer(),this.addVideoThumbs(),this.initializeUI(),this.mediaJSON={categories:[]}};h.prototype.initializeCastPlayer=function(){var e={receiverApplicationId:"C0868879"};e.autoJoinPolicy=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,cast.framework.CastContext.getInstance().setOptions(e),this.remotePlayer=new cast.framework.RemotePlayer,this.remotePlayerController=new cast.framework.RemotePlayerController(this.remotePlayer),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,function(e){this.switchPlayer(e.value)}.bind(this))},h.prototype.switchPlayer=function(){this.playerStateBeforeSwitch=this.playerState,this.stopProgressTimer(),this.resetVolumeSlider(),cast&&cast.framework&&this.remotePlayer.isConnected?(this.playerHandler.pause(),this.setupRemotePlayer()):this.setupLocalPlayer()};var p=function(e){this.target={},this.setTarget=function(e){this.target=e},this.play=function(){e.playerState!=d&&this.target.isMediaLoaded(e.currentMediaIndex)?(e.playerState=m,this.target.play(),document.getElementById("play").style.display="none",document.getElementById("pause").style.display="block"):this.load(e.currentMediaIndex)},this.pause=function(){this.target.pause(),e.playerState=y,document.getElementById("play").style.display="block",document.getElementById("pause").style.display="none"},this.stop=function(){e.playerState=d,this.target.stop()},this.load=function(t){void 0===t&&(t=null),t||(t=e.currentMediaIndex),e.playerState=c,this.target.load(t)},this.isMediaLoaded=function(e){return this.target.isMediaLoaded(e)},this.prepareToPlay=function(){e.mediaDuration=this.getMediaDuration(),e.playerHandler.updateDurationDisplay(),e.playerState=u,this.play(),e.startProgressTimer(),this.updateDisplay()},this.getCurrentMediaTime=function(){return this.target.getCurrentMediaTime()},this.getMediaDuration=function(){return this.target.getMediaDuration()},this.updateDisplay=function(){this.currentMediaTime=this.target.getCurrentMediaTime(),this.mediaDuration=this.target.getMediaDuration(),this.target.updateDisplay()},this.updateCurrentTimeDisplay=function(){this.target.updateCurrentTimeDisplay()},this.updateDurationDisplay=function(){this.target.updateDurationDisplay()},this.setTimeString=function(e,t){this.target.setTimeString(e,t)},this.setVolume=function(e){this.target.setVolume(e)},this.mute=function(){this.target.mute(),document.getElementById("audio_on").style.display="none",document.getElementById("audio_off").style.display="block"},this.unMute=function(){this.target.unMute(),document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},this.isMuted=function(){return this.target.isMuted()},this.seekTo=function(e){this.target.seekTo(e)}};h.prototype.setupLocalPlayer=function(){var e=document.getElementById("live_indicator");e&&e.style&&e.style.display&&(e.style.display="none"),this.removeAdMarkers(),document.getElementById("skip").style.display="none";var t=document.getElementById("video_element");void 0!==t&&t&&t.addEventListener("loadeddata",this.onMediaLoadedLocally.bind(this));var i={play:function(){t.play(),document.getElementById("video_image").style.display="none",t.style.display="block"},pause:function(){t.pause()},stop:function(){t.stop()}};i.load=function(e){t.src=this.mediaContents[e].sources[0],t.load()}.bind(this),i.isMediaLoaded=function(e){return e?t.src==this.mediaContents[e].sources[0]:null!==t.src&&""!==t.src}.bind(this),i.getCurrentMediaTime=function(){return t.currentTime},i.getMediaDuration=function(){return t.duration},i.updateDisplay=function(){document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none",document.getElementById("media_title").innerHTML=g.mediaContents[g.currentMediaIndex].title,document.getElementById("media_subtitle").innerHTML=g.mediaContents[g.currentMediaIndex].subtitle},i.updateCurrentTimeDisplay=function(){this.currentMediaTime+=1,this.playerHandler.setTimeString(document.getElementById("currentTime"),this.currentMediaTime)}.bind(this),i.updateDurationDisplay=function(){this.playerHandler.setTimeString(document.getElementById("duration"),this.mediaDuration)}.bind(this),i.setTimeString=function(e,t){var i=this.getMediaTimeString(t);null!==i?(e.style.display="",e.innerHTML=i):e.style.display="none"}.bind(this),i.setVolume=function(e){t&&(t.volume=e0&&(this.playerHandler.load(),this.playerHandler.play())},h.prototype.setupRemotePlayer=function(){this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,function(e){var t=cast.framework.CastContext.getInstance().getCurrentSession();if(!t)return this.mediaInfo=null,this.isLiveContent=!1,void this.playerHandler.updateDisplay();var i=t.getMediaSession();if(!i)return this.mediaInfo=null,this.isLiveContent=!1,void this.playerHandler.updateDisplay();this.mediaInfo=i.media,this.mediaInfo?this.isLiveContent=this.mediaInfo.streamType==chrome.cast.media.StreamType.LIVE:this.isLiveContent=!1,i.playerState==m&&this.playerState!==m&&this.playerHandler.prepareToPlay(),this.removeAdMarkers(),this.updateAdMarkers(),this.playerHandler.updateDisplay()}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,function(e){this.enableProgressBar(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,function(){this.remotePlayer.isPaused?this.playerHandler.pause():this.playerState!==m&&this.playerHandler.play()}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,function(){this.remotePlayer.isMuted?this.playerHandler.mute():this.playerHandler.unMute()}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,function(){var e=this.remotePlayer.volumeLevel*l,t=document.getElementById("audio_bg_level");t.style.height=e+"px",t.style.marginTop=-e+"px"}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,function(e){this.isPlayingBreak(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,function(e){this.onWhenSkippableChanged(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,function(e){this.onCurrentBreakClipTimeChanged(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,function(e){this.onBreakClipIdChanged(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,function(e){console.log("LIVE_SEEKABLE_RANGE_CHANGED"),this.liveSeekableRange=e.value}.bind(this));var e={};e.play=function(){this.remotePlayer.isPaused&&this.remotePlayerController.playOrPause(),document.getElementById("video_image").style.display="",document.getElementById("video_element").style.display="none"}.bind(this),e.pause=function(){this.remotePlayer.isPaused||this.remotePlayerController.playOrPause()}.bind(this),e.stop=function(){this.remotePlayerController.stop()}.bind(this),e.load=function(e){console.log("Loading..."+this.mediaContents[e].title);var t=new chrome.cast.media.MediaInfo(this.mediaContents[e].sources[0],"video/mp4");t.streamType=chrome.cast.media.StreamType.BUFFERED,t.metadata=new chrome.cast.media.TvShowMediaMetadata,t.metadata.title=this.mediaContents[e].title,t.metadata.subtitle=this.mediaContents[e].subtitle,t.metadata.images=[{url:a+this.mediaContents[e].thumb}];var i=new chrome.cast.media.LoadRequest(t);if(i.currentTime=this.currentMediaTime,s)t.breakClips=breakClipsJSON,t.breaks=breaksJSON;else if(r){t.streamType=chrome.cast.media.StreamType.LIVE;var n=new Date,o=n/=1e3;t.duration=-1,t.startAbsoluteTime=n,t.metadata.sectionStartAbsoluteTime=o,t.metadata.sectionStartTimeInMedia=0,t.metadata.sectionDuration=this.mediaContents[e].duration;var l=new chrome.cast.media.QueueItem(t);i.queueData=new chrome.cast.media.QueueData,i.queueData.items=[l],i.queueData.name="Sample Queue for Live"}this.playerStateBeforeSwitch&&this.playerStateBeforeSwitch!=y?i.autoplay=!0:i.autoplay=!1,cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(i).then(function(){console.log("Remote media loaded")}.bind(this),function(e){this.playerState=d,console.log("Remote media load error: "+h.getErrorMessage(e)),this.playerHandler.updateDisplay()}.bind(this))}.bind(this),e.isMediaLoaded=function(e){var t=cast.framework.CastContext.getInstance().getCurrentSession();if(!t)return!1;var i=t.getMediaSession();return!!i&&i.playerState!=d}.bind(this),e.getCurrentMediaTime=function(){return this.isLiveContent&&this.mediaInfo.metadata&&this.mediaInfo.metadata.sectionStartTimeInMedia?this.remotePlayer.currentTime-this.mediaInfo.metadata.sectionStartTimeInMedia:this.remotePlayer.currentTime}.bind(this),e.getMediaDuration=function(){return this.isLiveContent?null==this.mediaInfo.metadata||null==this.mediaInfo.metadata.sectionDuration||null==this.mediaInfo.metadata.sectionStartTimeInMedia?null:this.mediaInfo.metadata.sectionDuration:this.remotePlayer.duration}.bind(this),e.updateDisplay=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e&&e.getMediaSession()&&e.getMediaSession().media){var t=e.getMediaSession(),i=t.media,n=document.getElementById("video_image");i.metadata&&i.metadata.images&&i.metadata.images.length>0&&(n.src=i.metadata.images[0].url),document.getElementById("playerstate").style.display="block",document.getElementById("playerstatebg").style.display="block",document.getElementById("video_image_overlay").style.display="block";var a="",s="",r="";if(i.metadata&&(a=i.metadata.title,a=(a=(s=i.metadata.episodeTitle)?a+": "+s:a)?a+" ":"",r=(r=i.metadata.subtitle)?r+" ":""),document.getElementById("playerstate").innerHTML=a+t.playerState+" on "+e.getCastDevice().friendlyName,document.getElementById("media_title").innerHTML=a,document.getElementById("media_subtitle").innerHTML=r,i.streamType==chrome.cast.media.StreamType.LIVE){this.liveSeekableRange=t.liveSeekableRange;var o=document.getElementById("live_indicator");o.style.display="block",this.liveSeekableRange&&Math.abs(t.getEstimatedTime()-this.liveSeekableRange.end)<50?o.src="imagefiles/live_indicator_active.png":o.src="imagefiles/live_indicator_inactive.png"}else document.getElementById("live_indicator").style.display="none"}else document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none",document.getElementById("media_title").innerHTML="",document.getElementById("media_subtitle").innerHTML=""}.bind(this),e.updateCurrentTimeDisplay=function(){this.playerHandler.setTimeString(document.getElementById("currentTime"),this.playerHandler.getCurrentMediaTime())}.bind(this),e.updateDurationDisplay=function(){this.playerHandler.setTimeString(document.getElementById("duration"),this.playerHandler.getMediaDuration())}.bind(this),e.setTimeString=function(e,t){var i=this.getMediaTimeString(t);if(this.isLiveContent){if(null==i)return void(e.style.display="none");this.mediaInfo.metadata&&void 0!==this.mediaInfo.metadata.sectionStartAbsoluteTime?(e.style.display="flex",e.innerHTML=this.getClockTimeString(t+this.mediaInfo.metadata.sectionStartAbsoluteTime)):(e.style.display="flex",e.innerHTML=i)}else null!==i?(e.style.display="flex",e.innerHTML=i):e.style.display="none"}.bind(this),e.setVolume=function(e){var t=this.remotePlayer.volumeLevel,i=document.getElementById("audio_bg_level");e0&&this.endPlayback()},h.prototype.updateProgressBarByTimer=function(){var e=document.getElementById("progress"),t=document.getElementById("progress_indicator");if(null!=this.mediaDuration){t.style.display="",isNaN(parseInt(e.style.width,10))&&(e.style.width="0px");var i=Math.floor(o*this.currentMediaTime/this.mediaDuration);i>o?i=o:i<0&&(i=0),e.style.width=i+"px",t.style.marginLeft=i+"px";var n=document.getElementById("seekable_window"),a=document.getElementById("unseekable_overlay");if(this.isLiveContent)if(this.liveSeekableRange){var s=Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia,this.liveSeekableRange.end)-this.mediaInfo.metadata.sectionStartTimeInMedia,r=Math.floor(o*s/this.mediaDuration);r>o?r=o:r<0&&(r=0),n.style.width=r+"px";var l=Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia,this.liveSeekableRange.start)-this.mediaInfo.metadata.sectionStartTimeInMedia,d=Math.floor(o*l/this.mediaDuration);d>o?d=o:d<0&&(d=0),a.style.width=d+"px"}else n.style.width="0px",a.style.width="700px";else n.style.width="700px",a.style.width="0px";i>=o&&!this.isLiveContent&&this.endPlayback()}else{this.isLiveContent||console.log("Error - Duration is not defined for a VOD stream."),e.style.width="0px";var c=document.getElementById("skip");c&&c.style&&c.style.display&&(c.style.display="none"),t.style.display="none";var u=document.getElementById("seekable_window");u&&u.style&&u.style.width&&(u.style.width="0px");var m=document.getElementById("unseekable_overlay");m&&m.style&&m.style.width&&(m.style.width="0px")}},h.prototype.endPlayback=function(){this.currentMediaTime=0,this.stopProgressTimer(),this.playerState=d,this.playerHandler.updateDisplay();var e=document.getElementById("play");e&&e.style&&e.display&&(e.style.display="block");var t=document.getElementById("pause");t&&t.style&&t.style.display&&(t.style.display="none")},h.prototype.getMediaTimeString=function(e){if(null==e||null==e)return null;var t=!1;e<0&&(t=!0,e*=-1);var i=Math.floor(e/3600),n=Math.floor((e-3600*i)/60),a=Math.floor(e-3600*i-60*n);return i<10&&(i="0"+i),n<10&&(n="0"+n),a<10&&(a="0"+a),(t?"-":"")+i+":"+n+":"+a},h.prototype.getClockTimeString=function(e){if(!e)return"0:00:00";var t=new Date(1e3*e),i=t.getHours(),n=t.getMinutes(),a=t.getSeconds(),s=i>=12?"PM":"AM";return(i=(i%=12)||12)+":"+(n=("0"+n).slice(-2))+":"+(a=("0"+a).slice(-2))+" "+s},h.prototype.updateAdMarkers=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e){var t=e.getMediaSession();if(t){var i=t.media;if(i){var n=i.breaks,a=i.duration;if(n)for(var s=0;sa&&r.isEmbedded))if(!document.getElementById("ad"+r.position))document.getElementById("progress").innerHTML+='
'}}}}},h.prototype.removeAdMarkers=function(){document.querySelectorAll(".adMarker").forEach((function(e){e.remove()}))},h.prototype.adPositionToMargin=function(e,t){return-1==e||e>t?o:o*e/t},h.prototype.onBreakClipIdChanged=function(){var e=document.getElementById("skip");e&&e.style&&e.style.display&&(e.style.display="none")},h.prototype.isPlayingBreak=function(e){this.enableProgressBar(!e)},h.prototype.onWhenSkippableChanged=function(e){this.whenSkippable=e},h.prototype.onCurrentBreakClipTimeChanged=function(e){var t=document.getElementById("skip");null==this.whenSkippable||this.whenSkippable<0?t&&t.style&&t.style.display&&(t.style.display="none"):void 0!==this.whenSkippable||e>=this.whenSkippable?t&&t.style&&t.style.display&&(t.style.display="block"):t&&t.style&&t.style.display&&(t.style.display="none")},h.prototype.skipAd=function(){this.remotePlayerController.skipAd()},h.prototype.enableProgressBar=function(e){var t=document.getElementById("progress"),i=document.getElementById("progress_indicator"),n=document.getElementById("seekable_window");e?(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_progress.png')",t.style.cursor="pointer",n.style.cursor="pointer",i.style.cursor="pointer",i.draggable=!0,t.addEventListener("click",this.seekMediaListener),n.addEventListener("click",this.seekMediaListener),i.addEventListener("dragend",this.seekMediaListener)):(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_buffer.png')",t.style.cursor="default",n.style.cursor="default",i.style.cursor="default",i.draggable=!1,t.removeEventListener("click",this.seekMediaListener),n.removeEventListener("click",this.seekMediaListener),i.removeEventListener("dragend",this.seekMediaListener))},h.prototype.requestFullScreen=function(){var e=document.getElementById("video_element"),t=e.requestFullScreen||e.webkitRequestFullScreen;t&&(t.call(e),console.log("Requested fullscreen"))},h.prototype.cancelFullScreen=function(){var e=document.cancelFullScreen||document.webkitCancelFullScreen;e&&e.call(document)},h.prototype.fullscreenChangeHandler=function(){this.fullscreen=!this.fullscreen},h.prototype.showFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");this.fullscreen?(e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="block")):(e&&e.style&&e.style.display&&(e.style.display="block"),t&&t.style&&t.style.display&&(t.style.display="none"))},h.prototype.hideFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="none")},h.prototype.showMediaControl=function(){var e=document.getElementById("media_control");e&&e.style&&e.opacity&&(e.style.opacity=.7)},h.prototype.hideMediaControl=function(){if("undefined"!=typeof cast){var e=cast.framework.CastContext.getInstance();e&&e.getCurrentSession()?document.getElementById("media_control").style.opacity=.7:document.getElementById("media_control").style.opacity=0}},h.prototype.showVolumeSlider=function(){this.playerHandler.isMuted()||(document.getElementById("audio_bg").style.opacity=1,document.getElementById("audio_bg_track").style.opacity=1,document.getElementById("audio_bg_level").style.opacity=1,document.getElementById("audio_indicator").style.opacity=1)},h.prototype.hideVolumeSlider=function(){document.getElementById("audio_bg").style.opacity=0,document.getElementById("audio_bg_track").style.opacity=0,document.getElementById("audio_bg_level").style.opacity=0,document.getElementById("audio_indicator").style.opacity=0},h.prototype.resetVolumeSlider=function(){var e=.5*document.getElementById("audio_bg_track").clientHeight;document.getElementById("audio_bg_level").style.height=e+"px",document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},h.prototype.initializeUI=function(){this.mediaContents&&this.mediaContents.length>0&&(document.getElementById("media_title").innerHTML=this.mediaContents[0].title,document.getElementById("media_subtitle").innerHTML=this.mediaContents[this.currentMediaIndex].subtitle),document.getElementById("seekable_window").addEventListener("click",this.seekMediaListener),document.getElementById("progress").addEventListener("click",this.seekMediaListener),document.getElementById("progress_indicator").addEventListener("dragend",this.seekMediaListener),document.getElementById("skip").addEventListener("click",this.skipAd.bind(this)),document.getElementById("audio_on").addEventListener("click",this.playerHandler.mute.bind(this.playerHandler)),document.getElementById("audio_off").addEventListener("click",this.playerHandler.unMute.bind(this.playerHandler)),document.getElementById("audio_bg").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_on").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_bg_level").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_bg_track").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_bg_level").addEventListener("click",this.setVolume.bind(this)),document.getElementById("audio_bg_track").addEventListener("click",this.setVolume.bind(this)),document.getElementById("audio_bg").addEventListener("mouseout",this.hideVolumeSlider.bind(this)),document.getElementById("audio_on").addEventListener("mouseout",this.hideVolumeSlider.bind(this));var e=document.getElementById("main_video");void 0!==e&&e&&(e.addEventListener("mouseover",this.showMediaControl.bind(this)),e.addEventListener("mouseout",this.hideMediaControl.bind(this))),document.getElementById("media_control").addEventListener("mouseover",this.showMediaControl.bind(this)),document.getElementById("media_control").addEventListener("mouseout",this.hideMediaControl.bind(this)),document.getElementById("fullscreen_expand").addEventListener("click",this.requestFullScreen.bind(this)),document.getElementById("fullscreen_collapse").addEventListener("click",this.cancelFullScreen.bind(this)),document.addEventListener("fullscreenchange",this.fullscreenChangeHandler.bind(this),!1),document.addEventListener("webkitfullscreenchange",this.fullscreenChangeHandler.bind(this),!1),document.getElementById("play").addEventListener("click",this.playerHandler.play.bind(this.playerHandler)),document.getElementById("pause").addEventListener("click",this.playerHandler.pause.bind(this.playerHandler)),document.getElementById("progress_indicator").draggable=!0;var t=document.getElementById("none");t.onclick=function(){r=!1,s=!1,console.log("Features have been removed")};var i=document.getElementById("ads");i.onclick=function(){r=!1,s=!0,console.log("Ads have been enabled")};var n=document.getElementById("live");n.onclick=function(){r=!0,s=!1,console.log("Live has been enabled")},s?(r&&console.error("Only one feature can be enabled at a time. Enabling ads."),i.checked=!0,console.log("Ads are enabled")):r?(n.checked=!0,console.log("Live is enabled")):(t.checked=!0,console.log("No features are enabled"))},h.prototype.addVideoThumbs=function(){if(void 0!==this.mediaJSON&&this.mediaJSON.categories&&this.mediaJSON.categories.length>0){this.mediaContents=this.mediaJSON.categories[0].videos;for(var e=document.getElementById("carousel"),t=null,i=null,n=0;n',t.addEventListener("click",this.selectMedia.bind(this,n)),e.appendChild(t)}},h.getErrorMessage=function(e){switch(e.code){case chrome.cast.ErrorCode.API_NOT_INITIALIZED:return"The API is not initialized."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CANCEL:return"The operation was canceled by the user"+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CHANNEL_ERROR:return"A channel to the receiver is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.EXTENSION_MISSING:return"The Cast extension is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.INVALID_PARAMETER:return"The parameters to the operation were not valid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:return"No receiver was compatible with the session request."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.SESSION_ERROR:return"A session could not be created, or a session was invalid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.TIMEOUT:return"The operation timed out."+(e.description?" :"+e.description:"");default:return e}};var g=new h;window.__onGCastApiAvailable=function(e){e&&g.initializeCastPlayer()},window.CastPlayer=g;function f(e,t,i,n){var a,s=arguments.length,r=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,i,n);else for(var o=e.length-1;o>=0;o--)(a=e[o])&&(r=(s<3?a(r):s>3?a(t,i,r):a(t,i))||r);return s>3&&r&&Object.defineProperty(t,i,r),r}e.ɵa=function(){function e(e){this.ngCastService=e}return e.prototype.ngOnInit=function(){this.window=window;var e=this.ngCastService;this.window.__onGCastApiAvailable=function(t){t&&e.initializeCastApi()},this.castingStatus=this.ngCastService.getStatus()},e.prototype.openSession=function(){this.ngCastService.discoverDevices()},e.prototype.closeSession=function(){this.ngCastService.discoverDevices()},e}(),e.ɵa=f([t.Component({selector:"ng-cast",template:'cast\ncast_connected',styles:[""]})],e.ɵa),e.NgCastService=function(){function e(){var e=this;this.window=window,this.status={casting:!1},this.onInitSuccess=function(){console.log("GCast initialization success")},this.onError=function(e){console.log("GCast initialization failed",e)},this.discoverDevices=function(){var t=e,i=new n.Subject;return e.cast.requestSession((function(e){t.session=e,t.setCasting(!0),i.next("CONNECTED")}),(function(e){t.setCasting(!1),"cancel"===e.code?(t.session=void 0,i.next("CANCEL")):console.error("Error selecting a cast device",e)})),i},this.onMediaDiscovered=function(e){var t=window.document.createElement("script");t.setAttribute("type","text/javascript"),t.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"),window.document.body.appendChild(t),globalThis.CastPlayer.mediaJSON.categories=e},this.play=function(){e.currentMedia.play(null)},this.pause=function(){e.currentMedia.pause(null)},this.stop=function(){e.currentMedia.stop(null)},this.onMediaError=function(e){console.error("Error launching media",e)},globalThis.CastPlayer.mediaJSON={categories:[]}}return e.prototype.initializeCastApi=function(){var e=this;this.cast=this.window.chrome.cast;var t=new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID),i=new this.cast.ApiConfig(t,(function(){}),(function(t){e.cast.ReceiverAvailability.AVAILABLE}));this.cast.initialize(i,this.onInitSuccess,this.onError)},e.prototype.setCasting=function(e){globalThis.CastPlayer.addVideoThumbs(),this.status.casting=e},e.prototype.getStatus=function(){return this.status},e}(),e.NgCastService=f([t.Injectable()],e.NgCastService),e.NgCastModule=function(){},e.NgCastModule=f([t.NgModule({schemas:[t.CUSTOM_ELEMENTS_SCHEMA],imports:[i.CommonModule],exports:[e.ɵa],providers:[e.NgCastService],declarations:[e.ɵa]})],e.NgCastModule),Object.defineProperty(e,"__esModule",{value:!0})})); //# sourceMappingURL=thinkam.net-ng-cast.umd.min.js.map \ No newline at end of file diff --git a/dist/bundles/thinkam.net-ng-cast.umd.min.js.map b/dist/bundles/thinkam.net-ng-cast.umd.min.js.map index 5b419df..0101938 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.min.js.map +++ b/dist/bundles/thinkam.net-ng-cast.umd.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../CastVideos.js"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","NgCastComponent","ngCastService","this","prototype","ngOnInit","window","isAvailable","initializeCastApi","castingStatus","getStatus","openSession","discoverDevices","closeSession","stop","Component","selector","template","NgCastService","_this","status","casting","onInitSuccess","console","log","onError","err","self","subj","Subject","cast","requestSession","s","session","setCasting","next","code","undefined","error","onMediaDiscovered","categories","script","createElement","setAttribute","body","appendChild","mediaJSON","play","currentMedia","pause","onMediaError","sessionRequest","SessionRequest","media","DEFAULT_MEDIA_RECEIVER_APP_ID","apiConfig","ApiConfig","ReceiverAvailability","AVAILABLE","initialize","value","Injectable","NgCastModule","NgModule","schemas","CUSTOM_ELEMENTS_SCHEMA","imports","CommonModule","exports","providers","declarations","MEDIA_SOURCE_ROOT","ENABLE_ADS","ENABLE_LIVE","PROGRESS_BAR_WIDTH","FULL_VOLUME_HEIGHT","PLAYER_STATE","CastPlayer","playerHandler","PlayerHandler","playerState","playerStateBeforeSwitch","remotePlayer","remotePlayerController","currentMediaTime","mediaDuration","timer","incrementMediaTimeHandler","incrementMediaTime","bind","seekMediaListener","seekMedia","currentMediaIndex","mediaContents","fullscreen","mediaInfo","whenSkippable","liveSeekableRange","isLiveContent","setupLocalPlayer","addVideoThumbs","initializeUI","initializeCastPlayer","options","receiverApplicationId","autoJoinPolicy","chrome","AutoJoinPolicy","ORIGIN_SCOPED","framework","CastContext","getInstance","setOptions","RemotePlayer","RemotePlayerController","addEventListener","RemotePlayerEventType","IS_CONNECTED_CHANGED","e","switchPlayer","stopProgressTimer","resetVolumeSlider","isConnected","setupRemotePlayer","castPlayer","setTarget","isMediaLoaded","document","getElementById","style","display","load","mediaIndex","prepareToPlay","getMediaDuration","updateDurationDisplay","startProgressTimer","updateDisplay","getCurrentMediaTime","updateCurrentTimeDisplay","setTimeString","element","time","setVolume","volumeSliderPosition","mute","unMute","isMuted","seekTo","live_indicator","removeAdMarkers","localPlayer","onMediaLoadedLocally","playerTarget","src","currentTime","duration","innerHTML","currentTimeString","getMediaTimeString","volume","p","height","marginTop","muted","DEFAULT_VOLUME","showFullscreenButton","enableProgressBar","MEDIA_INFO_CHANGED","event","getCurrentSession","getMediaSession","streamType","StreamType","LIVE","updateAdMarkers","CAN_SEEK_CHANGED","IS_PAUSED_CHANGED","isPaused","IS_MUTED_CHANGED","VOLUME_LEVEL_CHANGED","newVolume","volumeLevel","IS_PLAYING_BREAK_CHANGED","isPlayingBreak","WHEN_SKIPPABLE_CHANGED","onWhenSkippableChanged","CURRENT_BREAK_CLIP_TIME_CHANGED","onCurrentBreakClipTimeChanged","BREAK_CLIP_ID_CHANGED","onBreakClipIdChanged","LIVE_SEEKABLE_RANGE_CHANGED","playOrPause","MediaInfo","BUFFERED","metadata","TvShowMediaMetadata","title","subtitle","images","url","request","LoadRequest","breakClips","breakClipsJSON","breaks","breaksJSON","Date","sectionStartAbsoluteTime","startAbsoluteTime","sectionStartTimeInMedia","sectionDuration","item","QueueItem","queueData","QueueData","items","name","autoplay","loadMedia","then","errorCode","getErrorMessage","castSession","vi","mediaTitle","mediaEpisodeTitle","mediaSubtitle","episodeTitle","getCastDevice","friendlyName","Math","abs","getEstimatedTime","end","getClockTimeString","currentVolume","setVolumeLevel","muteOrUnmute","seek","canSeek","opacity","hideFullscreenButton","getSessionState","SessionState","SESSION_RESUMED","selectMedia","currentMediaInfo","marginLeft","width","seekable_window","unseekable_overlay","position","parseInt","offsetX","pi","progress","seekTime","pp","pw","currentTarget","id","mouseEvent","pos","offsetY","clientHeight","setInterval","clearInterval","updateProgressBarByTimer","endPlayback","progressBar","isNaN","floor","seekableMediaPosition","max","seekableWidth","unseekableMediaPosition","start","unseekableWidth","skip","seekable_window_1","unseekable_overlay_1","timestamp","isNegative","hours","minutes","seconds","date","getHours","getMinutes","getSeconds","ampm","slice","contentDuration","adBreak","isEmbedded","adPositionToMargin","querySelectorAll","forEach","adMarker","remove","currentBreakClipTime","skipAd","enable","progress_indicator","backgroundImage","cursor","draggable","removeEventListener","requestFullScreen","requestMethod","call","cancelFullScreen","fullscreenChangeHandler","fullscreen_expand","fullscreen_collapse","showMediaControl","media_control","hideMediaControl","context","showVolumeSlider","hideVolumeSlider","defaultVolumeSliderHeight","noneRadio","onclick","adsRadio","liveRadio","checked","ni","newdiv","divIdName","ErrorCode","API_NOT_INITIALIZED","description","CANCEL","CHANNEL_ERROR","EXTENSION_MISSING","INVALID_PARAMETER","RECEIVER_UNAVAILABLE","SESSION_ERROR","TIMEOUT"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.stop();\n }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare var mediaJSON: any;\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n \n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID);\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n mediaJSON.categories = categories;\n };\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","'use strict';\n\nvar mediaJSON = { \n 'categories': []\n};\n\n/** Cleaner UI for demo purposes. */\nconst DEMO_MODE = false;\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/';\n\n/**\n * Controls if Ads are enabled. Controlled by radio button.\n * @type {boolean}\n */\nlet ENABLE_ADS = false;\n\n/**\n * Controls if Live stream is played. Controlled by radio button.\n * @type {boolean}\n */\nlet ENABLE_LIVE = false;\n\n/**\n * Buffer to decide if the live indicator should be displayed to show that\n * playback is at the playback head.\n * @const {number}\n */\nconst LIVE_INDICATOR_BUFFER = 50;\n\n/**\n * Width of progress bar in pixels.\n * @const {number}\n */\nconst PROGRESS_BAR_WIDTH = 700;\n\n/**\n * Time in milliseconds for minimal progress update.\n * @const {number}\n */\nconst TIMER_STEP = 1000;\n\n/**\n * Cast volume upon initial connection.\n * @const {number}\n */\nconst DEFAULT_VOLUME = 0.5;\n\n/**\n * Height, in pixels, of volume bar.\n * @const {number}\n */\nconst FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.setupLocalPlayer();\n this.addVideoThumbs();\n this.initializeUI();\n};\n\nCastPlayer.prototype.initializeCastPlayer = function () {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = 'C0868879';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n this.remotePlayer = new cast.framework.RemotePlayer();\n this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer);\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n function (e) {\n this.switchPlayer(e.value);\n }.bind(this)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = function () {\n this.playerStateBeforeSwitch = this.playerState;\n\n this.stopProgressTimer();\n this.resetVolumeSlider();\n\n // Session is active\n if (cast && cast.framework && this.remotePlayer.isConnected) {\n // Pause local playback\n this.playerHandler.pause();\n this.setupRemotePlayer();\n } else {\n this.setupLocalPlayer();\n }\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n this.updateDurationDisplay = function () {\n this.target.updateDurationDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = function () {\n // Cleanup remote player UI\n let live_indicator = document.getElementById('live_indicator');\n if (live_indicator && live_indicator.style && live_indicator.style.display) {\n live_indicator.style.display = 'none';\n }\n\n this.removeAdMarkers();\n document.getElementById('skip').style.display = 'none';\n\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', this.onMediaLoadedLocally.bind(this));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src = this.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n if (!mediaIndex) {\n return (localPlayer.src !== null && localPlayer.src !== \"\");\n } else {\n return (localPlayer.src == this.mediaContents[mediaIndex]['sources'][0]);\n }\n }.bind(this);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplay = function () {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n };\n\n playerTarget.updateCurrentTimeDisplay = function () {\n // Increment for local playback\n this.currentMediaTime += 1;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.currentMediaTime);\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.mediaDuration);\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n if (currentTimeString !== null) {\n element.style.display = '';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n this.playerHandler.setTarget(playerTarget);\n\n this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n this.showFullscreenButton();\n\n this.enableProgressBar(true);\n\n if (this.currentMediaTime > 0) {\n this.playerHandler.load();\n this.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n this.mediaInfo = media.media;\n\n if (this.mediaInfo) {\n this.isLiveContent = (this.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n this.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) {\n this.playerHandler.prepareToPlay();\n }\n\n this.removeAdMarkers();\n this.updateAdMarkers();\n\n this.playerHandler.updateDisplay();\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n this.enableProgressBar(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (this.remotePlayer.isPaused) {\n this.playerHandler.pause();\n } else if (this.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n this.playerHandler.play();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n } else {\n this.playerHandler.unMute();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n this.isPlayingBreak(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n this.onWhenSkippableChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n this.onCurrentBreakClipTimeChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n this.onBreakClipIdChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n this.liveSeekableRange = event.value;\n }.bind(this)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(this);\n\n playerTarget.pause = function () {\n if (!this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n }.bind(this);\n\n playerTarget.stop = function () {\n this.remotePlayerController.stop();\n }.bind(this);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n\n let mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;\n mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata();\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle'];\n mediaInfo.metadata.images = [{\n 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']\n }];\n\n let request = new chrome.cast.media.LoadRequest(mediaInfo);\n request.currentTime = this.currentMediaTime;\n\n if (ENABLE_ADS) {\n // Add sample breaks and breakClips.\n mediaInfo.breakClips = breakClipsJSON;\n mediaInfo.breaks = breaksJSON;\n } else if (ENABLE_LIVE) {\n // Change the streamType and add live specific metadata.\n mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;\n // TODO: Set the metadata on the receiver side in your implementation.\n // startAbsoluteTime and sectionStartTimeInMedia will be set for you.\n // See https://developers.google.com/cast/docs/caf_receiver/live.\n\n // TODO: Start time, is a fake timestamp. Use correct values for your implementation.\n let currentTime = new Date();\n // Convert from milliseconds to seconds.\n currentTime = currentTime / 1000;\n let sectionStartAbsoluteTime = currentTime;\n\n // Duration should be -1 for live streams.\n mediaInfo.duration = -1;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.startAbsoluteTime = currentTime;\n mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.metadata.sectionStartTimeInMedia = 0;\n mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration'];\n\n let item = new chrome.cast.media.QueueItem(mediaInfo);\n request.queueData = new chrome.cast.media.QueueData();\n request.queueData.items = [item];\n request.queueData.name = \"Sample Queue for Live\";\n }\n\n // Do not immediately start playing if the player was previously PAUSED.\n if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) {\n request.autoplay = false;\n } else {\n request.autoplay = true;\n }\n\n cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(\n function () {\n console.log('Remote media loaded');\n }.bind(this),\n function (errorCode) {\n this.playerState = PLAYER_STATE.IDLE;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n this.playerHandler.updateDisplay();\n }.bind(this));\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(this);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (this.isLiveContent && this.mediaInfo.metadata &&\n this.mediaInfo.metadata.sectionStartTimeInMedia) {\n return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return this.remotePlayer.currentTime;\n }\n }.bind(this);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (this.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (this.mediaInfo.metadata == undefined ||\n this.mediaInfo.metadata.sectionDuration == undefined ||\n this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return this.mediaInfo.metadata.sectionDuration;\n } else {\n return this.remotePlayer.duration;\n }\n }.bind(this);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n this.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(this);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime());\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration());\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n\n if (this.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = this.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n this.remotePlayer.volumeLevel = currentVolume;\n this.remotePlayerController.setVolumeLevel();\n }.bind(this);\n\n playerTarget.mute = function () {\n if (!this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.unMute = function () {\n if (this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.isMuted = function () {\n return this.remotePlayer.isMuted;\n }.bind(this);\n\n playerTarget.seekTo = function (time) {\n this.remotePlayer.currentTime = time;\n this.remotePlayerController.seek();\n }.bind(this);\n\n this.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n }\n this.enableProgressBar(this.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n this.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n this.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n this.removeAdMarkers();\n this.updateAdMarkers();\n } else {\n this.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = this.currentMediaTime;\n\n this.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n this.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n this.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n this.stopProgressTimer();\n this.currentMediaTime = 0;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n this.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (this.isLiveContent && !this.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (this.playerState === PLAYER_STATE.PLAYING ||\n this.playerState === PLAYER_STATE.PAUSED) {\n this.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (this.isLiveContent) {\n seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n this.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n this.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n this.stopProgressTimer();\n\n // Start progress timer\n this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n this.currentMediaTime = this.playerHandler.getCurrentMediaTime();\n this.mediaDuration = this.playerHandler.getMediaDuration();\n\n this.playerHandler.updateDurationDisplay();\n\n if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) {\n this.playerHandler.updateCurrentTimeDisplay();\n this.updateProgressBarByTimer();\n } else if (this.mediaDuration > 0) {\n this.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (this.mediaDuration == null) {\n if (!this.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n \n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n \n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (this.isLiveContent) {\n if (this.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) {\n this.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n this.currentMediaTime = 0;\n this.stopProgressTimer();\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n this.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n this.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (this.whenSkippable == undefined || this.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n this.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', this.seekMediaListener);\n seekable_window.addEventListener('click', this.seekMediaListener);\n progress_indicator.addEventListener('dragend', this.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', this.seekMediaListener);\n seekable_window.removeEventListener('click', this.seekMediaListener);\n progress_indicator.removeEventListener('dragend', this.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n this.fullscreen = !this.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (this.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block'; \n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (cast && cast.framework && cast.framework.CastContext) {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!this.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = function () {\n // Set initial values for title and subtitle.\n if (this.mediaContents && this.mediaContents.length > 0) {\n document.getElementById('media_title').innerHTML =\n this.mediaContents[0]['title'];\n\n document.getElementById('media_subtitle').innerHTML =\n this.mediaContents[this.currentMediaIndex]['subtitle'];\n }\n\n document.getElementById('seekable_window').addEventListener(\n 'click', this.seekMediaListener);\n document.getElementById('progress').addEventListener(\n 'click', this.seekMediaListener);\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', this.seekMediaListener);\n document.getElementById('skip').addEventListener(\n 'click', this.skipAd.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'click', this.playerHandler.mute.bind(this.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', this.playerHandler.unMute.bind(this.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('main_video').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('main_video').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', this.requestFullScreen.bind(this));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', this.cancelFullScreen.bind(this));\n document.addEventListener(\n 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n document.addEventListener(\n 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', this.playerHandler.play.bind(this.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', this.playerHandler.pause.bind(this.playerHandler));\n\n document.getElementById('progress_indicator').draggable = true;\n\n // Set up feature radio buttons\n let noneRadio = document.getElementById('none');\n noneRadio.onclick = function () {\n ENABLE_LIVE = false;\n ENABLE_ADS = false;\n console.log(\"Features have been removed\");\n }\n let adsRadio = document.getElementById('ads');\n adsRadio.onclick = function () {\n ENABLE_LIVE = false;\n ENABLE_ADS = true;\n console.log(\"Ads have been enabled\");\n }\n let liveRadio = document.getElementById('live');\n liveRadio.onclick = function () {\n ENABLE_LIVE = true;\n ENABLE_ADS = false;\n console.log(\"Live has been enabled\");\n }\n\n if (ENABLE_ADS) {\n if (ENABLE_LIVE) {\n console.error('Only one feature can be enabled at a time. Enabling ads.');\n }\n adsRadio.checked = true;\n console.log(\"Ads are enabled\");\n } else if (ENABLE_LIVE) {\n liveRadio.checked = true;\n console.log(\"Live is enabled\");\n } else {\n noneRadio.checked = true;\n console.log(\"No features are enabled\");\n }\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (mediaJSON && mediaJSON['categories'] && mediaJSON['categories'].length > 0) {\n this.mediaContents = mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < this.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', this.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nlet castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n"]} \ No newline at end of file +{"version":3,"sources":["../../CastVideos.js","../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts"],"names":["MEDIA_SOURCE_ROOT","ENABLE_ADS","ENABLE_LIVE","PROGRESS_BAR_WIDTH","FULL_VOLUME_HEIGHT","PLAYER_STATE","CastPlayer","this","playerHandler","PlayerHandler","playerState","playerStateBeforeSwitch","remotePlayer","remotePlayerController","currentMediaTime","mediaDuration","timer","incrementMediaTimeHandler","incrementMediaTime","bind","seekMediaListener","seekMedia","currentMediaIndex","mediaContents","fullscreen","mediaInfo","whenSkippable","liveSeekableRange","isLiveContent","setupLocalPlayer","addVideoThumbs","initializeUI","mediaJSON","categories","prototype","initializeCastPlayer","options","receiverApplicationId","autoJoinPolicy","chrome","cast","AutoJoinPolicy","ORIGIN_SCOPED","framework","CastContext","getInstance","setOptions","RemotePlayer","RemotePlayerController","addEventListener","RemotePlayerEventType","IS_CONNECTED_CHANGED","e","switchPlayer","value","stopProgressTimer","resetVolumeSlider","isConnected","pause","setupRemotePlayer","castPlayer","target","setTarget","play","isMediaLoaded","document","getElementById","style","display","load","stop","mediaIndex","prepareToPlay","getMediaDuration","updateDurationDisplay","startProgressTimer","updateDisplay","getCurrentMediaTime","updateCurrentTimeDisplay","setTimeString","element","time","setVolume","volumeSliderPosition","mute","unMute","isMuted","seekTo","live_indicator","removeAdMarkers","localPlayer","onMediaLoadedLocally","playerTarget","src","currentTime","duration","innerHTML","currentTimeString","getMediaTimeString","volume","p","height","marginTop","muted","DEFAULT_VOLUME","showFullscreenButton","enableProgressBar","MEDIA_INFO_CHANGED","event","session","getCurrentSession","media","getMediaSession","streamType","StreamType","LIVE","updateAdMarkers","CAN_SEEK_CHANGED","IS_PAUSED_CHANGED","isPaused","IS_MUTED_CHANGED","VOLUME_LEVEL_CHANGED","newVolume","volumeLevel","IS_PLAYING_BREAK_CHANGED","isPlayingBreak","WHEN_SKIPPABLE_CHANGED","onWhenSkippableChanged","CURRENT_BREAK_CLIP_TIME_CHANGED","onCurrentBreakClipTimeChanged","BREAK_CLIP_ID_CHANGED","onBreakClipIdChanged","LIVE_SEEKABLE_RANGE_CHANGED","console","log","playOrPause","MediaInfo","BUFFERED","metadata","TvShowMediaMetadata","title","subtitle","images","url","request","LoadRequest","breakClips","breakClipsJSON","breaks","breaksJSON","Date","sectionStartAbsoluteTime","startAbsoluteTime","sectionStartTimeInMedia","sectionDuration","item","QueueItem","queueData","QueueData","items","name","autoplay","loadMedia","then","errorCode","getErrorMessage","undefined","castSession","vi","length","mediaTitle","mediaEpisodeTitle","mediaSubtitle","episodeTitle","getCastDevice","friendlyName","Math","abs","getEstimatedTime","end","getClockTimeString","currentVolume","setVolumeLevel","muteOrUnmute","seek","canSeek","opacity","hideFullscreenButton","getSessionState","SessionState","SESSION_RESUMED","selectMedia","currentMediaInfo","marginLeft","width","seekable_window","unseekable_overlay","position","parseInt","offsetX","pi","progress","seekTime","pp","pw","currentTarget","id","mouseEvent","pos","offsetY","clientHeight","setInterval","clearInterval","updateProgressBarByTimer","endPlayback","progressBar","isNaN","floor","seekableMediaPosition","max","seekableWidth","unseekableMediaPosition","start","unseekableWidth","skip","seekable_window_1","unseekable_overlay_1","timestamp","isNegative","hours","minutes","seconds","date","getHours","getMinutes","getSeconds","ampm","slice","contentDuration","i","adBreak","isEmbedded","adPositionToMargin","querySelectorAll","forEach","adMarker","remove","currentBreakClipTime","skipAd","enable","progress_indicator","backgroundImage","cursor","draggable","removeEventListener","requestFullScreen","requestMethod","call","cancelFullScreen","fullscreenChangeHandler","fullscreen_expand","fullscreen_collapse","showMediaControl","media_control","hideMediaControl","context","showVolumeSlider","hideVolumeSlider","defaultVolumeSliderHeight","main_video","noneRadio","onclick","adsRadio","liveRadio","error","checked","ni","newdiv","divIdName","createElement","setAttribute","appendChild","code","ErrorCode","API_NOT_INITIALIZED","description","CANCEL","CHANNEL_ERROR","EXTENSION_MISSING","INVALID_PARAMETER","RECEIVER_UNAVAILABLE","SESSION_ERROR","TIMEOUT","window","isAvailable","__decorate","decorators","key","desc","d","c","arguments","r","Object","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","NgCastComponent","ngCastService","ngOnInit","initializeCastApi","castingStatus","getStatus","openSession","discoverDevices","closeSession","Component","selector","template","NgCastService","_this","status","casting","onInitSuccess","onError","err","self","subj","Subject","requestSession","s","setCasting","next","onMediaDiscovered","script","body","globalThis","currentMedia","onMediaError","sessionRequest","SessionRequest","DEFAULT_MEDIA_RECEIVER_APP_ID","apiConfig","ApiConfig","ReceiverAvailability","AVAILABLE","initialize","Injectable","NgCastModule","NgModule","schemas","CUSTOM_ELEMENTS_SCHEMA","imports","CommonModule","exports","providers","declarations"],"mappings":"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","sourcesContent":["'use strict';\n\n/** Cleaner UI for demo purposes. */\nconst DEMO_MODE = false;\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/';\n\n/**\n * Controls if Ads are enabled. Controlled by radio button.\n * @type {boolean}\n */\nlet ENABLE_ADS = false;\n\n/**\n * Controls if Live stream is played. Controlled by radio button.\n * @type {boolean}\n */\nlet ENABLE_LIVE = false;\n\n/**\n * Buffer to decide if the live indicator should be displayed to show that\n * playback is at the playback head.\n * @const {number}\n */\nconst LIVE_INDICATOR_BUFFER = 50;\n\n/**\n * Width of progress bar in pixels.\n * @const {number}\n */\nconst PROGRESS_BAR_WIDTH = 700;\n\n/**\n * Time in milliseconds for minimal progress update.\n * @const {number}\n */\nconst TIMER_STEP = 1000;\n\n/**\n * Cast volume upon initial connection.\n * @const {number}\n */\nconst DEFAULT_VOLUME = 0.5;\n\n/**\n * Height, in pixels, of volume bar.\n * @const {number}\n */\nconst FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.setupLocalPlayer();\n this.addVideoThumbs();\n this.initializeUI();\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = function () {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = 'C0868879';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n this.remotePlayer = new cast.framework.RemotePlayer();\n this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer);\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n function (e) {\n this.switchPlayer(e.value);\n }.bind(this)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = function () {\n this.playerStateBeforeSwitch = this.playerState;\n\n this.stopProgressTimer();\n this.resetVolumeSlider();\n\n // Session is active\n if (cast && cast.framework && this.remotePlayer.isConnected) {\n // Pause local playback\n this.playerHandler.pause();\n this.setupRemotePlayer();\n } else {\n this.setupLocalPlayer();\n }\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n this.updateDurationDisplay = function () {\n this.target.updateDurationDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = function () {\n // Cleanup remote player UI\n let live_indicator = document.getElementById('live_indicator');\n if (live_indicator && live_indicator.style && live_indicator.style.display) {\n live_indicator.style.display = 'none';\n }\n\n this.removeAdMarkers();\n document.getElementById('skip').style.display = 'none';\n\n var localPlayer = document.getElementById('video_element');\n if (typeof localPlayer !== 'undefined' && localPlayer)\n localPlayer.addEventListener(\n 'loadeddata', this.onMediaLoadedLocally.bind(this));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src = this.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n if (!mediaIndex) {\n return (localPlayer.src !== null && localPlayer.src !== \"\");\n } else {\n return (localPlayer.src == this.mediaContents[mediaIndex]['sources'][0]);\n }\n }.bind(this);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplay = function () {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n };\n\n playerTarget.updateCurrentTimeDisplay = function () {\n // Increment for local playback\n this.currentMediaTime += 1;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.currentMediaTime);\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.mediaDuration);\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n if (currentTimeString !== null) {\n element.style.display = '';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n if (localPlayer) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n }\n\n var p = document.getElementById('audio_bg_level');\n if (typeof p !== 'undefined' && p) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n }\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n if (localPlayer)\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n this.playerHandler.setTarget(playerTarget);\n\n this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n this.showFullscreenButton();\n\n this.enableProgressBar(true);\n\n if (this.currentMediaTime > 0) {\n this.playerHandler.load();\n this.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n this.mediaInfo = media.media;\n\n if (this.mediaInfo) {\n this.isLiveContent = (this.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n this.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) {\n this.playerHandler.prepareToPlay();\n }\n\n this.removeAdMarkers();\n this.updateAdMarkers();\n\n this.playerHandler.updateDisplay();\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n this.enableProgressBar(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (this.remotePlayer.isPaused) {\n this.playerHandler.pause();\n } else if (this.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n this.playerHandler.play();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n } else {\n this.playerHandler.unMute();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n this.isPlayingBreak(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n this.onWhenSkippableChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n this.onCurrentBreakClipTimeChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n this.onBreakClipIdChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n this.liveSeekableRange = event.value;\n }.bind(this)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(this);\n\n playerTarget.pause = function () {\n if (!this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n }.bind(this);\n\n playerTarget.stop = function () {\n this.remotePlayerController.stop();\n }.bind(this);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n\n let mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;\n mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata();\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle'];\n mediaInfo.metadata.images = [{\n 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']\n }];\n\n let request = new chrome.cast.media.LoadRequest(mediaInfo);\n request.currentTime = this.currentMediaTime;\n\n if (ENABLE_ADS) {\n // Add sample breaks and breakClips.\n mediaInfo.breakClips = breakClipsJSON;\n mediaInfo.breaks = breaksJSON;\n } else if (ENABLE_LIVE) {\n // Change the streamType and add live specific metadata.\n mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;\n // TODO: Set the metadata on the receiver side in your implementation.\n // startAbsoluteTime and sectionStartTimeInMedia will be set for you.\n // See https://developers.google.com/cast/docs/caf_receiver/live.\n\n // TODO: Start time, is a fake timestamp. Use correct values for your implementation.\n let currentTime = new Date();\n // Convert from milliseconds to seconds.\n currentTime = currentTime / 1000;\n let sectionStartAbsoluteTime = currentTime;\n\n // Duration should be -1 for live streams.\n mediaInfo.duration = -1;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.startAbsoluteTime = currentTime;\n mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.metadata.sectionStartTimeInMedia = 0;\n mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration'];\n\n let item = new chrome.cast.media.QueueItem(mediaInfo);\n request.queueData = new chrome.cast.media.QueueData();\n request.queueData.items = [item];\n request.queueData.name = \"Sample Queue for Live\";\n }\n\n // Do not immediately start playing if the player was previously PAUSED.\n if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) {\n request.autoplay = false;\n } else {\n request.autoplay = true;\n }\n\n cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(\n function () {\n console.log('Remote media loaded');\n }.bind(this),\n function (errorCode) {\n this.playerState = PLAYER_STATE.IDLE;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n this.playerHandler.updateDisplay();\n }.bind(this));\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(this);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (this.isLiveContent && this.mediaInfo.metadata &&\n this.mediaInfo.metadata.sectionStartTimeInMedia) {\n return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return this.remotePlayer.currentTime;\n }\n }.bind(this);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (this.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (this.mediaInfo.metadata == undefined ||\n this.mediaInfo.metadata.sectionDuration == undefined ||\n this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return this.mediaInfo.metadata.sectionDuration;\n } else {\n return this.remotePlayer.duration;\n }\n }.bind(this);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n this.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(this);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime());\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration());\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n\n if (this.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = this.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n this.remotePlayer.volumeLevel = currentVolume;\n this.remotePlayerController.setVolumeLevel();\n }.bind(this);\n\n playerTarget.mute = function () {\n if (!this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.unMute = function () {\n if (this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.isMuted = function () {\n return this.remotePlayer.isMuted;\n }.bind(this);\n\n playerTarget.seekTo = function (time) {\n this.remotePlayer.currentTime = time;\n this.remotePlayerController.seek();\n }.bind(this);\n\n this.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n }\n this.enableProgressBar(this.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n this.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n this.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n this.removeAdMarkers();\n this.updateAdMarkers();\n } else {\n this.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = this.currentMediaTime;\n\n this.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n this.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n this.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n this.stopProgressTimer();\n this.currentMediaTime = 0;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n this.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (this.isLiveContent && !this.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (this.playerState === PLAYER_STATE.PLAYING ||\n this.playerState === PLAYER_STATE.PAUSED) {\n this.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (this.isLiveContent) {\n seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n this.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n this.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n this.stopProgressTimer();\n\n // Start progress timer\n this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n this.currentMediaTime = this.playerHandler.getCurrentMediaTime();\n this.mediaDuration = this.playerHandler.getMediaDuration();\n\n this.playerHandler.updateDurationDisplay();\n\n if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) {\n this.playerHandler.updateCurrentTimeDisplay();\n this.updateProgressBarByTimer();\n } else if (this.mediaDuration > 0) {\n this.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (this.mediaDuration == null) {\n if (!this.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n \n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n \n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (this.isLiveContent) {\n if (this.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) {\n this.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n this.currentMediaTime = 0;\n this.stopProgressTimer();\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n this.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n this.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (this.whenSkippable == undefined || this.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n this.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', this.seekMediaListener);\n seekable_window.addEventListener('click', this.seekMediaListener);\n progress_indicator.addEventListener('dragend', this.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', this.seekMediaListener);\n seekable_window.removeEventListener('click', this.seekMediaListener);\n progress_indicator.removeEventListener('dragend', this.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n this.fullscreen = !this.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (this.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block'; \n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!this.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = function () {\n // Set initial values for title and subtitle.\n if (this.mediaContents && this.mediaContents.length > 0) {\n document.getElementById('media_title').innerHTML =\n this.mediaContents[0]['title'];\n\n document.getElementById('media_subtitle').innerHTML =\n this.mediaContents[this.currentMediaIndex]['subtitle'];\n }\n\n document.getElementById('seekable_window').addEventListener(\n 'click', this.seekMediaListener);\n document.getElementById('progress').addEventListener(\n 'click', this.seekMediaListener);\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', this.seekMediaListener);\n document.getElementById('skip').addEventListener(\n 'click', this.skipAd.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'click', this.playerHandler.mute.bind(this.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', this.playerHandler.unMute.bind(this.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n\n let main_video = document.getElementById('main_video');\n if (typeof main_video !== 'undefined' && main_video) {\n main_video.addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n main_video.addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n }\n \n document.getElementById('media_control').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', this.requestFullScreen.bind(this));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', this.cancelFullScreen.bind(this));\n document.addEventListener(\n 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n document.addEventListener(\n 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', this.playerHandler.play.bind(this.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', this.playerHandler.pause.bind(this.playerHandler));\n\n document.getElementById('progress_indicator').draggable = true;\n\n // Set up feature radio buttons\n let noneRadio = document.getElementById('none');\n noneRadio.onclick = function () {\n ENABLE_LIVE = false;\n ENABLE_ADS = false;\n console.log(\"Features have been removed\");\n }\n let adsRadio = document.getElementById('ads');\n adsRadio.onclick = function () {\n ENABLE_LIVE = false;\n ENABLE_ADS = true;\n console.log(\"Ads have been enabled\");\n }\n let liveRadio = document.getElementById('live');\n liveRadio.onclick = function () {\n ENABLE_LIVE = true;\n ENABLE_ADS = false;\n console.log(\"Live has been enabled\");\n }\n\n if (ENABLE_ADS) {\n if (ENABLE_LIVE) {\n console.error('Only one feature can be enabled at a time. Enabling ads.');\n }\n adsRadio.checked = true;\n console.log(\"Ads are enabled\");\n } else if (ENABLE_LIVE) {\n liveRadio.checked = true;\n console.log(\"Live is enabled\");\n } else {\n noneRadio.checked = true;\n console.log(\"No features are enabled\");\n }\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) {\n this.mediaContents = this.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < this.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', this.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID);\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n };\n\n play = () => { \n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n globalThis.CastPlayer.addVideoThumbs();\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n"]} \ No newline at end of file diff --git a/dist/esm2015/index.js b/dist/esm2015/index.js index bd4f3d4..e809f24 100644 --- a/dist/esm2015/index.js +++ b/dist/esm2015/index.js @@ -1,5 +1,5 @@ -export * from './ng.cast.module'; -export * from './shared/ng-cast.service'; // ------ project path -------- | --- lib --- import "/home/thinker/dev/thinkam/ngCast/CastVideos.js"; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsMEJBQTBCLENBQUM7QUFFakMsNkNBQTZDO0FBQ3JELE9BQU8sZ0RBQWdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL25nLmNhc3QubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vc2hhcmVkL25nLWNhc3Quc2VydmljZSc7XG5cbiAgICAgICAgLy8gLS0tLS0tIHByb2plY3QgcGF0aCAtLS0tLS0tLSB8IC0tLSBsaWIgLS0tXG5pbXBvcnQgXCIvaG9tZS90aGlua2VyL2Rldi90aGlua2FtL25nQ2FzdC9DYXN0VmlkZW9zLmpzXCI7Il19 \ No newline at end of file +export * from './ng.cast.module'; +export * from './shared/ng-cast.service'; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBUSw2Q0FBNkM7QUFDckQsT0FBTyxnREFBZ0QsQ0FBQztBQUV4RCxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIgICAgICAgIC8vIC0tLS0tLSBwcm9qZWN0IHBhdGggLS0tLS0tLS0gfCAtLS0gbGliIC0tLVxuaW1wb3J0IFwiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvQ2FzdFZpZGVvcy5qc1wiO1xuXG5leHBvcnQgKiBmcm9tICcuL25nLmNhc3QubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vc2hhcmVkL25nLWNhc3Quc2VydmljZSc7XG4iXX0= \ No newline at end of file diff --git a/dist/esm2015/ng-cast.component.js b/dist/esm2015/ng-cast.component.js index b7c9c81..30e44b4 100644 --- a/dist/esm2015/ng-cast.component.js +++ b/dist/esm2015/ng-cast.component.js @@ -18,7 +18,7 @@ let NgCastComponent = class NgCastComponent { this.ngCastService.discoverDevices(); } closeSession() { - this.ngCastService.stop(); + this.ngCastService.discoverDevices(); } }; NgCastComponent = tslib_1.__decorate([ @@ -29,4 +29,4 @@ NgCastComponent = tslib_1.__decorate([ }) ], NgCastComponent); export { NgCastComponent }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJuZy1jYXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQVdsRCxJQUFhLGVBQWUsR0FBNUIsTUFBYSxlQUFlO0lBSTFCLFlBQ1UsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7SUFDbEMsQ0FBQztJQUVMLFFBQVE7UUFDTixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsR0FBRyxVQUFVLFdBQW9CO1lBQ25FLElBQUksV0FBVyxFQUFFO2dCQUNmLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ25DO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDNUIsQ0FBQztDQUVGLENBQUE7QUE3QlksZUFBZTtJQVAzQixTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsU0FBUztRQUNuQixzTkFBdUM7O0tBSXhDLENBQUM7R0FDVyxlQUFlLENBNkIzQjtTQTdCWSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTmdDYXN0U2VydmljZSB9IGZyb20gJy4vc2hhcmVkL25nLWNhc3Quc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nLWNhc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbmctY2FzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW1xuICAgICcuL25nLWNhc3QuY29tcG9uZW50LnNjc3MnXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTmdDYXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY2FzdGluZ1N0YXR1czogYW55O1xuICB3aW5kb3c6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nQ2FzdFNlcnZpY2U6IE5nQ2FzdFNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLndpbmRvdyA9IHdpbmRvdztcblxuICAgIGxldCBuZ0Nhc3RTZXJ2aWNlID0gdGhpcy5uZ0Nhc3RTZXJ2aWNlO1xuICAgIHRoaXMud2luZG93WydfX29uR0Nhc3RBcGlBdmFpbGFibGUnXSA9IGZ1bmN0aW9uIChpc0F2YWlsYWJsZTogYm9vbGVhbikge1xuICAgICAgaWYgKGlzQXZhaWxhYmxlKSB7XG4gICAgICAgIG5nQ2FzdFNlcnZpY2UuaW5pdGlhbGl6ZUNhc3RBcGkoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5jYXN0aW5nU3RhdHVzID0gdGhpcy5uZ0Nhc3RTZXJ2aWNlLmdldFN0YXR1cygpO1xuICB9XG5cbiAgb3BlblNlc3Npb24oKSB7XG4gICAgdGhpcy5uZ0Nhc3RTZXJ2aWNlLmRpc2NvdmVyRGV2aWNlcygpO1xuICB9XG5cbiAgY2xvc2VTZXNzaW9uKCkge1xuICAgIHRoaXMubmdDYXN0U2VydmljZS5zdG9wKCk7XG4gIH1cblxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJuZy1jYXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQVdsRCxJQUFhLGVBQWUsR0FBNUIsTUFBYSxlQUFlO0lBSTFCLFlBQ1UsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7SUFDbEMsQ0FBQztJQUVMLFFBQVE7UUFDTixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsR0FBRyxVQUFVLFdBQW9CO1lBQ25FLElBQUksV0FBVyxFQUFFO2dCQUNmLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ25DO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkMsQ0FBQztDQUVGLENBQUE7QUE3QlksZUFBZTtJQVAzQixTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsU0FBUztRQUNuQixzTkFBdUM7O0tBSXhDLENBQUM7R0FDVyxlQUFlLENBNkIzQjtTQTdCWSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTmdDYXN0U2VydmljZSB9IGZyb20gJy4vc2hhcmVkL25nLWNhc3Quc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nLWNhc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbmctY2FzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW1xuICAgICcuL25nLWNhc3QuY29tcG9uZW50LnNjc3MnXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTmdDYXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY2FzdGluZ1N0YXR1czogYW55O1xuICB3aW5kb3c6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nQ2FzdFNlcnZpY2U6IE5nQ2FzdFNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLndpbmRvdyA9IHdpbmRvdztcblxuICAgIGxldCBuZ0Nhc3RTZXJ2aWNlID0gdGhpcy5uZ0Nhc3RTZXJ2aWNlO1xuICAgIHRoaXMud2luZG93WydfX29uR0Nhc3RBcGlBdmFpbGFibGUnXSA9IGZ1bmN0aW9uIChpc0F2YWlsYWJsZTogYm9vbGVhbikge1xuICAgICAgaWYgKGlzQXZhaWxhYmxlKSB7XG4gICAgICAgIG5nQ2FzdFNlcnZpY2UuaW5pdGlhbGl6ZUNhc3RBcGkoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5jYXN0aW5nU3RhdHVzID0gdGhpcy5uZ0Nhc3RTZXJ2aWNlLmdldFN0YXR1cygpO1xuICB9XG5cbiAgb3BlblNlc3Npb24oKSB7XG4gICAgdGhpcy5uZ0Nhc3RTZXJ2aWNlLmRpc2NvdmVyRGV2aWNlcygpO1xuICB9XG5cbiAgY2xvc2VTZXNzaW9uKCkge1xuICAgIHRoaXMubmdDYXN0U2VydmljZS5kaXNjb3ZlckRldmljZXMoKTtcbiAgfVxuXG59XG4iXX0= \ No newline at end of file diff --git a/dist/esm2015/ng.cast.module.js b/dist/esm2015/ng.cast.module.js index b282a73..6861006 100644 --- a/dist/esm2015/ng.cast.module.js +++ b/dist/esm2015/ng.cast.module.js @@ -17,4 +17,4 @@ NgCastModule = tslib_1.__decorate([ }) ], NgCastModule); export { NgCastModule }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmcuY2FzdC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJuZy5jYXN0Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQVd6RCxJQUFhLFlBQVksR0FBekIsTUFBYSxZQUFZO0NBQUksQ0FBQTtBQUFoQixZQUFZO0lBVHhCLFFBQVEsQ0FBQztRQUNSLE9BQU8sRUFBRSxDQUFFLHNCQUFzQixDQUFFO1FBQ25DLE9BQU8sRUFBRTtZQUNQLFlBQVk7U0FDYjtRQUNELE9BQU8sRUFBRSxDQUFDLGVBQWUsQ0FBQztRQUMxQixTQUFTLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDMUIsWUFBWSxFQUFFLENBQUMsZUFBZSxDQUFDO0tBQ2hDLENBQUM7R0FDVyxZQUFZLENBQUk7U0FBaEIsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdDYXN0Q29tcG9uZW50IH0gZnJvbSAnLi9uZy1jYXN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ0Nhc3RTZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvbmctY2FzdC5zZXJ2aWNlJztcblxuQE5nTW9kdWxlKHtcbiAgc2NoZW1hczogWyBDVVNUT01fRUxFTUVOVFNfU0NIRU1BIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGVcbiAgXSxcbiAgZXhwb3J0czogW05nQ2FzdENvbXBvbmVudF0sXG4gIHByb3ZpZGVyczogW05nQ2FzdFNlcnZpY2VdLFxuICBkZWNsYXJhdGlvbnM6IFtOZ0Nhc3RDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIE5nQ2FzdE1vZHVsZSB7IH1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmcuY2FzdC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJuZy5jYXN0Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQVl6RCxJQUFhLFlBQVksR0FBekIsTUFBYSxZQUFZO0NBQUksQ0FBQTtBQUFoQixZQUFZO0lBVHhCLFFBQVEsQ0FBQztRQUNSLE9BQU8sRUFBRSxDQUFFLHNCQUFzQixDQUFFO1FBQ25DLE9BQU8sRUFBRTtZQUNQLFlBQVk7U0FDYjtRQUNELE9BQU8sRUFBRSxDQUFDLGVBQWUsQ0FBQztRQUMxQixTQUFTLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDMUIsWUFBWSxFQUFFLENBQUMsZUFBZSxDQUFDO0tBQ2hDLENBQUM7R0FDVyxZQUFZLENBQUk7U0FBaEIsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdDYXN0Q29tcG9uZW50IH0gZnJvbSAnLi9uZy1jYXN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ0Nhc3RTZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvbmctY2FzdC5zZXJ2aWNlJztcblxuXG5ATmdNb2R1bGUoe1xuICBzY2hlbWFzOiBbIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEgXSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZVxuICBdLFxuICBleHBvcnRzOiBbTmdDYXN0Q29tcG9uZW50XSxcbiAgcHJvdmlkZXJzOiBbTmdDYXN0U2VydmljZV0sXG4gIGRlY2xhcmF0aW9uczogW05nQ2FzdENvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgTmdDYXN0TW9kdWxlIHsgfVxuIl19 \ No newline at end of file diff --git a/dist/esm2015/shared/ng-cast.service.js b/dist/esm2015/shared/ng-cast.service.js index 32b92cf..b823e94 100644 --- a/dist/esm2015/shared/ng-cast.service.js +++ b/dist/esm2015/shared/ng-cast.service.js @@ -37,7 +37,7 @@ let NgCastService = class NgCastService { script.setAttribute('type', 'text/javascript'); script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1'); window['document'].body.appendChild(script); - mediaJSON.categories = categories; + globalThis.CastPlayer.mediaJSON.categories = categories; }; this.play = () => { this.currentMedia.play(null); @@ -51,6 +51,9 @@ let NgCastService = class NgCastService { this.onMediaError = (err) => { console.error('Error launching media', err); }; + globalThis.CastPlayer.mediaJSON = { + categories: [] + }; } initializeCastApi() { this.cast = this.window['chrome'].cast; @@ -60,6 +63,7 @@ let NgCastService = class NgCastService { } ; setCasting(value) { + globalThis.CastPlayer.addVideoThumbs(); this.status.casting = value; } getStatus() { @@ -70,4 +74,4 @@ NgCastService = tslib_1.__decorate([ Injectable() ], NgCastService); export { NgCastService }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3RoaW5rZXIvZGV2L3RoaW5rYW0vbmdDYXN0LyIsInNvdXJjZXMiOlsic2hhcmVkL25nLWNhc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSy9CLElBQWEsYUFBYSxHQUExQixNQUFhLGFBQWE7SUFTeEI7UUFOUSxXQUFNLEdBQVEsTUFBTSxDQUFDO1FBRXRCLFdBQU0sR0FBRztZQUNkLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztRQWdCRixrQkFBYSxHQUFHO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQztRQUVGLFlBQU8sR0FBRyxVQUFVLEdBQVE7WUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUM7UUFFRixvQkFBZSxHQUFHLEdBQUcsRUFBRTtZQUNyQixJQUFJLElBQUksR0FBUSxJQUFJLENBQUM7WUFDckIsSUFBSSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QixDQUFDLEVBQUUsVUFBVSxHQUFRO2dCQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO29CQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztvQkFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDckI7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsRUFBRSxHQUFHLENBQUMsQ0FBQztpQkFDckQ7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO1FBRUYsc0JBQWlCLEdBQUcsQ0FBQyxVQUFpQixFQUFFLEVBQUU7WUFDeEMsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4RCxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLDRFQUE0RSxDQUFDLENBQUM7WUFDekcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFNUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDcEMsQ0FBQyxDQUFDO1FBRUYsU0FBSSxHQUFHLEdBQUcsRUFBRTtZQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQztRQUVGLFVBQUssR0FBRyxHQUFHLEVBQUU7WUFDWCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUM7UUFFRixTQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ1YsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDO1FBRUYsaUJBQVksR0FBRyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDO0lBOURGLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3ZDLElBQUksY0FBYyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUNqRyxJQUFJLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFDcEQsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUNULENBQUMsTUFBVyxFQUFFLEVBQUUsR0FBRyxJQUFJLE1BQU0sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUNsRixDQUFDO1FBQ0YsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFBQSxDQUFDO0lBc0RGLFVBQVUsQ0FBQyxLQUFVO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQTtJQUNwQixDQUFDO0NBQ0YsQ0FBQTtBQWxGWSxhQUFhO0lBRHpCLFVBQVUsRUFBRTtHQUNBLGFBQWEsQ0FrRnpCO1NBbEZZLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuZGVjbGFyZSB2YXIgbWVkaWFKU09OOiBhbnk7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ0Nhc3RTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjYXN0OiBhbnk7XG4gIHByaXZhdGUgY3VycmVudE1lZGlhOiBhbnk7XG4gIHByaXZhdGUgd2luZG93OiBhbnkgPSB3aW5kb3c7XG5cbiAgcHVibGljIHN0YXR1cyA9IHtcbiAgICBjYXN0aW5nOiBmYWxzZVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIFxuICB9XG5cbiAgaW5pdGlhbGl6ZUNhc3RBcGkoKSB7XG4gICAgdGhpcy5jYXN0ID0gdGhpcy53aW5kb3dbJ2Nocm9tZSddLmNhc3Q7XG4gICAgbGV0IHNlc3Npb25SZXF1ZXN0ID0gbmV3IHRoaXMuY2FzdC5TZXNzaW9uUmVxdWVzdCh0aGlzLmNhc3QubWVkaWEuREVGQVVMVF9NRURJQV9SRUNFSVZFUl9BUFBfSUQpO1xuICAgIGxldCBhcGlDb25maWcgPSBuZXcgdGhpcy5jYXN0LkFwaUNvbmZpZyhzZXNzaW9uUmVxdWVzdCxcbiAgICAgICgpID0+IHsgfSxcbiAgICAgIChzdGF0dXM6IGFueSkgPT4geyBpZiAoc3RhdHVzID09PSB0aGlzLmNhc3QuUmVjZWl2ZXJBdmFpbGFiaWxpdHkuQVZBSUxBQkxFKSB7IH0gfVxuICAgICk7XG4gICAgbGV0IHggPSB0aGlzLmNhc3QuaW5pdGlhbGl6ZShhcGlDb25maWcsIHRoaXMub25Jbml0U3VjY2VzcywgdGhpcy5vbkVycm9yKTtcbiAgfTtcblxuICBvbkluaXRTdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUubG9nKCdHQ2FzdCBpbml0aWFsaXphdGlvbiBzdWNjZXNzJyk7XG4gIH07XG5cbiAgb25FcnJvciA9IGZ1bmN0aW9uIChlcnI6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCdHQ2FzdCBpbml0aWFsaXphdGlvbiBmYWlsZWQnLCBlcnIpO1xuICB9O1xuXG4gIGRpc2NvdmVyRGV2aWNlcyA9ICgpID0+IHtcbiAgICBsZXQgc2VsZjogYW55ID0gdGhpcztcbiAgICBsZXQgc3ViaiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgdGhpcy5jYXN0LnJlcXVlc3RTZXNzaW9uKChzOiBhbnkpID0+IHtcbiAgICAgIHNlbGYuc2Vzc2lvbiA9IHM7XG4gICAgICBzZWxmLnNldENhc3RpbmcodHJ1ZSk7XG4gICAgICBzdWJqLm5leHQoJ0NPTk5FQ1RFRCcpO1xuICAgIH0sIGZ1bmN0aW9uIChlcnI6IGFueSkge1xuICAgICAgc2VsZi5zZXRDYXN0aW5nKGZhbHNlKTtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ2NhbmNlbCcpIHtcbiAgICAgICAgc2VsZi5zZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBzdWJqLm5leHQoJ0NBTkNFTCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc2VsZWN0aW5nIGEgY2FzdCBkZXZpY2UnLCBlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzdWJqO1xuICB9O1xuXG4gIG9uTWVkaWFEaXNjb3ZlcmVkID0gKGNhdGVnb3JpZXM6IGFueVtdKSA9PiB7XG4gICAgbGV0IHNjcmlwdCA9IHdpbmRvd1snZG9jdW1lbnQnXS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvamF2YXNjcmlwdCcpO1xuICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3NyYycsICdodHRwczovL3d3dy5nc3RhdGljLmNvbS9jdi9qcy9zZW5kZXIvdjEvY2FzdF9zZW5kZXIuanM/bG9hZENhc3RGcmFtZXdvcms9MScpO1xuICAgIHdpbmRvd1snZG9jdW1lbnQnXS5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICBtZWRpYUpTT04uY2F0ZWdvcmllcyA9IGNhdGVnb3JpZXM7XG4gIH07XG5cbiAgcGxheSA9ICgpID0+IHtcbiAgICB0aGlzLmN1cnJlbnRNZWRpYS5wbGF5KG51bGwpO1xuICB9O1xuXG4gIHBhdXNlID0gKCkgPT4ge1xuICAgIHRoaXMuY3VycmVudE1lZGlhLnBhdXNlKG51bGwpO1xuICB9O1xuXG4gIHN0b3AgPSAoKSA9PiB7XG4gICAgdGhpcy5jdXJyZW50TWVkaWEuc3RvcChudWxsKTtcbiAgfTtcblxuICBvbk1lZGlhRXJyb3IgPSAoZXJyOiBhbnkpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsYXVuY2hpbmcgbWVkaWEnLCBlcnIpO1xuICB9O1xuXG4gIHNldENhc3RpbmcodmFsdWU6IGFueSkge1xuICAgIHRoaXMuc3RhdHVzLmNhc3RpbmcgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldFN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXNcbiAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3RoaW5rZXIvZGV2L3RoaW5rYW0vbmdDYXN0LyIsInNvdXJjZXMiOlsic2hhcmVkL25nLWNhc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTy9CLElBQWEsYUFBYSxHQUExQixNQUFhLGFBQWE7SUFTeEI7UUFOUSxXQUFNLEdBQVEsTUFBTSxDQUFDO1FBRXRCLFdBQU0sR0FBRztZQUNkLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztRQWtCRixrQkFBYSxHQUFHO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQztRQUVGLFlBQU8sR0FBRyxVQUFVLEdBQVE7WUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUM7UUFFRixvQkFBZSxHQUFHLEdBQUcsRUFBRTtZQUNyQixJQUFJLElBQUksR0FBUSxJQUFJLENBQUM7WUFDckIsSUFBSSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QixDQUFDLEVBQUUsVUFBVSxHQUFRO2dCQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO29C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IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgdmFyIENhc3RQbGF5ZXI6IGFueTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5nQ2FzdFNlcnZpY2Uge1xuICBwcml2YXRlIGNhc3Q6IGFueTtcbiAgcHJpdmF0ZSBjdXJyZW50TWVkaWE6IGFueTtcbiAgcHJpdmF0ZSB3aW5kb3c6IGFueSA9IHdpbmRvdztcblxuICBwdWJsaWMgc3RhdHVzID0ge1xuICAgIGNhc3Rpbmc6IGZhbHNlXG4gIH07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLm1lZGlhSlNPTiA9IHtcbiAgICAgIGNhdGVnb3JpZXM6IFtdXG4gICAgfTtcbiAgfVxuXG4gIGluaXRpYWxpemVDYXN0QXBpKCkge1xuICAgIHRoaXMuY2FzdCA9IHRoaXMud2luZG93WydjaHJvbWUnXS5jYXN0O1xuICAgIGxldCBzZXNzaW9uUmVxdWVzdCA9IG5ldyB0aGlzLmNhc3QuU2Vzc2lvblJlcXVlc3QodGhpcy5jYXN0Lm1lZGlhLkRFRkFVTFRfTUVESUFfUkVDRUlWRVJfQVBQX0lEKTtcbiAgICBsZXQgYXBpQ29uZmlnID0gbmV3IHRoaXMuY2FzdC5BcGlDb25maWcoc2Vzc2lvblJlcXVlc3QsXG4gICAgICAoKSA9PiB7IH0sXG4gICAgICAoc3RhdHVzOiBhbnkpID0+IHsgaWYgKHN0YXR1cyA9PT0gdGhpcy5jYXN0LlJlY2VpdmVyQXZhaWxhYmlsaXR5LkFWQUlMQUJMRSkgeyB9IH1cbiAgICApO1xuICAgIGxldCB4ID0gdGhpcy5jYXN0LmluaXRpYWxpemUoYXBpQ29uZmlnLCB0aGlzLm9uSW5pdFN1Y2Nlc3MsIHRoaXMub25FcnJvcik7XG4gIH07XG5cbiAgb25Jbml0U3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zb2xlLmxvZygnR0Nhc3QgaW5pdGlhbGl6YXRpb24gc3VjY2VzcycpO1xuICB9O1xuXG4gIG9uRXJyb3IgPSBmdW5jdGlvbiAoZXJyOiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZygnR0Nhc3QgaW5pdGlhbGl6YXRpb24gZmFpbGVkJywgZXJyKTtcbiAgfTtcblxuICBkaXNjb3ZlckRldmljZXMgPSAoKSA9PiB7XG4gICAgbGV0IHNlbGY6IGFueSA9IHRoaXM7XG4gICAgbGV0IHN1YmogPSBuZXcgU3ViamVjdCgpO1xuICAgIHRoaXMuY2FzdC5yZXF1ZXN0U2Vzc2lvbigoczogYW55KSA9PiB7XG4gICAgICBzZWxmLnNlc3Npb24gPSBzO1xuICAgICAgc2VsZi5zZXRDYXN0aW5nKHRydWUpO1xuICAgICAgc3Viai5uZXh0KCdDT05ORUNURUQnKTtcbiAgICB9LCBmdW5jdGlvbiAoZXJyOiBhbnkpIHtcbiAgICAgIHNlbGYuc2V0Q2FzdGluZyhmYWxzZSk7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdjYW5jZWwnKSB7XG4gICAgICAgIHNlbGYuc2Vzc2lvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgc3Viai5uZXh0KCdDQU5DRUwnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHNlbGVjdGluZyBhIGNhc3QgZGV2aWNlJywgZXJyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3ViajtcbiAgfTtcblxuICBvbk1lZGlhRGlzY292ZXJlZCA9IChjYXRlZ29yaWVzOiBhbnlbXSkgPT4ge1xuICAgIGxldCBzY3JpcHQgPSB3aW5kb3dbJ2RvY3VtZW50J10uY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTtcbiAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCdzcmMnLCAnaHR0cHM6Ly93d3cuZ3N0YXRpYy5jb20vY3YvanMvc2VuZGVyL3YxL2Nhc3Rfc2VuZGVyLmpzP2xvYWRDYXN0RnJhbWV3b3JrPTEnKTtcbiAgICB3aW5kb3dbJ2RvY3VtZW50J10uYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuXG4gICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLm1lZGlhSlNPTi5jYXRlZ29yaWVzID0gY2F0ZWdvcmllcztcbiAgfTtcblxuICBwbGF5ID0gKCkgPT4geyAgICBcbiAgICB0aGlzLmN1cnJlbnRNZWRpYS5wbGF5KG51bGwpO1xuICB9O1xuXG4gIHBhdXNlID0gKCkgPT4ge1xuICAgIHRoaXMuY3VycmVudE1lZGlhLnBhdXNlKG51bGwpO1xuICB9O1xuXG4gIHN0b3AgPSAoKSA9PiB7XG4gICAgdGhpcy5jdXJyZW50TWVkaWEuc3RvcChudWxsKTtcbiAgfTtcblxuICBvbk1lZGlhRXJyb3IgPSAoZXJyOiBhbnkpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsYXVuY2hpbmcgbWVkaWEnLCBlcnIpO1xuICB9O1xuXG4gIHNldENhc3RpbmcodmFsdWU6IGFueSkge1xuICAgIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5hZGRWaWRlb1RodW1icygpO1xuICAgIHRoaXMuc3RhdHVzLmNhc3RpbmcgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldFN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXNcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/fesm2015/thinkam.net-ng-cast.js b/dist/fesm2015/thinkam.net-ng-cast.js index a8aeaa4..3e49718 100644 --- a/dist/fesm2015/thinkam.net-ng-cast.js +++ b/dist/fesm2015/thinkam.net-ng-cast.js @@ -3,124 +3,8 @@ import { Component, Injectable, NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angula import { CommonModule } from '@angular/common'; import { Subject } from 'rxjs'; -let NgCastComponent = class NgCastComponent { - constructor(ngCastService) { - this.ngCastService = ngCastService; - } - ngOnInit() { - this.window = window; - let ngCastService = this.ngCastService; - this.window['__onGCastApiAvailable'] = function (isAvailable) { - if (isAvailable) { - ngCastService.initializeCastApi(); - } - }; - this.castingStatus = this.ngCastService.getStatus(); - } - openSession() { - this.ngCastService.discoverDevices(); - } - closeSession() { - this.ngCastService.stop(); - } -}; -NgCastComponent = __decorate([ - Component({ - selector: 'ng-cast', - template: "cast\ncast_connected", - styles: [""] - }) -], NgCastComponent); - -let NgCastService = class NgCastService { - constructor() { - this.window = window; - this.status = { - casting: false - }; - this.onInitSuccess = function () { - console.log('GCast initialization success'); - }; - this.onError = function (err) { - console.log('GCast initialization failed', err); - }; - this.discoverDevices = () => { - let self = this; - let subj = new Subject(); - this.cast.requestSession((s) => { - self.session = s; - self.setCasting(true); - subj.next('CONNECTED'); - }, function (err) { - self.setCasting(false); - if (err.code === 'cancel') { - self.session = undefined; - subj.next('CANCEL'); - } - else { - console.error('Error selecting a cast device', err); - } - }); - return subj; - }; - this.onMediaDiscovered = (categories) => { - let script = window['document'].createElement('script'); - script.setAttribute('type', 'text/javascript'); - script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1'); - window['document'].body.appendChild(script); - mediaJSON.categories = categories; - }; - this.play = () => { - this.currentMedia.play(null); - }; - this.pause = () => { - this.currentMedia.pause(null); - }; - this.stop = () => { - this.currentMedia.stop(null); - }; - this.onMediaError = (err) => { - console.error('Error launching media', err); - }; - } - initializeCastApi() { - this.cast = this.window['chrome'].cast; - let sessionRequest = new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID); - let apiConfig = new this.cast.ApiConfig(sessionRequest, () => { }, (status) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }); - let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError); - } - ; - setCasting(value) { - this.status.casting = value; - } - getStatus() { - return this.status; - } -}; -NgCastService = __decorate([ - Injectable() -], NgCastService); - -let NgCastModule = class NgCastModule { -}; -NgCastModule = __decorate([ - NgModule({ - schemas: [CUSTOM_ELEMENTS_SCHEMA], - imports: [ - CommonModule - ], - exports: [NgCastComponent], - providers: [NgCastService], - declarations: [NgCastComponent] - }) -], NgCastModule); - 'use strict'; -var mediaJSON$1 = { - 'categories': [] -}; - /** Cleaner UI for demo purposes. */ const DEMO_MODE = false; @@ -259,6 +143,10 @@ var CastPlayer = function () { this.setupLocalPlayer(); this.addVideoThumbs(); this.initializeUI(); + + this.mediaJSON = { + 'categories': [] + }; }; CastPlayer.prototype.initializeCastPlayer = function () { @@ -474,8 +362,9 @@ CastPlayer.prototype.setupLocalPlayer = function () { document.getElementById('skip').style.display = 'none'; var localPlayer = document.getElementById('video_element'); - localPlayer.addEventListener( - 'loadeddata', this.onMediaLoadedLocally.bind(this)); + if (typeof localPlayer !== 'undefined' && localPlayer) + localPlayer.addEventListener( + 'loadeddata', this.onMediaLoadedLocally.bind(this)); // This object will implement PlayerHandler callbacks with localPlayer var playerTarget = {}; @@ -551,11 +440,16 @@ CastPlayer.prototype.setupLocalPlayer = function () { }.bind(this); playerTarget.setVolume = function (volumeSliderPosition) { - localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ? - volumeSliderPosition / FULL_VOLUME_HEIGHT : 1; + if (localPlayer) { + localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ? + volumeSliderPosition / FULL_VOLUME_HEIGHT : 1; + } + var p = document.getElementById('audio_bg_level'); - p.style.height = volumeSliderPosition + 'px'; - p.style.marginTop = -volumeSliderPosition + 'px'; + if (typeof p !== 'undefined' && p) { + p.style.height = volumeSliderPosition + 'px'; + p.style.marginTop = -volumeSliderPosition + 'px'; + } }; playerTarget.mute = function () { @@ -567,7 +461,8 @@ CastPlayer.prototype.setupLocalPlayer = function () { }; playerTarget.isMuted = function () { - return localPlayer.muted; + if (localPlayer) + return localPlayer.muted; }; playerTarget.seekTo = function (time) { @@ -1581,7 +1476,7 @@ CastPlayer.prototype.showMediaControl = function () { * Hide the media control */ CastPlayer.prototype.hideMediaControl = function () { - if (cast && cast.framework && cast.framework.CastContext) { + if (typeof cast !== 'undefined') { let context = cast.framework.CastContext.getInstance(); if (context && context.getCurrentSession()) { // Do not hide controls during an active cast session. @@ -1667,10 +1562,15 @@ CastPlayer.prototype.initializeUI = function () { 'mouseout', this.hideVolumeSlider.bind(this)); document.getElementById('audio_on').addEventListener( 'mouseout', this.hideVolumeSlider.bind(this)); - document.getElementById('main_video').addEventListener( - 'mouseover', this.showMediaControl.bind(this)); - document.getElementById('main_video').addEventListener( - 'mouseout', this.hideMediaControl.bind(this)); + + let main_video = document.getElementById('main_video'); + if (typeof main_video !== 'undefined' && main_video) { + main_video.addEventListener( + 'mouseover', this.showMediaControl.bind(this)); + main_video.addEventListener( + 'mouseout', this.hideMediaControl.bind(this)); + } + document.getElementById('media_control').addEventListener( 'mouseover', this.showMediaControl.bind(this)); document.getElementById('media_control').addEventListener( @@ -1731,8 +1631,8 @@ CastPlayer.prototype.initializeUI = function () { * Add video thumbnails div's to UI for media JSON contents */ CastPlayer.prototype.addVideoThumbs = function () { - if (mediaJSON$1 && mediaJSON$1['categories'] && mediaJSON$1['categories'].length > 0) { - this.mediaContents = mediaJSON$1['categories'][0]['videos']; + if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) { + this.mediaContents = this.mediaJSON['categories'][0]['videos']; var ni = document.getElementById('carousel'); var newdiv = null; var divIdName = null; @@ -1786,13 +1686,133 @@ CastPlayer.getErrorMessage = function (error) { } }; -let castPlayer = new CastPlayer(); +var castPlayer = new CastPlayer(); window['__onGCastApiAvailable'] = function (isAvailable) { if (isAvailable) { castPlayer.initializeCastPlayer(); } }; +window.CastPlayer = castPlayer; + +let NgCastComponent = class NgCastComponent { + constructor(ngCastService) { + this.ngCastService = ngCastService; + } + ngOnInit() { + this.window = window; + let ngCastService = this.ngCastService; + this.window['__onGCastApiAvailable'] = function (isAvailable) { + if (isAvailable) { + ngCastService.initializeCastApi(); + } + }; + this.castingStatus = this.ngCastService.getStatus(); + } + openSession() { + this.ngCastService.discoverDevices(); + } + closeSession() { + this.ngCastService.discoverDevices(); + } +}; +NgCastComponent = __decorate([ + Component({ + selector: 'ng-cast', + template: "cast\ncast_connected", + styles: [""] + }) +], NgCastComponent); + +let NgCastService = class NgCastService { + constructor() { + this.window = window; + this.status = { + casting: false + }; + this.onInitSuccess = function () { + console.log('GCast initialization success'); + }; + this.onError = function (err) { + console.log('GCast initialization failed', err); + }; + this.discoverDevices = () => { + let self = this; + let subj = new Subject(); + this.cast.requestSession((s) => { + self.session = s; + self.setCasting(true); + subj.next('CONNECTED'); + }, function (err) { + self.setCasting(false); + if (err.code === 'cancel') { + self.session = undefined; + subj.next('CANCEL'); + } + else { + console.error('Error selecting a cast device', err); + } + }); + return subj; + }; + this.onMediaDiscovered = (categories) => { + let script = window['document'].createElement('script'); + script.setAttribute('type', 'text/javascript'); + script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1'); + window['document'].body.appendChild(script); + globalThis.CastPlayer.mediaJSON.categories = categories; + }; + this.play = () => { + this.currentMedia.play(null); + }; + this.pause = () => { + this.currentMedia.pause(null); + }; + this.stop = () => { + this.currentMedia.stop(null); + }; + this.onMediaError = (err) => { + console.error('Error launching media', err); + }; + globalThis.CastPlayer.mediaJSON = { + categories: [] + }; + } + initializeCastApi() { + this.cast = this.window['chrome'].cast; + let sessionRequest = new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID); + let apiConfig = new this.cast.ApiConfig(sessionRequest, () => { }, (status) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }); + let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError); + } + ; + setCasting(value) { + globalThis.CastPlayer.addVideoThumbs(); + this.status.casting = value; + } + getStatus() { + return this.status; + } +}; +NgCastService = __decorate([ + Injectable() +], NgCastService); + +let NgCastModule = class NgCastModule { +}; +NgCastModule = __decorate([ + NgModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [ + CommonModule + ], + exports: [NgCastComponent], + providers: [NgCastService], + declarations: [NgCastComponent] + }) +], NgCastModule); + +// ------ project path -------- | --- lib --- + /** * Generated bundle index. Do not edit. */ diff --git a/dist/fesm2015/thinkam.net-ng-cast.js.map b/dist/fesm2015/thinkam.net-ng-cast.js.map index 5fcdec9..4b66557 100644 --- a/dist/fesm2015/thinkam.net-ng-cast.js.map +++ b/dist/fesm2015/thinkam.net-ng-cast.js.map @@ -1 +1 @@ -{"version":3,"file":"thinkam.net-ng-cast.js","sources":["../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../CastVideos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["import { Component, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.stop();\n }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare var mediaJSON: any;\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n \n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID);\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n mediaJSON.categories = categories;\n };\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","'use strict';\n\nvar mediaJSON = { \n 'categories': []\n};\n\n/** Cleaner UI for demo purposes. */\nconst DEMO_MODE = false;\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/';\n\n/**\n * Controls if Ads are enabled. Controlled by radio button.\n * @type {boolean}\n */\nlet ENABLE_ADS = false;\n\n/**\n * Controls if Live stream is played. Controlled by radio button.\n * @type {boolean}\n */\nlet ENABLE_LIVE = false;\n\n/**\n * Buffer to decide if the live indicator should be displayed to show that\n * playback is at the playback head.\n * @const {number}\n */\nconst LIVE_INDICATOR_BUFFER = 50;\n\n/**\n * Width of progress bar in pixels.\n * @const {number}\n */\nconst PROGRESS_BAR_WIDTH = 700;\n\n/**\n * Time in milliseconds for minimal progress update.\n * @const {number}\n */\nconst TIMER_STEP = 1000;\n\n/**\n * Cast volume upon initial connection.\n * @const {number}\n */\nconst DEFAULT_VOLUME = 0.5;\n\n/**\n * Height, in pixels, of volume bar.\n * @const {number}\n */\nconst FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.setupLocalPlayer();\n this.addVideoThumbs();\n this.initializeUI();\n};\n\nCastPlayer.prototype.initializeCastPlayer = function () {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = 'C0868879';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n this.remotePlayer = new cast.framework.RemotePlayer();\n this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer);\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n function (e) {\n this.switchPlayer(e.value);\n }.bind(this)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = function () {\n this.playerStateBeforeSwitch = this.playerState;\n\n this.stopProgressTimer();\n this.resetVolumeSlider();\n\n // Session is active\n if (cast && cast.framework && this.remotePlayer.isConnected) {\n // Pause local playback\n this.playerHandler.pause();\n this.setupRemotePlayer();\n } else {\n this.setupLocalPlayer();\n }\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n this.updateDurationDisplay = function () {\n this.target.updateDurationDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = function () {\n // Cleanup remote player UI\n let live_indicator = document.getElementById('live_indicator');\n if (live_indicator && live_indicator.style && live_indicator.style.display) {\n live_indicator.style.display = 'none';\n }\n\n this.removeAdMarkers();\n document.getElementById('skip').style.display = 'none';\n\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', this.onMediaLoadedLocally.bind(this));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src = this.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n if (!mediaIndex) {\n return (localPlayer.src !== null && localPlayer.src !== \"\");\n } else {\n return (localPlayer.src == this.mediaContents[mediaIndex]['sources'][0]);\n }\n }.bind(this);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplay = function () {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n };\n\n playerTarget.updateCurrentTimeDisplay = function () {\n // Increment for local playback\n this.currentMediaTime += 1;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.currentMediaTime);\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.mediaDuration);\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n if (currentTimeString !== null) {\n element.style.display = '';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n this.playerHandler.setTarget(playerTarget);\n\n this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n this.showFullscreenButton();\n\n this.enableProgressBar(true);\n\n if (this.currentMediaTime > 0) {\n this.playerHandler.load();\n this.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n this.mediaInfo = media.media;\n\n if (this.mediaInfo) {\n this.isLiveContent = (this.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n this.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) {\n this.playerHandler.prepareToPlay();\n }\n\n this.removeAdMarkers();\n this.updateAdMarkers();\n\n this.playerHandler.updateDisplay();\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n this.enableProgressBar(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (this.remotePlayer.isPaused) {\n this.playerHandler.pause();\n } else if (this.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n this.playerHandler.play();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n } else {\n this.playerHandler.unMute();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n this.isPlayingBreak(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n this.onWhenSkippableChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n this.onCurrentBreakClipTimeChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n this.onBreakClipIdChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n this.liveSeekableRange = event.value;\n }.bind(this)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(this);\n\n playerTarget.pause = function () {\n if (!this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n }.bind(this);\n\n playerTarget.stop = function () {\n this.remotePlayerController.stop();\n }.bind(this);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n\n let mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;\n mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata();\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle'];\n mediaInfo.metadata.images = [{\n 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']\n }];\n\n let request = new chrome.cast.media.LoadRequest(mediaInfo);\n request.currentTime = this.currentMediaTime;\n\n if (ENABLE_ADS) {\n // Add sample breaks and breakClips.\n mediaInfo.breakClips = breakClipsJSON;\n mediaInfo.breaks = breaksJSON;\n } else if (ENABLE_LIVE) {\n // Change the streamType and add live specific metadata.\n mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;\n // TODO: Set the metadata on the receiver side in your implementation.\n // startAbsoluteTime and sectionStartTimeInMedia will be set for you.\n // See https://developers.google.com/cast/docs/caf_receiver/live.\n\n // TODO: Start time, is a fake timestamp. Use correct values for your implementation.\n let currentTime = new Date();\n // Convert from milliseconds to seconds.\n currentTime = currentTime / 1000;\n let sectionStartAbsoluteTime = currentTime;\n\n // Duration should be -1 for live streams.\n mediaInfo.duration = -1;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.startAbsoluteTime = currentTime;\n mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.metadata.sectionStartTimeInMedia = 0;\n mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration'];\n\n let item = new chrome.cast.media.QueueItem(mediaInfo);\n request.queueData = new chrome.cast.media.QueueData();\n request.queueData.items = [item];\n request.queueData.name = \"Sample Queue for Live\";\n }\n\n // Do not immediately start playing if the player was previously PAUSED.\n if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) {\n request.autoplay = false;\n } else {\n request.autoplay = true;\n }\n\n cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(\n function () {\n console.log('Remote media loaded');\n }.bind(this),\n function (errorCode) {\n this.playerState = PLAYER_STATE.IDLE;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n this.playerHandler.updateDisplay();\n }.bind(this));\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(this);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (this.isLiveContent && this.mediaInfo.metadata &&\n this.mediaInfo.metadata.sectionStartTimeInMedia) {\n return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return this.remotePlayer.currentTime;\n }\n }.bind(this);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (this.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (this.mediaInfo.metadata == undefined ||\n this.mediaInfo.metadata.sectionDuration == undefined ||\n this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return this.mediaInfo.metadata.sectionDuration;\n } else {\n return this.remotePlayer.duration;\n }\n }.bind(this);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n this.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(this);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime());\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration());\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n\n if (this.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = this.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n this.remotePlayer.volumeLevel = currentVolume;\n this.remotePlayerController.setVolumeLevel();\n }.bind(this);\n\n playerTarget.mute = function () {\n if (!this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.unMute = function () {\n if (this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.isMuted = function () {\n return this.remotePlayer.isMuted;\n }.bind(this);\n\n playerTarget.seekTo = function (time) {\n this.remotePlayer.currentTime = time;\n this.remotePlayerController.seek();\n }.bind(this);\n\n this.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n }\n this.enableProgressBar(this.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n this.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n this.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n this.removeAdMarkers();\n this.updateAdMarkers();\n } else {\n this.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = this.currentMediaTime;\n\n this.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n this.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n this.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n this.stopProgressTimer();\n this.currentMediaTime = 0;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n this.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (this.isLiveContent && !this.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (this.playerState === PLAYER_STATE.PLAYING ||\n this.playerState === PLAYER_STATE.PAUSED) {\n this.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (this.isLiveContent) {\n seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n this.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n this.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n this.stopProgressTimer();\n\n // Start progress timer\n this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n this.currentMediaTime = this.playerHandler.getCurrentMediaTime();\n this.mediaDuration = this.playerHandler.getMediaDuration();\n\n this.playerHandler.updateDurationDisplay();\n\n if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) {\n this.playerHandler.updateCurrentTimeDisplay();\n this.updateProgressBarByTimer();\n } else if (this.mediaDuration > 0) {\n this.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (this.mediaDuration == null) {\n if (!this.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n \n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n \n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (this.isLiveContent) {\n if (this.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) {\n this.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n this.currentMediaTime = 0;\n this.stopProgressTimer();\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n this.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n this.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (this.whenSkippable == undefined || this.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n this.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', this.seekMediaListener);\n seekable_window.addEventListener('click', this.seekMediaListener);\n progress_indicator.addEventListener('dragend', this.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', this.seekMediaListener);\n seekable_window.removeEventListener('click', this.seekMediaListener);\n progress_indicator.removeEventListener('dragend', this.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n this.fullscreen = !this.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (this.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block'; \n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (cast && cast.framework && cast.framework.CastContext) {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!this.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = function () {\n // Set initial values for title and subtitle.\n if (this.mediaContents && this.mediaContents.length > 0) {\n document.getElementById('media_title').innerHTML =\n this.mediaContents[0]['title'];\n\n document.getElementById('media_subtitle').innerHTML =\n this.mediaContents[this.currentMediaIndex]['subtitle'];\n }\n\n document.getElementById('seekable_window').addEventListener(\n 'click', this.seekMediaListener);\n document.getElementById('progress').addEventListener(\n 'click', this.seekMediaListener);\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', this.seekMediaListener);\n document.getElementById('skip').addEventListener(\n 'click', this.skipAd.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'click', this.playerHandler.mute.bind(this.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', this.playerHandler.unMute.bind(this.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('main_video').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('main_video').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', this.requestFullScreen.bind(this));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', this.cancelFullScreen.bind(this));\n document.addEventListener(\n 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n document.addEventListener(\n 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', this.playerHandler.play.bind(this.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', this.playerHandler.pause.bind(this.playerHandler));\n\n document.getElementById('progress_indicator').draggable = true;\n\n // Set up feature radio buttons\n let noneRadio = document.getElementById('none');\n noneRadio.onclick = function () {\n ENABLE_LIVE = false;\n ENABLE_ADS = false;\n console.log(\"Features have been removed\");\n }\n let adsRadio = document.getElementById('ads');\n adsRadio.onclick = function () {\n ENABLE_LIVE = false;\n ENABLE_ADS = true;\n console.log(\"Ads have been enabled\");\n }\n let liveRadio = document.getElementById('live');\n liveRadio.onclick = function () {\n ENABLE_LIVE = true;\n ENABLE_ADS = false;\n console.log(\"Live has been enabled\");\n }\n\n if (ENABLE_ADS) {\n if (ENABLE_LIVE) {\n console.error('Only one feature can be enabled at a time. Enabling ads.');\n }\n adsRadio.checked = true;\n console.log(\"Ads are enabled\");\n } else if (ENABLE_LIVE) {\n liveRadio.checked = true;\n console.log(\"Live is enabled\");\n } else {\n noneRadio.checked = true;\n console.log(\"No features are enabled\");\n }\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (mediaJSON && mediaJSON['categories'] && mediaJSON['categories'].length > 0) {\n this.mediaContents = mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < this.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', this.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nlet castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["mediaJSON"],"mappings":";;;;;IAWa,eAAe,GAA5B,MAAa,eAAe;IAI1B,YACU,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;KACjC;IAEL,QAAQ;QACN,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,GAAG,UAAU,WAAoB;YACnE,IAAI,WAAW,EAAE;gBACf,aAAa,CAAC,iBAAiB,EAAE,CAAC;aACnC;SACF,CAAC;QAEF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;KACrD;IAED,WAAW;QACT,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;KACtC;IAED,YAAY;QACV,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;KAC3B;EAEF;AA7BY,eAAe;IAP3B,SAAS,CAAC;QACT,QAAQ,EAAE,SAAS;QACnB,sNAAuC;;KAIxC,CAAC;GACW,eAAe,CA6B3B;;ICjCY,aAAa,GAA1B,MAAa,aAAa;IASxB;QANQ,WAAM,GAAQ,MAAM,CAAC;QAEtB,WAAM,GAAG;YACd,OAAO,EAAE,KAAK;SACf,CAAC;QAgBF,kBAAa,GAAG;YACd,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;SAC7C,CAAC;QAEF,YAAO,GAAG,UAAU,GAAQ;YAC1B,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;SACjD,CAAC;QAEF,oBAAe,GAAG;YAChB,IAAI,IAAI,GAAQ,IAAI,CAAC;YACrB,IAAI,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAM;gBAC9B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;gBACjB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aACxB,EAAE,UAAU,GAAQ;gBACnB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACvB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;oBACzB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;oBACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBACrB;qBAAM;oBACL,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;iBACrD;aACF,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;SACb,CAAC;QAEF,sBAAiB,GAAG,CAAC,UAAiB;YACpC,IAAI,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxD,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YAC/C,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,4EAA4E,CAAC,CAAC;YACzG,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAE5C,SAAS,CAAC,UAAU,GAAG,UAAU,CAAC;SACnC,CAAC;QAEF,SAAI,GAAG;YACL,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC9B,CAAC;QAEF,UAAK,GAAG;YACN,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC/B,CAAC;QAEF,SAAI,GAAG;YACL,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC9B,CAAC;QAEF,iBAAY,GAAG,CAAC,GAAQ;YACtB,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;SAC7C,CAAC;KA9DD;IAED,iBAAiB;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;QACvC,IAAI,cAAc,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjG,IAAI,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EACpD,SAAS,EACT,CAAC,MAAW,OAAO,IAAI,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,CAClF,CAAC;QACF,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;KAC3E;;IAsDD,UAAU,CAAC,KAAU;QACnB,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;KAC7B;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;KACnB;EACF;AAlFY,aAAa;IADzB,UAAU,EAAE;GACA,aAAa,CAkFzB;;IC3EY,YAAY,GAAzB,MAAa,YAAY;EAAI;AAAhB,YAAY;IATxB,QAAQ,CAAC;QACR,OAAO,EAAE,CAAE,sBAAsB,CAAE;QACnC,OAAO,EAAE;YACP,YAAY;SACb;QACD,OAAO,EAAE,CAAC,eAAe,CAAC;QAC1B,SAAS,EAAE,CAAC,aAAa,CAAC;QAC1B,YAAY,EAAE,CAAC,eAAe,CAAC;KAChC,CAAC;GACW,YAAY,CAAI;;ACd7B,YAAY,CAAC;AACb;AACA,IAAIA,WAAS,GAAG;AAChB,EAAE,YAAY,EAAE,EAAE;AAClB,CAAC,CAAC;AACF;AACA;AACA,MAAM,SAAS,GAAG,KAAK,CAAC;AACxB;AACA;AACA,MAAM,iBAAiB,GAAG,mEAAmE,CAAC;AAC9F;AACA;AACA;AACA;AACA;AACA,IAAI,UAAU,GAAG,KAAK,CAAC;AACvB;AACA;AACA;AACA;AACA;AACA,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC;AACA;AACA;AACA;AACA;AACA,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B;AACA;AACA;AACA;AACA;AACA,MAAM,UAAU,GAAG,IAAI,CAAC;AACxB;AACA;AACA;AACA;AACA;AACA,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B;AACA;AACA;AACA;AACA;AACA,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B;AACA;AACA,MAAM,YAAY,GAAG;AACrB;AACA;AACA,EAAE,IAAI,EAAE,MAAM;AACd;AACA;AACA,EAAE,SAAS,EAAE,WAAW;AACxB;AACA,EAAE,MAAM,EAAE,QAAQ;AAClB;AACA,EAAE,OAAO,EAAE,SAAS;AACpB;AACA,EAAE,MAAM,EAAE,QAAQ;AAClB,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,UAAU,GAAG,YAAY;AAC7B;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;AAC/C;AACA;AACA,EAAE,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AACvC;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;AACtC;AACA;AACA;AACA,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AAC3B;AACA,EAAE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;AACrC;AACA;AACA;AACA,EAAE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;AAC5B;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;AAC1B;AACA;AACA,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AACpB;AACA,EAAE,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtE;AACA,EAAE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrD;AACA;AACA;AACA,EAAE,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;AAC7B;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC5B;AACA,EAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;AAC1B;AACA;AACA;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC5B;AACA;AACA;AACA,EAAE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAChC;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;AAC7B;AACA,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAC1B,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;AACxB,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;AACtB,CAAC,CAAC;AACF;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY;AACxD,EAAE,IAAI,OAAO,GAAG,EAAE,CAAC;AACnB;AACA;AACA;AACA;AACA,EAAE,OAAO,CAAC,qBAAqB,GAAG,UAAU,CAAC;AAC7C;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;AACpE;AACA,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAC/D;AACA,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;AACxD,EAAE,IAAI,CAAC,sBAAsB,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAC7F,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,oBAAoB;AAC7D,IAAI,UAAU,CAAC,EAAE;AACjB,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACjC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,YAAY,GAAG,YAAY;AAChD,EAAE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,WAAW,CAAC;AAClD;AACA,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC3B,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC3B;AACA;AACA,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;AAC/D;AACA,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;AAC/B,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC7B,GAAG,MAAM;AACT,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAC5B,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,aAAa,GAAG,UAAU,UAAU,EAAE;AAC1C,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;AACnB;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,UAAU,MAAM,EAAE;AACrC,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACzB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,YAAY;AAC1B,IAAI,IAAI,UAAU,CAAC,WAAW,IAAI,YAAY,CAAC,IAAI;AACnD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE;AAChE,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AAC9C,MAAM,OAAO;AACb,KAAK;AACL;AACA,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC;AAClD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB;AACA,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC3D,IAAI,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC7D,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,KAAK,GAAG,YAAY;AAC3B,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;AACxB,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;AACjD,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC5D,IAAI,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC5D,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,YAAY;AAC1B,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AAC/C,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,UAAU,UAAU,GAAG,IAAI,EAAE;AAC3C,IAAI,IAAI,CAAC,UAAU,EAAE;AACrB,MAAM,UAAU,GAAG,UAAU,CAAC,iBAAiB,CAAC;AAChD,KAAK;AACL,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC;AACpD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACjC,GAAG,CAAC;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,UAAU,UAAU,EAAE;AAC7C,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;AACjD,GAAG,CAAC;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,YAAY;AACnC,IAAI,UAAU,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACvD,IAAI,UAAU,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;AACrD,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;AACjD;AACA,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AAChB,IAAI,UAAU,CAAC,kBAAkB,EAAE,CAAC;AACpC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;AACzB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,mBAAmB,GAAG,YAAY;AACzC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;AAC7C,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,gBAAgB,GAAG,YAAY;AACtC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;AAC1C,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,YAAY;AACnC;AACA,IAAI,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;AAC9D,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;AACxD;AACA,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;AAChC,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,wBAAwB,GAAG,YAAY;AAC9C,IAAI,IAAI,CAAC,MAAM,CAAC,wBAAwB,EAAE,CAAC;AAC3C,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,qBAAqB,GAAG,YAAY;AAC3C,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;AACxC,GAAG,CAAC;AACJ;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,UAAU,OAAO,EAAE,IAAI,EAAE;AAChD,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC7C,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,UAAU,oBAAoB,EAAE;AACnD,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;AAChD,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,YAAY;AAC1B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,IAAI,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC/D,IAAI,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACjE,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,YAAY;AAC5B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;AACzB,IAAI,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAChE,IAAI,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAChE,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,OAAO,GAAG,YAAY;AAC7B,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;AACjC,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,UAAU,IAAI,EAAE;AAChC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,GAAG,CAAC;AACJ,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD;AACA,EAAE,IAAI,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACjE,EAAE,IAAI,cAAc,IAAI,cAAc,CAAC,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE;AAC9E,IAAI,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC1C,GAAG;AACH;AACA,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;AACzB,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACzD;AACA,EAAE,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AAC7D,EAAE,WAAW,CAAC,gBAAgB;AAC9B,IAAI,YAAY,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACxD;AACA;AACA,EAAE,IAAI,YAAY,GAAG,EAAE,CAAC;AACxB;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;AACvB;AACA,IAAI,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AACpD,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC9B,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACxC,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,KAAK,GAAG,YAAY;AACnC,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;AACxB,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;AACvB,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,UAAU,UAAU,EAAE;AAC5C,IAAI,WAAW,CAAC,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;AACvB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,aAAa,GAAG,UAAU,UAAU,EAAE;AACrD,IAAI,IAAI,CAAC,UAAU,EAAE;AACrB,MAAM,QAAQ,WAAW,CAAC,GAAG,KAAK,IAAI,IAAI,WAAW,CAAC,GAAG,KAAK,EAAE,EAAE;AAClE,KAAK,MAAM;AACX,MAAM,QAAQ,WAAW,CAAC,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;AAC/E,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,mBAAmB,GAAG,YAAY;AACjD,IAAI,OAAO,WAAW,CAAC,WAAW,CAAC;AACnC,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,gBAAgB,GAAG,YAAY;AAC9C,IAAI,OAAO,WAAW,CAAC,QAAQ,CAAC;AAChC,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,aAAa,GAAG,YAAY;AAC3C;AACA,IAAI,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAClE,IAAI,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACpE,IAAI,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC1E;AACA;AACA,IAAI,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;AACpD,MAAM,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC;AACtE,IAAI,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS;AACvD,MAAM,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,UAAU,CAAC,CAAC;AACzE,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,wBAAwB,GAAG,YAAY;AACtD;AACA,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;AAC/B,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACpG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,qBAAqB,GAAG,YAAY;AACnD,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;AAC9F,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,aAAa,GAAG,UAAU,OAAO,EAAE,IAAI,EAAE;AACxD,IAAI,IAAI,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAC1D,IAAI,IAAI,iBAAiB,KAAK,IAAI,EAAE;AACpC,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;AACjC,MAAM,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAC;AAC5C,KAAK,MAAM;AACX,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACrC,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,SAAS,GAAG,UAAU,oBAAoB,EAAE;AAC3D,IAAI,WAAW,CAAC,MAAM,GAAG,oBAAoB,GAAG,kBAAkB;AAClE,MAAM,oBAAoB,GAAG,kBAAkB,GAAG,CAAC,CAAC;AACpD,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACtD,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAC;AACjD,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,oBAAoB,GAAG,IAAI,CAAC;AACrD,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;AAC7B,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,MAAM,GAAG,YAAY;AACpC,IAAI,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC;AAC9B,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,OAAO,GAAG,YAAY;AACrC,IAAI,OAAO,WAAW,CAAC,KAAK,CAAC;AAC7B,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,MAAM,GAAG,UAAU,IAAI,EAAE;AACxC,IAAI,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC;AACnC,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;AAC7C;AACA,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,GAAG,kBAAkB,CAAC,CAAC;AACpE;AACA,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC9B;AACA,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;AAC/B;AACA,EAAE,IAAI,IAAI,CAAC,gBAAgB,GAAG,CAAC,EAAE;AACjC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAC9B,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAC9B,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACrD;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,kBAAkB;AAC3D,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;AACjF,MAAM,IAAI,CAAC,OAAO,EAAE;AACpB,QAAQ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AAC9B,QAAQ,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;AACnC,QAAQ,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AAC3C,QAAQ,OAAO;AACf,OAAO;AACP;AACA,MAAM,IAAI,KAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;AAC5C,MAAM,IAAI,CAAC,KAAK,EAAE;AAClB,QAAQ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AAC9B,QAAQ,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;AACnC,QAAQ,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AAC3C,QAAQ,OAAO;AACf,OAAO;AACP;AACA,MAAM,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;AACnC;AACA,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE;AAC1B,QAAQ,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU;AACvD,UAAU,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAC7C,OAAO,MAAM;AACb,QAAQ,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;AACnC,OAAO;AACP;AACA,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,YAAY,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO,EAAE;AAClG,QAAQ,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AAC3C,OAAO;AACP;AACA,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;AAC7B,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;AAC7B;AACA,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AACzC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,gBAAgB;AACzD,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC1C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,iBAAiB;AAC1D,IAAI,YAAY;AAChB,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AACtC,QAAQ,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;AACnC,OAAO,MAAM,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO,EAAE;AAC5D;AACA;AACA;AACA,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAClC,OAAO;AACP,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,gBAAgB;AACzD,IAAI,YAAY;AAChB,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AACrC,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAClC,OAAO,MAAM;AACb,QAAQ,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;AACpC,OAAO;AACP,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,oBAAoB;AAC7D,IAAI,YAAY;AAChB,MAAM,IAAI,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,kBAAkB,CAAC;AACzE,MAAM,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACxD,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;AACxC,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;AAC5C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,wBAAwB;AACjE,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACvC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,sBAAsB;AAC/D,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC/C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,+BAA+B;AACxE,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACtD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,qBAAqB;AAC9D,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,2BAA2B;AACpE,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AACjD,MAAM,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC;AAC3C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA;AACA;AACA;AACA,EAAE,IAAI,YAAY,GAAG,EAAE,CAAC;AACxB;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AACpC,MAAM,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC;AAChD,KAAK;AACL;AACA,IAAI,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AACpD,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;AAC1B,IAAI,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AAC/D,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,KAAK,GAAG,YAAY;AACnC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AACrC,MAAM,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC;AAChD,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;AACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,UAAU,UAAU,EAAE;AAC5C,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACxE;AACA,IAAI,IAAI,SAAS,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AAC/G,IAAI,SAAS,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;AACjE,IAAI,SAAS,CAAC,QAAQ,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;AACrE,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;AACvE,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC;AAC7E,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;AACjC,MAAM,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC;AACxE,KAAK,CAAC,CAAC;AACP;AACA,IAAI,IAAI,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AAC/D,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC;AAChD;AACA,IAAI,IAAI,UAAU,EAAE;AACpB;AACA,MAAM,SAAS,CAAC,UAAU,GAAG,cAAc,CAAC;AAC5C,MAAM,SAAS,CAAC,MAAM,GAAG,UAAU,CAAC;AACpC,KAAK,MAAM,IAAI,WAAW,EAAE;AAC5B;AACA,MAAM,SAAS,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;AAC/D;AACA;AACA;AACA;AACA;AACA,MAAM,IAAI,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;AACnC;AACA,MAAM,WAAW,GAAG,WAAW,GAAG,IAAI,CAAC;AACvC,MAAM,IAAI,wBAAwB,GAAG,WAAW,CAAC;AACjD;AACA;AACA,MAAM,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;AAC9B;AACA,MAAM,SAAS,CAAC,iBAAiB,GAAG,WAAW,CAAC;AAChD,MAAM,SAAS,CAAC,QAAQ,CAAC,wBAAwB,GAAG,wBAAwB,CAAC;AAC7E;AACA,MAAM,SAAS,CAAC,QAAQ,CAAC,uBAAuB,GAAG,CAAC,CAAC;AACrD,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC;AACtF;AACA,MAAM,IAAI,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAC5D,MAAM,OAAO,CAAC,SAAS,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;AAC5D,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;AACvC,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,GAAG,uBAAuB,CAAC;AACvD,KAAK;AACL;AACA;AACA,IAAI,IAAI,CAAC,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,uBAAuB,IAAI,YAAY,CAAC,MAAM,EAAE;AAC9F,MAAM,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC;AAC/B,KAAK,MAAM;AACX,MAAM,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC9B,KAAK;AACL;AACA,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI;AACxF,MAAM,YAAY;AAClB,QAAQ,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAC3C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAClB,MAAM,UAAU,SAAS,EAAE;AAC3B,QAAQ,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AAC7C,QAAQ,OAAO,CAAC,GAAG,CAAC,2BAA2B;AAC/C,UAAU,UAAU,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;AACjD,QAAQ,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AAC3C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACpB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,aAAa,GAAG,UAAU,UAAU,EAAE;AACrD,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;AAC/E,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,KAAK,CAAC;AAC/B;AACA,IAAI,IAAI,KAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;AAC1C,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC;AAC7B;AACA,IAAI,IAAI,KAAK,CAAC,WAAW,IAAI,YAAY,CAAC,IAAI,EAAE;AAChD,MAAM,OAAO,KAAK,CAAC;AACnB,KAAK;AACL;AACA;AACA,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA;AACA;AACA;AACA;AACA,EAAE,YAAY,CAAC,mBAAmB,GAAG,YAAY;AACjD,IAAI,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ;AACrD,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,EAAE;AACvD,MAAM,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;AAC7F,KAAK,MAAM;AACX;AACA,MAAM,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;AAC3C,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA;AACA;AACA;AACA;AACA,EAAE,YAAY,CAAC,gBAAgB,GAAG,YAAY;AAC9C,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE;AAC5B;AACA,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,SAAS;AAC9C,QAAQ,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,IAAI,SAAS;AAC5D,QAAQ,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,IAAI,SAAS,EAAE;AACtE,QAAQ,OAAO,IAAI,CAAC;AACpB,OAAO;AACP;AACA,MAAM,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC;AACrD,KAAK,MAAM;AACX,MAAM,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;AACxC,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,aAAa,GAAG,YAAY;AAC3C,IAAI,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;AACnF,IAAI,IAAI,WAAW,IAAI,WAAW,CAAC,eAAe,EAAE,IAAI,WAAW,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE;AAC7F,MAAM,IAAI,KAAK,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;AAChD,MAAM,IAAI,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;AAClC;AACA;AACA,MAAM,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AACtD,MAAM,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM;AACzD,QAAQ,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9C,QAAQ,EAAE,CAAC,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAClD,OAAO;AACP;AACA;AACA,MAAM,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACrE,MAAM,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACvE,MAAM,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC7E;AACA,MAAM,IAAI,UAAU,GAAG,EAAE,CAAC;AAC1B,MAAM,IAAI,iBAAiB,GAAG,EAAE,CAAC;AACjC,MAAM,IAAI,aAAa,GAAG,EAAE,CAAC;AAC7B;AACA,MAAM,IAAI,SAAS,CAAC,QAAQ,EAAE;AAC9B,QAAQ,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC9C,QAAQ,iBAAiB,GAAG,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC;AAC5D;AACA,QAAQ,UAAU,GAAG,iBAAiB,GAAG,UAAU,GAAG,IAAI,GAAG,iBAAiB,GAAG,UAAU,CAAC;AAC5F;AACA,QAAQ,UAAU,GAAG,CAAC,UAAU,IAAI,UAAU,GAAG,GAAG,GAAG,EAAE,CAAC;AAC1D,QAAQ,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACpD,QAAQ,aAAa,GAAG,CAAC,aAAa,IAAI,aAAa,GAAG,GAAG,GAAG,EAAE,CAAC;AACnE,OAAO;AACP;AACA,MAAM,IAAI,SAAS,EAAE;AACrB,QAAQ,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;AACxD,UAAU,CAAC,WAAW,GAAG,eAAe,GAAG,eAAe,IAAI,KAAK,CAAC,WAAW,GAAG,gBAAgB,CAAC;AACnG;AACA;AACA,QAAQ,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS,IAAI,WAAW,GAAG,cAAc,GAAG,cAAc,CAAC,CAAC;AAC3G,QAAQ,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC;AACjE,OAAO,MAAM;AACb,QAAQ,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;AACxD,UAAU,UAAU,GAAG,KAAK,CAAC,WAAW,GAAG,MAAM;AACjD,UAAU,WAAW,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC;AACnD;AACA;AACA,QAAQ,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC;AACtE,QAAQ,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS,GAAG,aAAa,CAAC;AAC5E,OAAO;AACP;AACA;AACA,MAAM,IAAI,SAAS,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE;AACrE,QAAQ,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;AACzD;AACA,QAAQ,IAAI,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACvE,QAAQ,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC/C;AACA;AACA;AACA,QAAQ,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,qBAAqB,CAAC,EAAE;AACjI,UAAU,cAAc,CAAC,GAAG,GAAG,sCAAsC,CAAC;AACtE,SAAS,MAAM;AACf,UAAU,cAAc,CAAC,GAAG,GAAG,wCAAwC,CAAC;AACxE,SAAS;AACT,OAAO,MAAM;AACb,QAAQ,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACzE,OAAO;AACP,KAAK,MAAM;AACX;AACA,MAAM,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACpE,MAAM,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACtE,MAAM,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC5E;AACA;AACA,MAAM,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC;AAC5D,MAAM,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC;AAC/D,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,wBAAwB,GAAG,YAAY;AACtD,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC,CAAC;AACvH,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,qBAAqB,GAAG,YAAY;AACnD,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC,CAAC;AACjH,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,aAAa,GAAG,UAAU,OAAO,EAAE,IAAI,EAAE;AACxD,IAAI,IAAI,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAC1D;AACA,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE;AAC5B,MAAM,IAAI,iBAAiB,IAAI,IAAI,EAAE;AACrC,QAAQ,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvC,QAAQ,OAAO;AACf,OAAO;AACP;AACA;AACA,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,wBAAwB,KAAK,SAAS,EAAE;AACrG,QAAQ,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvC,QAAQ,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;AAC7G,OAAO,MAAM;AACb;AACA,QAAQ,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvC,QAAQ,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAC;AAC9C,OAAO;AACP,KAAK,MAAM;AACX,MAAM,IAAI,iBAAiB,KAAK,IAAI,EAAE;AACtC,QAAQ,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvC,QAAQ,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAC;AAC9C,OAAO,MAAM;AACb,QAAQ,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvC,OAAO;AACP,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,SAAS,GAAG,UAAU,oBAAoB,EAAE;AAC3D,IAAI,IAAI,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;AACtD,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACtD,IAAI,IAAI,oBAAoB,GAAG,kBAAkB,EAAE;AACnD,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAC;AACnD,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,oBAAoB,GAAG,IAAI,CAAC;AACvD,MAAM,aAAa,GAAG,oBAAoB,GAAG,kBAAkB,CAAC;AAChE,KAAK,MAAM;AACX,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,KAAK;AACL,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,aAAa,CAAC;AAClD,IAAI,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,CAAC;AACjD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AACpC,MAAM,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,CAAC;AACjD,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,MAAM,GAAG,YAAY;AACpC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AACnC,MAAM,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,CAAC;AACjD,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,OAAO,GAAG,YAAY;AACrC,IAAI,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;AACrC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,MAAM,GAAG,UAAU,IAAI,EAAE;AACxC,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC;AACzC,IAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;AACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;AAC7C;AACA;AACA,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AACjC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAC9B,GAAG;AACH,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AACpD;AACA,EAAE,IAAI,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,kBAAkB,CAAC;AACzE,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACpD,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,aAAa,GAAG,IAAI,CAAC;AACxC,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC;AAC5C;AACA;AACA,EAAE,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;AAC/D;AACA,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC9B;AACA;AACA;AACA,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC,eAAe,EAAE;AACpF,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,eAAe,EAAE;AACjD,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AACpC,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AACvC;AACA;AACA;AACA,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;AAC3B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;AAC3B,GAAG,MAAM;AACT,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAC9B,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY;AACxD,EAAE,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AAC7D,EAAE,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC;AAClD;AACA,EAAE,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AACrC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,UAAU,EAAE;AACzD,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,UAAU,CAAC,CAAC;AACrD;AACA,EAAE,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC;AACtC;AACA,EAAE,IAAI,CAAC,aAAa,CAAC,gBAAgB,GAAG,SAAS,CAAC;AAClD;AACA;AACA,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AAClD,EAAE,EAAE,CAAC,GAAG,GAAG,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;AACvE;AACA;AACA,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzD,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;AAC9B,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACrD,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAC/B;AACA,EAAE,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACnE,EAAE,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzE,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,kBAAkB,CAAC;AACnD,EAAE,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AACzC;AACA;AACA,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC3B,EAAE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;AAC5B,EAAE,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9E,EAAE,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3E;AACA,EAAE,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AACvC,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAC5B,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,KAAK,EAAE;AAClD,EAAE,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;AAClI,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AACxC,IAAI,OAAO;AACX,GAAG;AACH;AACA,EAAE,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;AACrD,IAAI,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAC;AACtD,IAAI,OAAO;AACX,GAAG;AACH;AACA,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC7C,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzD,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACrD,EAAE,IAAI,QAAQ,GAAG,CAAC,CAAC;AACnB,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AACb,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AACb,EAAE,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,IAAI,oBAAoB,EAAE;AACtD,IAAI,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,GAAG,QAAQ;AAC7E,MAAM,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAC9B,IAAI,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC;AACtD,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC;AACvD,GAAG,MAAM;AACT,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,GAAG,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAChF,IAAI,EAAE,GAAG,QAAQ,CAAC;AAClB,IAAI,EAAE,GAAG,QAAQ,CAAC;AAClB,GAAG;AACH;AACA,EAAE,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO;AAC/C,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,CAAC,MAAM,EAAE;AAC9C,IAAI,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;AACrC,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC;AACrC,IAAI,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC;AACpC,GAAG;AACH;AACA,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE;AAC1B,IAAI,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;AAChE,GAAG;AACH;AACA,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,UAAU,EAAE;AACvD,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACpD,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AACd,EAAE,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,KAAK,gBAAgB,EAAE;AACxD,IAAI,GAAG,GAAG,kBAAkB,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAChE,GAAG,MAAM;AACT,IAAI,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1E,GAAG;AACH,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,YAAY;AACtD,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC3B;AACA;AACA,EAAE,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,yBAAyB,EAAE,UAAU,CAAC,CAAC;AACvE,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACrD,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;AAClB,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9B,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AACtB,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,YAAY;AACtD;AACA,EAAE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC;AACnE,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;AAC7D;AACA,EAAE,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;AAC7C;AACA,EAAE,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,IAAI,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE;AACtG,IAAI,IAAI,CAAC,aAAa,CAAC,wBAAwB,EAAE,CAAC;AAClD,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;AACpC,GAAG,MAAM,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE;AACrC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;AACvB,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,wBAAwB,GAAG,YAAY;AAC5D,EAAE,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACxD,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzD;AACA;AACA,EAAE,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;AAClC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AAC7B,MAAM,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;AACvE,KAAK;AACL;AACA,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AACpC;AACA,IAAI,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC/C,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;AAClD,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAClC,KAAK;AACL;AACA,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC9B;AACA,IAAI,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACrE,IAAI,IAAI,eAAe,IAAI,eAAe,CAAC,KAAK,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK;AAC/E,MAAM,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAC1C;AACA,IAAI,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AAC3E,IAAI,IAAI,kBAAkB,IAAI,kBAAkB,CAAC,KAAK,IAAI,kBAAkB,CAAC,KAAK,CAAC,KAAK;AACxF,MAAM,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAC7C;AACA,IAAI,OAAO;AACX,GAAG,MAAM;AACT,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;AAC1B,GAAG;AACH;AACA,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE;AACpD,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AACpC,GAAG;AACH;AACA;AACA;AACA,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;AACvF,EAAE,IAAI,EAAE,GAAG,kBAAkB,EAAE;AAC/B,IAAI,EAAE,GAAG,kBAAkB,CAAC;AAC5B,GAAG,MAAM,IAAI,EAAE,GAAG,CAAC,EAAE;AACrB,IAAI,EAAE,GAAG,CAAC,CAAC;AACX,GAAG;AACH;AACA,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC;AACtC,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC;AAClC;AACA,EAAE,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACnE,EAAE,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzE,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE;AAC1B,IAAI,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAChC;AACA,MAAM,IAAI,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;AACvH,QAAQ,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;AACxD,MAAM,IAAI,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,qBAAqB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;AACtG,MAAM,IAAI,aAAa,GAAG,kBAAkB,EAAE;AAC9C,QAAQ,aAAa,GAAG,kBAAkB,CAAC;AAC3C,OAAO,MAAM,IAAI,aAAa,GAAG,CAAC,EAAE;AACpC,QAAQ,aAAa,GAAG,CAAC,CAAC;AAC1B,OAAO;AACP,MAAM,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,aAAa,GAAG,IAAI,CAAC;AACzD;AACA,MAAM,IAAI,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;AAC3H,QAAQ,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;AACxD,MAAM,IAAI,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,uBAAuB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;AAC1G,MAAM,IAAI,eAAe,GAAG,kBAAkB,EAAE;AAChD,QAAQ,eAAe,GAAG,kBAAkB,CAAC;AAC7C,OAAO,MAAM,IAAI,eAAe,GAAG,CAAC,EAAE;AACtC,QAAQ,eAAe,GAAG,CAAC,CAAC;AAC5B,OAAO;AACP,MAAM,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,eAAe,GAAG,IAAI,CAAC;AAC9D,KAAK,MAAM;AACX;AACA,MAAM,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAC1C,MAAM,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,kBAAkB,GAAG,IAAI,CAAC;AACjE,KAAK;AACL,GAAG,MAAM;AACT;AACA,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,kBAAkB,GAAG,IAAI,CAAC;AAC5D,IAAI,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAC3C,GAAG;AACH;AACA,EAAE,IAAI,EAAE,IAAI,kBAAkB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACvD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;AACvB,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,WAAW,GAAG,YAAY;AAC/C,EAAE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;AAC5B,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC3B,EAAE,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AACvC,EAAE,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AACrC;AACA,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC7C,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO;AACxC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACjC;AACA,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AAC/C,EAAE,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO;AACjD,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACjC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,SAAS,EAAE;AAC/D,EAAE,IAAI,SAAS,IAAI,SAAS,IAAI,SAAS,IAAI,IAAI,EAAE;AACnD,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG;AACH;AACA,EAAE,IAAI,UAAU,GAAG,KAAK,CAAC;AACzB,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE;AACrB,IAAI,UAAU,GAAG,IAAI,CAAC;AACtB,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC;AACpB,GAAG;AACH;AACA,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;AAC3C,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9D,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;AACxE;AACA,EAAE,IAAI,KAAK,GAAG,EAAE,EAAE,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC;AACtC,EAAE,IAAI,OAAO,GAAG,EAAE,EAAE,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;AAC5C,EAAE,IAAI,OAAO,GAAG,EAAE,EAAE,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;AAC5C;AACA,EAAE,OAAO,CAAC,UAAU,GAAG,GAAG,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;AACzE,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,SAAS,EAAE;AAC/D,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,SAAS,CAAC;AACnC;AACA,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;AACxC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC9B,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AAClC,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AAClC,EAAE,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACvC,EAAE,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;AACrB;AACA,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;AAC7B,EAAE,OAAO,GAAG,CAAC,GAAG,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,EAAE,OAAO,GAAG,CAAC,GAAG,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,EAAE,IAAI,SAAS,GAAG,KAAK,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC;AACrE,EAAE,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,eAAe,GAAG,YAAY;AACnD,EAAE,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;AACjF,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO;AAC3B;AACA,EAAE,IAAI,KAAK,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;AAC5C,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO;AACrB;AACA,EAAE,IAAI,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;AAC9B,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO;AACzB;AACA,EAAE,IAAI,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;AAChC,EAAE,IAAI,eAAe,GAAG,SAAS,CAAC,QAAQ,CAAC;AAC3C;AACA,EAAE,IAAI,CAAC,MAAM,EAAE;AACf,IAAI,OAAO;AACX,GAAG;AACH;AACA,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,IAAI,IAAI,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAC5B;AACA;AACA;AACA,IAAI,IAAI,OAAO,CAAC,QAAQ,GAAG,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE;AAClE,MAAM,SAAS;AACf,KAAK;AACL;AACA;AACA,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC3D,MAAM,IAAI,GAAG,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAC;AACnD,MAAM,GAAG,CAAC,SAAS,IAAI,8BAA8B,GAAG,OAAO,CAAC,QAAQ;AACxE,QAAQ,wBAAwB;AAChC,QAAQ,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,GAAG,YAAY,CAAC;AAClF,KAAK;AACL,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,eAAe,GAAG,YAAY;AACnD,EAAE,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,UAAU,QAAQ,EAAE;AACrE,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;AACtB,GAAG,CAAC,CAAC;AACL,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,QAAQ,EAAE,eAAe,EAAE;AAC/E;AACA,EAAE,IAAI,QAAQ,IAAI,CAAC,CAAC,EAAE;AACtB,IAAI,OAAO,kBAAkB,CAAC;AAC9B,GAAG;AACH;AACA;AACA;AACA,EAAE,IAAI,QAAQ,GAAG,eAAe,EAAE;AAClC,IAAI,OAAO,kBAAkB,CAAC;AAC9B,GAAG;AACH;AACA;AACA,EAAE,OAAO,CAAC,kBAAkB,GAAG,QAAQ,IAAI,eAAe,CAAC;AAC3D,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY;AACxD;AACA,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC7C,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;AAC9C,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAChC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,cAAc,GAAG,UAAU,cAAc,EAAE;AAChE,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,cAAc,CAAC,CAAC;AAC1C,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,sBAAsB,GAAG,UAAU,aAAa,EAAE;AACvE,EAAE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;AACrC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,6BAA6B,GAAG,UAAU,oBAAoB,EAAE;AACrF,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC7C;AACA;AACA,EAAE,IAAI,IAAI,CAAC,aAAa,IAAI,SAAS,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE;AACjE;AACA,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;AAChD,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAClC,GAAG;AACH;AACA,OAAO,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,oBAAoB,IAAI,IAAI,CAAC,aAAa,EAAE;AAC3F;AACA,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;AAChD,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACnC,GAAG;AACH;AACA,OAAO;AACP;AACA,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;AAChD,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAClC,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;AAC1C,EAAE,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,CAAC;AACvC,EAAC;AACD;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,UAAU,MAAM,EAAE;AAC3D,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACrD,EAAE,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzE,EAAE,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACnE;AACA,EAAE,IAAI,MAAM,EAAE;AACd;AACA,IAAI,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,qDAAqD,CAAC;AAC3F,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AACtC,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AAC7C,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AAChD,IAAI,kBAAkB,CAAC,SAAS,GAAG,IAAI,CAAC;AACxC;AACA;AACA,IAAI,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC/D,IAAI,eAAe,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACtE,IAAI,kBAAkB,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC3E,GAAG,MAAM;AACT;AACA,IAAI,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,mDAAmD,CAAC;AACzF,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AACtC,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AAC7C,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AAChD,IAAI,kBAAkB,CAAC,SAAS,GAAG,KAAK,CAAC;AACzC;AACA;AACA,IAAI,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAClE,IAAI,eAAe,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACzE,IAAI,kBAAkB,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC9E,GAAG;AACH,EAAC;AACD;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACrD;AACA,EAAE,IAAI,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AACzD,EAAE,IAAI,aAAa;AACnB,IAAI,OAAO,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAAC;AACvE;AACA,EAAE,IAAI,aAAa,EAAE;AACrB;AACA,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAChC,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AACxC,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD;AACA,EAAE,IAAI,aAAa;AACnB,IAAI,QAAQ,CAAC,kBAAkB,CAAC,IAAI,QAAQ,CAAC,wBAAwB,CAAC,CAAC;AACvE;AACA,EAAE,IAAI,aAAa,EAAE;AACrB,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACjC,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,uBAAuB,GAAG,YAAY;AAC3D,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;AACrC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY;AACxD,EAAE,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;AACvE,EAAE,IAAI,mBAAmB,GAAG,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;AAC3E;AACA,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE;AACvB,IAAI,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO;AACvF,MAAM,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC/C;AACA,IAAI,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO;AAC7F,MAAM,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAClD,GAAG,MAAM;AACT,IAAI,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO;AACvF,MAAM,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAChD;AACA,IAAI,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO;AAC7F,MAAM,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACjD,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY;AACxD,EAAE,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;AACvE,EAAE,IAAI,mBAAmB,GAAG,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;AAC3E;AACA,EAAE,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO;AACrF,MAAM,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC/C;AACA,EAAE,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO;AAC3F,MAAM,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACjD,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD,EAAE,IAAI,aAAa,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AAC/D,EAAE,IAAI,aAAa,IAAI,aAAa,CAAC,KAAK,IAAI,aAAa,CAAC,OAAO;AACnE,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;AACtC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;AAC5D,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;AAC3D,IAAI,IAAI,OAAO,IAAI,OAAO,CAAC,iBAAiB,EAAE,EAAE;AAChD;AACA,MAAM,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;AACnE,KAAK,MAAM;AACX,MAAM,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AACjE,KAAK;AACL,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE;AACrC,IAAI,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAC1D,IAAI,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAChE,IAAI,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAChE,IAAI,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AACjE,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AACxD,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAC/D,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACrD,EAAE,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC;AACjF,EAAE,IAAI,yBAAyB,GAAG,cAAc,GAAG,iBAAiB,CAAC;AACrE,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,MAAM;AACxD,IAAI,yBAAyB,GAAG,IAAI,CAAC;AACrC,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC9D,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,YAAY,GAAG,YAAY;AAChD;AACA,EAAE,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3D,IAAI,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;AACpD,MAAM,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACrC;AACA,IAAI,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS;AACvD,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,UAAU,CAAC,CAAC;AAC7D,GAAG;AACH;AACA,EAAE,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,gBAAgB;AAC7D,IAAI,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACrC,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACrC,EAAE,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,gBAAgB;AAChE,IAAI,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACvC,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,gBAAgB;AAClD,IAAI,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACrC,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AAC/D,EAAE,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,gBAAgB;AACvD,IAAI,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AACjE,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB;AAC5D,IAAI,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB;AAC5D,IAAI,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB;AAC5D,IAAI,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACxC,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB;AAC5D,IAAI,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACxC,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,EAAE,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,gBAAgB;AACxD,IAAI,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,EAAE,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,gBAAgB;AACxD,IAAI,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,EAAE,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,gBAAgB;AAC3D,IAAI,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,EAAE,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,gBAAgB;AAC3D,IAAI,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,EAAE,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,gBAAgB;AAC/D,IAAI,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChD,EAAE,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,gBAAgB;AACjE,IAAI,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,EAAE,QAAQ,CAAC,gBAAgB;AAC3B,IAAI,kBAAkB,EAAE,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AACxE,EAAE,QAAQ,CAAC,gBAAgB;AAC3B,IAAI,wBAAwB,EAAE,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AAC9E;AACA;AACA,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,gBAAgB;AAClD,IAAI,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AAC/D,EAAE,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,gBAAgB;AACnD,IAAI,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AAChE;AACA,EAAE,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;AACjE;AACA;AACA,EAAE,IAAI,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAClD,EAAE,SAAS,CAAC,OAAO,GAAG,YAAY;AAClC,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,IAAI,UAAU,GAAG,KAAK,CAAC;AACvB,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAC9C,IAAG;AACH,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAChD,EAAE,QAAQ,CAAC,OAAO,GAAG,YAAY;AACjC,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,IAAI,UAAU,GAAG,IAAI,CAAC;AACtB,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AACzC,IAAG;AACH,EAAE,IAAI,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAClD,EAAE,SAAS,CAAC,OAAO,GAAG,YAAY;AAClC,IAAI,WAAW,GAAG,IAAI,CAAC;AACvB,IAAI,UAAU,GAAG,KAAK,CAAC;AACvB,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AACzC,IAAG;AACH;AACA,EAAE,IAAI,UAAU,EAAE;AAClB,IAAI,IAAI,WAAW,EAAE;AACrB,MAAM,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;AAChF,KAAK;AACL,IAAI,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;AAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AACnC,GAAG,MAAM,IAAI,WAAW,EAAE;AAC1B,IAAI,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;AAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AACnC,GAAG,MAAM;AACT,IAAI,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;AAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAC3C,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,cAAc,GAAG,YAAY;AAClD,EAAE,IAAIA,WAAS,IAAIA,WAAS,CAAC,YAAY,CAAC,IAAIA,WAAS,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAClF,IAAI,IAAI,CAAC,aAAa,GAAGA,WAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC9D,IAAI,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACjD,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC;AACtB,IAAI,IAAI,SAAS,GAAG,IAAI,CAAC;AACzB,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAC7C,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC;AACtC,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAC3C,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5C,MAAM,MAAM,CAAC,SAAS;AACtB,QAAQ,YAAY,GAAG,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACzE,QAAQ,sBAAsB,CAAC;AAC/B,MAAM,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACvE,MAAM,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAC7B,KAAK;AACL,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,eAAe,GAAG,UAAU,KAAK,EAAE;AAC9C,EAAE,QAAQ,KAAK,CAAC,IAAI;AACpB,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB;AAClD,MAAM,OAAO,6BAA6B;AAC1C,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM;AACrC,MAAM,OAAO,wCAAwC;AACrD,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa;AAC5C,MAAM,OAAO,6CAA6C;AAC1D,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB;AAChD,MAAM,OAAO,sCAAsC;AACnD,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB;AAChD,MAAM,OAAO,iDAAiD;AAC9D,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB;AACnD,MAAM,OAAO,sDAAsD;AACnE,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa;AAC5C,MAAM,OAAO,2DAA2D;AACxE,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO;AACtC,MAAM,OAAO,0BAA0B;AACvC,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI;AACJ,MAAM,OAAO,KAAK,CAAC;AACnB,GAAG;AACH,CAAC,CAAC;AACF;AACA,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;AAClC,MAAM,CAAC,uBAAuB,CAAC,GAAG,UAAU,WAAW,EAAE;AACzD,EAAE,IAAI,WAAW,EAAE;AACnB,IAAI,UAAU,CAAC,oBAAoB,EAAE,CAAC;AACtC,GAAG;AACH,CAAC;;AC5oDD;;;;;;"} \ No newline at end of file +{"version":3,"file":"thinkam.net-ng-cast.js","sources":["../../CastVideos.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../index.ts","../../thinkam.net-ng-cast.ts"],"sourcesContent":["'use strict';\n\n/** Cleaner UI for demo purposes. */\nconst DEMO_MODE = false;\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/';\n\n/**\n * Controls if Ads are enabled. Controlled by radio button.\n * @type {boolean}\n */\nlet ENABLE_ADS = false;\n\n/**\n * Controls if Live stream is played. Controlled by radio button.\n * @type {boolean}\n */\nlet ENABLE_LIVE = false;\n\n/**\n * Buffer to decide if the live indicator should be displayed to show that\n * playback is at the playback head.\n * @const {number}\n */\nconst LIVE_INDICATOR_BUFFER = 50;\n\n/**\n * Width of progress bar in pixels.\n * @const {number}\n */\nconst PROGRESS_BAR_WIDTH = 700;\n\n/**\n * Time in milliseconds for minimal progress update.\n * @const {number}\n */\nconst TIMER_STEP = 1000;\n\n/**\n * Cast volume upon initial connection.\n * @const {number}\n */\nconst DEFAULT_VOLUME = 0.5;\n\n/**\n * Height, in pixels, of volume bar.\n * @const {number}\n */\nconst FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.setupLocalPlayer();\n this.addVideoThumbs();\n this.initializeUI();\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = function () {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = 'C0868879';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n this.remotePlayer = new cast.framework.RemotePlayer();\n this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer);\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n function (e) {\n this.switchPlayer(e.value);\n }.bind(this)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = function () {\n this.playerStateBeforeSwitch = this.playerState;\n\n this.stopProgressTimer();\n this.resetVolumeSlider();\n\n // Session is active\n if (cast && cast.framework && this.remotePlayer.isConnected) {\n // Pause local playback\n this.playerHandler.pause();\n this.setupRemotePlayer();\n } else {\n this.setupLocalPlayer();\n }\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n this.updateDurationDisplay = function () {\n this.target.updateDurationDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = function () {\n // Cleanup remote player UI\n let live_indicator = document.getElementById('live_indicator');\n if (live_indicator && live_indicator.style && live_indicator.style.display) {\n live_indicator.style.display = 'none';\n }\n\n this.removeAdMarkers();\n document.getElementById('skip').style.display = 'none';\n\n var localPlayer = document.getElementById('video_element');\n if (typeof localPlayer !== 'undefined' && localPlayer)\n localPlayer.addEventListener(\n 'loadeddata', this.onMediaLoadedLocally.bind(this));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src = this.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n if (!mediaIndex) {\n return (localPlayer.src !== null && localPlayer.src !== \"\");\n } else {\n return (localPlayer.src == this.mediaContents[mediaIndex]['sources'][0]);\n }\n }.bind(this);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplay = function () {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n };\n\n playerTarget.updateCurrentTimeDisplay = function () {\n // Increment for local playback\n this.currentMediaTime += 1;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.currentMediaTime);\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.mediaDuration);\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n if (currentTimeString !== null) {\n element.style.display = '';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n if (localPlayer) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n }\n\n var p = document.getElementById('audio_bg_level');\n if (typeof p !== 'undefined' && p) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n }\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n if (localPlayer)\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n this.playerHandler.setTarget(playerTarget);\n\n this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n this.showFullscreenButton();\n\n this.enableProgressBar(true);\n\n if (this.currentMediaTime > 0) {\n this.playerHandler.load();\n this.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n this.mediaInfo = media.media;\n\n if (this.mediaInfo) {\n this.isLiveContent = (this.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n this.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) {\n this.playerHandler.prepareToPlay();\n }\n\n this.removeAdMarkers();\n this.updateAdMarkers();\n\n this.playerHandler.updateDisplay();\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n this.enableProgressBar(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (this.remotePlayer.isPaused) {\n this.playerHandler.pause();\n } else if (this.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n this.playerHandler.play();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n } else {\n this.playerHandler.unMute();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n this.isPlayingBreak(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n this.onWhenSkippableChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n this.onCurrentBreakClipTimeChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n this.onBreakClipIdChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n this.liveSeekableRange = event.value;\n }.bind(this)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(this);\n\n playerTarget.pause = function () {\n if (!this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n }.bind(this);\n\n playerTarget.stop = function () {\n this.remotePlayerController.stop();\n }.bind(this);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n\n let mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;\n mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata();\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle'];\n mediaInfo.metadata.images = [{\n 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']\n }];\n\n let request = new chrome.cast.media.LoadRequest(mediaInfo);\n request.currentTime = this.currentMediaTime;\n\n if (ENABLE_ADS) {\n // Add sample breaks and breakClips.\n mediaInfo.breakClips = breakClipsJSON;\n mediaInfo.breaks = breaksJSON;\n } else if (ENABLE_LIVE) {\n // Change the streamType and add live specific metadata.\n mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;\n // TODO: Set the metadata on the receiver side in your implementation.\n // startAbsoluteTime and sectionStartTimeInMedia will be set for you.\n // See https://developers.google.com/cast/docs/caf_receiver/live.\n\n // TODO: Start time, is a fake timestamp. Use correct values for your implementation.\n let currentTime = new Date();\n // Convert from milliseconds to seconds.\n currentTime = currentTime / 1000;\n let sectionStartAbsoluteTime = currentTime;\n\n // Duration should be -1 for live streams.\n mediaInfo.duration = -1;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.startAbsoluteTime = currentTime;\n mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.metadata.sectionStartTimeInMedia = 0;\n mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration'];\n\n let item = new chrome.cast.media.QueueItem(mediaInfo);\n request.queueData = new chrome.cast.media.QueueData();\n request.queueData.items = [item];\n request.queueData.name = \"Sample Queue for Live\";\n }\n\n // Do not immediately start playing if the player was previously PAUSED.\n if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) {\n request.autoplay = false;\n } else {\n request.autoplay = true;\n }\n\n cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(\n function () {\n console.log('Remote media loaded');\n }.bind(this),\n function (errorCode) {\n this.playerState = PLAYER_STATE.IDLE;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n this.playerHandler.updateDisplay();\n }.bind(this));\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(this);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (this.isLiveContent && this.mediaInfo.metadata &&\n this.mediaInfo.metadata.sectionStartTimeInMedia) {\n return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return this.remotePlayer.currentTime;\n }\n }.bind(this);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (this.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (this.mediaInfo.metadata == undefined ||\n this.mediaInfo.metadata.sectionDuration == undefined ||\n this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return this.mediaInfo.metadata.sectionDuration;\n } else {\n return this.remotePlayer.duration;\n }\n }.bind(this);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n this.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(this);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime());\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration());\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n\n if (this.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = this.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n this.remotePlayer.volumeLevel = currentVolume;\n this.remotePlayerController.setVolumeLevel();\n }.bind(this);\n\n playerTarget.mute = function () {\n if (!this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.unMute = function () {\n if (this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.isMuted = function () {\n return this.remotePlayer.isMuted;\n }.bind(this);\n\n playerTarget.seekTo = function (time) {\n this.remotePlayer.currentTime = time;\n this.remotePlayerController.seek();\n }.bind(this);\n\n this.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n }\n this.enableProgressBar(this.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n this.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n this.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n this.removeAdMarkers();\n this.updateAdMarkers();\n } else {\n this.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = this.currentMediaTime;\n\n this.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n this.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n this.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n this.stopProgressTimer();\n this.currentMediaTime = 0;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n this.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (this.isLiveContent && !this.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (this.playerState === PLAYER_STATE.PLAYING ||\n this.playerState === PLAYER_STATE.PAUSED) {\n this.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (this.isLiveContent) {\n seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n this.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n this.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n this.stopProgressTimer();\n\n // Start progress timer\n this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n this.currentMediaTime = this.playerHandler.getCurrentMediaTime();\n this.mediaDuration = this.playerHandler.getMediaDuration();\n\n this.playerHandler.updateDurationDisplay();\n\n if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) {\n this.playerHandler.updateCurrentTimeDisplay();\n this.updateProgressBarByTimer();\n } else if (this.mediaDuration > 0) {\n this.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (this.mediaDuration == null) {\n if (!this.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n \n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n \n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (this.isLiveContent) {\n if (this.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) {\n this.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n this.currentMediaTime = 0;\n this.stopProgressTimer();\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n this.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n this.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (this.whenSkippable == undefined || this.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n this.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', this.seekMediaListener);\n seekable_window.addEventListener('click', this.seekMediaListener);\n progress_indicator.addEventListener('dragend', this.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', this.seekMediaListener);\n seekable_window.removeEventListener('click', this.seekMediaListener);\n progress_indicator.removeEventListener('dragend', this.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n this.fullscreen = !this.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (this.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block'; \n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!this.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = function () {\n // Set initial values for title and subtitle.\n if (this.mediaContents && this.mediaContents.length > 0) {\n document.getElementById('media_title').innerHTML =\n this.mediaContents[0]['title'];\n\n document.getElementById('media_subtitle').innerHTML =\n this.mediaContents[this.currentMediaIndex]['subtitle'];\n }\n\n document.getElementById('seekable_window').addEventListener(\n 'click', this.seekMediaListener);\n document.getElementById('progress').addEventListener(\n 'click', this.seekMediaListener);\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', this.seekMediaListener);\n document.getElementById('skip').addEventListener(\n 'click', this.skipAd.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'click', this.playerHandler.mute.bind(this.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', this.playerHandler.unMute.bind(this.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n\n let main_video = document.getElementById('main_video');\n if (typeof main_video !== 'undefined' && main_video) {\n main_video.addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n main_video.addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n }\n \n document.getElementById('media_control').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', this.requestFullScreen.bind(this));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', this.cancelFullScreen.bind(this));\n document.addEventListener(\n 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n document.addEventListener(\n 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', this.playerHandler.play.bind(this.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', this.playerHandler.pause.bind(this.playerHandler));\n\n document.getElementById('progress_indicator').draggable = true;\n\n // Set up feature radio buttons\n let noneRadio = document.getElementById('none');\n noneRadio.onclick = function () {\n ENABLE_LIVE = false;\n ENABLE_ADS = false;\n console.log(\"Features have been removed\");\n }\n let adsRadio = document.getElementById('ads');\n adsRadio.onclick = function () {\n ENABLE_LIVE = false;\n ENABLE_ADS = true;\n console.log(\"Ads have been enabled\");\n }\n let liveRadio = document.getElementById('live');\n liveRadio.onclick = function () {\n ENABLE_LIVE = true;\n ENABLE_ADS = false;\n console.log(\"Live has been enabled\");\n }\n\n if (ENABLE_ADS) {\n if (ENABLE_LIVE) {\n console.error('Only one feature can be enabled at a time. Enabling ads.');\n }\n adsRadio.checked = true;\n console.log(\"Ads are enabled\");\n } else if (ENABLE_LIVE) {\n liveRadio.checked = true;\n console.log(\"Live is enabled\");\n } else {\n noneRadio.checked = true;\n console.log(\"No features are enabled\");\n }\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) {\n this.mediaContents = this.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < this.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', this.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","import { Component, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID);\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n };\n\n play = () => { \n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n globalThis.CastPlayer.addVideoThumbs();\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n"," // ------ project path -------- | --- lib ---\nimport \"/home/thinker/dev/thinkam/ngCast/CastVideos.js\";\n\nexport * from './ng.cast.module';\nexport * from './shared/ng-cast.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index 282628c..aebfd96 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,3 +1,3 @@ +import "/home/thinker/dev/thinkam/ngCast/CastVideos.js"; export * from './ng.cast.module'; export * from './shared/ng-cast.service'; -import "/home/thinker/dev/thinkam/ngCast/CastVideos.js"; diff --git a/dist/package.json b/dist/package.json index 4e224da..2fed340 100644 --- a/dist/package.json +++ b/dist/package.json @@ -4,7 +4,7 @@ "assets": [ "./CastVideos.js" ], - "version": "0.1.7", + "version": "0.1.28", "description": "Broadcast media on your TV from your Angular app", "main": "bundles/thinkam.net-ng-cast.umd.js", "repository": { diff --git a/dist/shared/ng-cast.service.d.ts b/dist/shared/ng-cast.service.d.ts index c8323bb..7bb378a 100644 --- a/dist/shared/ng-cast.service.d.ts +++ b/dist/shared/ng-cast.service.d.ts @@ -1,4 +1,7 @@ import { Subject } from 'rxjs'; +declare global { + var CastPlayer: any; +} export declare class NgCastService { private cast; private currentMedia; diff --git a/dist/thinkam.net-ng-cast.metadata.json b/dist/thinkam.net-ng-cast.metadata.json index a6229d0..cc947a1 100644 --- a/dist/thinkam.net-ng-cast.metadata.json +++ b/dist/thinkam.net-ng-cast.metadata.json @@ -1 +1 @@ -{"__symbolic":"module","version":4,"metadata":{"NgCastModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":5,"character":1},"arguments":[{"schemas":[{"__symbolic":"reference","module":"@angular/core","name":"CUSTOM_ELEMENTS_SCHEMA","line":6,"character":13}],"imports":[{"__symbolic":"reference","module":"@angular/common","name":"CommonModule","line":8,"character":4}],"exports":[{"__symbolic":"reference","name":"ɵa"}],"providers":[{"__symbolic":"reference","name":"NgCastService"}],"declarations":[{"__symbolic":"reference","name":"ɵa"}]}]}],"members":{}},"NgCastService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":6,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor"}],"initializeCastApi":[{"__symbolic":"method"}],"setCasting":[{"__symbolic":"method"}],"getStatus":[{"__symbolic":"method"}]}},"ɵa":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":4,"character":1},"arguments":[{"selector":"ng-cast","template":"cast\ncast_connected","styles":[""]}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"NgCastService"}]}],"ngOnInit":[{"__symbolic":"method"}],"openSession":[{"__symbolic":"method"}],"closeSession":[{"__symbolic":"method"}]}}},"origins":{"NgCastModule":"./ng.cast.module","NgCastService":"./shared/ng-cast.service","ɵa":"./ng-cast.component"},"importAs":"@thinkam.net/ng-cast"} \ No newline at end of file +{"__symbolic":"module","version":4,"metadata":{"NgCastModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":6,"character":1},"arguments":[{"schemas":[{"__symbolic":"reference","module":"@angular/core","name":"CUSTOM_ELEMENTS_SCHEMA","line":7,"character":13}],"imports":[{"__symbolic":"reference","module":"@angular/common","name":"CommonModule","line":9,"character":4}],"exports":[{"__symbolic":"reference","name":"ɵa"}],"providers":[{"__symbolic":"reference","name":"NgCastService"}],"declarations":[{"__symbolic":"reference","name":"ɵa"}]}]}],"members":{}},"NgCastService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":8,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor"}],"initializeCastApi":[{"__symbolic":"method"}],"setCasting":[{"__symbolic":"method"}],"getStatus":[{"__symbolic":"method"}]}},"ɵa":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":4,"character":1},"arguments":[{"selector":"ng-cast","template":"cast\ncast_connected","styles":[""]}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"NgCastService"}]}],"ngOnInit":[{"__symbolic":"method"}],"openSession":[{"__symbolic":"method"}],"closeSession":[{"__symbolic":"method"}]}}},"origins":{"NgCastModule":"./ng.cast.module","NgCastService":"./shared/ng-cast.service","ɵa":"./ng-cast.component"},"importAs":"@thinkam.net/ng-cast"} \ No newline at end of file diff --git a/index.ts b/index.ts index 65f7818..6d95813 100644 --- a/index.ts +++ b/index.ts @@ -1,5 +1,5 @@ + // ------ project path -------- | --- lib --- +import "/home/thinker/dev/thinkam/ngCast/CastVideos.js"; + export * from './ng.cast.module'; export * from './shared/ng-cast.service'; - - // ------ project path -------- | --- lib --- -import "/home/thinker/dev/thinkam/ngCast/CastVideos.js"; \ No newline at end of file diff --git a/ng-cast.component.ts b/ng-cast.component.ts index 488174a..52fb5bf 100644 --- a/ng-cast.component.ts +++ b/ng-cast.component.ts @@ -35,7 +35,7 @@ export class NgCastComponent implements OnInit { } closeSession() { - this.ngCastService.stop(); + this.ngCastService.discoverDevices(); } } diff --git a/ng.cast.module.ts b/ng.cast.module.ts index 0afefe6..cd3c74d 100644 --- a/ng.cast.module.ts +++ b/ng.cast.module.ts @@ -3,6 +3,7 @@ import { CommonModule } from '@angular/common'; import { NgCastComponent } from './ng-cast.component'; import { NgCastService } from './shared/ng-cast.service'; + @NgModule({ schemas: [ CUSTOM_ELEMENTS_SCHEMA ], imports: [ diff --git a/package.json b/package.json index f8c7ba5..e3842e6 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "assets": [ "./CastVideos.js" ], - "version": "0.1.7", + "version": "0.1.28", "ngPackage": { "lib": { "entryFile": "index.ts" diff --git a/shared/ng-cast.service.ts b/shared/ng-cast.service.ts index 8f3d7aa..b86c7f7 100644 --- a/shared/ng-cast.service.ts +++ b/shared/ng-cast.service.ts @@ -2,7 +2,9 @@ import { Injectable } from '@angular/core'; import { Subject } from 'rxjs'; -declare var mediaJSON: any; +declare global { + var CastPlayer: any; +} @Injectable() export class NgCastService { @@ -15,7 +17,9 @@ export class NgCastService { }; constructor() { - + globalThis.CastPlayer.mediaJSON = { + categories: [] + }; } initializeCastApi() { @@ -61,10 +65,10 @@ export class NgCastService { script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1'); window['document'].body.appendChild(script); - mediaJSON.categories = categories; + globalThis.CastPlayer.mediaJSON.categories = categories; }; - play = () => { + play = () => { this.currentMedia.play(null); }; @@ -81,6 +85,7 @@ export class NgCastService { }; setCasting(value: any) { + globalThis.CastPlayer.addVideoThumbs(); this.status.casting = value; } diff --git a/tsconfig.json b/tsconfig.json index abee8fe..4af68ad 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,9 +8,9 @@ ], /* Specify library files to be included in the compilation. */ "baseUrl": ".", "paths": { - "@lib/*": [ "./@types/lib/*" ] + "@types/*": [ "./@types/*" ] }, - // "allowJs": true, /* Allow javascript files to be compiled. */ + "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ "declaration": true, /* Generates corresponding '.d.ts' file. */ From ef5e3da748d49a61c7b6e781ab31807119899d10 Mon Sep 17 00:00:00 2001 From: Felipe de Almeida Date: Sun, 11 Oct 2020 14:26:10 -0300 Subject: [PATCH 02/10] initial smart component --- CastVideos.js | 339 +- dist/bundles/thinkam.net-ng-cast.umd.js | 3602 ++++++++--------- dist/bundles/thinkam.net-ng-cast.umd.js.map | 2 +- dist/bundles/thinkam.net-ng-cast.umd.min.js | 16 +- .../thinkam.net-ng-cast.umd.min.js.map | 2 +- dist/esm2015/index.js | 6 +- dist/esm2015/ng-cast.component.js | 18 +- dist/esm2015/shared/ng-cast.service.js | 9 +- dist/fesm2015/thinkam.net-ng-cast.js | 586 ++- dist/fesm2015/thinkam.net-ng-cast.js.map | 2 +- dist/index.d.ts | 2 +- dist/ng-cast.component.d.ts | 3 + dist/package.json | 2 +- dist/thinkam.net-ng-cast.metadata.json | 2 +- index.ts | 6 +- ng-cast.component.html | 48 +- ng-cast.component.ts | 6 +- package.json | 2 +- shared/ng-cast.service.ts | 8 +- tsconfig.json | 11 +- 20 files changed, 2214 insertions(+), 2458 deletions(-) diff --git a/CastVideos.js b/CastVideos.js index 53cc783..81316a4 100755 --- a/CastVideos.js +++ b/CastVideos.js @@ -1,59 +1,29 @@ -'use strict'; - -/** Cleaner UI for demo purposes. */ -const DEMO_MODE = false; +"use strict"; /** @const {string} Media source root URL */ -const MEDIA_SOURCE_ROOT = 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/'; - -/** - * Controls if Ads are enabled. Controlled by radio button. - * @type {boolean} - */ -let ENABLE_ADS = false; - -/** - * Controls if Live stream is played. Controlled by radio button. - * @type {boolean} - */ -let ENABLE_LIVE = false; - -/** - * Buffer to decide if the live indicator should be displayed to show that - * playback is at the playback head. - * @const {number} - */ -const LIVE_INDICATOR_BUFFER = 50; +const MEDIA_SOURCE_ROOT = ''; /** - * Width of progress bar in pixels. - * @const {number} + * Width of progress bar in pixel + * @const */ -const PROGRESS_BAR_WIDTH = 700; +var PROGRESS_BAR_WIDTH = 600; -/** - * Time in milliseconds for minimal progress update. - * @const {number} - */ -const TIMER_STEP = 1000; +/** @const {number} Time in milliseconds for minimal progress update */ +var TIMER_STEP = 1000; -/** - * Cast volume upon initial connection. - * @const {number} - */ -const DEFAULT_VOLUME = 0.5; +/** @const {number} Cast volume upon initial connection */ +var DEFAULT_VOLUME = 0.5; -/** - * Height, in pixels, of volume bar. - * @const {number} - */ -const FULL_VOLUME_HEIGHT = 100; +/** @const {number} Height, in pixels, of volume bar */ +var FULL_VOLUME_HEIGHT = 100; /** @enum {string} Constants of states for media for both local and remote playback */ const PLAYER_STATE = { // No media is loaded into the player. For remote playback, maps to // the PlayerState.IDLE state. IDLE: 'IDLE', + LOADING: 'LOADING', // Player is in PLAY mode but not actively playing content. For remote // playback, maps to the PlayerState.BUFFERING state. BUFFERING: 'BUFFERING', @@ -62,7 +32,9 @@ const PLAYER_STATE = { // The media is playing. For remote playback, maps to the PlayerState.PLAYING state. PLAYING: 'PLAYING', // The media is paused. For remote playback, maps to the PlayerState.PAUSED state. - PAUSED: 'PAUSED' + PAUSED: 'PAUSED', + STOPPED: 'STOPPED', + ERROR: 'ERROR' }; /** @@ -135,10 +107,6 @@ var CastPlayer = function () { /** @type {boolean} Remote player is playing live content. */ this.isLiveContent = false; - this.setupLocalPlayer(); - this.addVideoThumbs(); - this.initializeUI(); - this.mediaJSON = { 'categories': [] }; @@ -150,7 +118,7 @@ CastPlayer.prototype.initializeCastPlayer = function () { // Set the receiver application ID to your own (created in the // Google Cast Developer Console), or optionally // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID - options.receiverApplicationId = 'C0868879'; + options.receiverApplicationId = '4F8B3483'; // Auto join policy can be one of the following three: // ORIGIN_SCOPED - Auto connect from same appId and page origin @@ -347,121 +315,71 @@ var PlayerHandler = function (castPlayer) { * Set the PlayerHandler target to use the video-element player */ CastPlayer.prototype.setupLocalPlayer = function () { - // Cleanup remote player UI - let live_indicator = document.getElementById('live_indicator'); - if (live_indicator && live_indicator.style && live_indicator.style.display) { - live_indicator.style.display = 'none'; - } - - this.removeAdMarkers(); - document.getElementById('skip').style.display = 'none'; - var localPlayer = document.getElementById('video_element'); - if (typeof localPlayer !== 'undefined' && localPlayer) - localPlayer.addEventListener( + localPlayer.addEventListener( 'loadeddata', this.onMediaLoadedLocally.bind(this)); // This object will implement PlayerHandler callbacks with localPlayer var playerTarget = {}; - playerTarget.play = function () { - localPlayer.play(); + playerTarget.play = function() { + localPlayer.play(); - var vi = document.getElementById('video_image'); - vi.style.display = 'none'; - localPlayer.style.display = 'block'; + var vi = document.getElementById('video_image'); + vi.style.display = 'none'; + localPlayer.style.display = 'block'; }; playerTarget.pause = function () { - localPlayer.pause(); + localPlayer.pause(); }; playerTarget.stop = function () { - localPlayer.stop(); + localPlayer.stop(); }; - playerTarget.load = function (mediaIndex) { - localPlayer.src = this.mediaContents[mediaIndex]['sources'][0]; - localPlayer.load(); - }.bind(this); - - playerTarget.isMediaLoaded = function (mediaIndex) { - if (!mediaIndex) { - return (localPlayer.src !== null && localPlayer.src !== ""); - } else { - return (localPlayer.src == this.mediaContents[mediaIndex]['sources'][0]); - } + playerTarget.load = function(mediaIndex) { + localPlayer.src = + this.mediaContents[mediaIndex]['sources'][0]; + localPlayer.load(); }.bind(this); - playerTarget.getCurrentMediaTime = function () { - return localPlayer.currentTime; + playerTarget.getCurrentMediaTime = function() { + return localPlayer.currentTime; }; - playerTarget.getMediaDuration = function () { - return localPlayer.duration; + playerTarget.getMediaDuration = function() { + return localPlayer.duration; }; - playerTarget.updateDisplay = function () { - // playerstate view - document.getElementById('playerstate').style.display = 'none'; - document.getElementById('playerstatebg').style.display = 'none'; - document.getElementById('video_image_overlay').style.display = 'none'; - - // media_info view - document.getElementById('media_title').innerHTML = - castPlayer.mediaContents[castPlayer.currentMediaIndex]['title']; - document.getElementById('media_subtitle').innerHTML = - castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle']; + playerTarget.updateDisplayMessage = function () { + document.getElementById('playerstate').style.display = 'none'; + document.getElementById('playerstatebg').style.display = 'none'; + document.getElementById('video_image_overlay').style.display = 'none'; }; - playerTarget.updateCurrentTimeDisplay = function () { - // Increment for local playback - this.currentMediaTime += 1; - this.playerHandler.setTimeString(document.getElementById('currentTime'), this.currentMediaTime); - }.bind(this); - - playerTarget.updateDurationDisplay = function () { - this.playerHandler.setTimeString(document.getElementById('duration'), this.mediaDuration); - }.bind(this); - - playerTarget.setTimeString = function (element, time) { - let currentTimeString = this.getMediaTimeString(time); - if (currentTimeString !== null) { - element.style.display = ''; - element.innerHTML = currentTimeString; - } else { - element.style.display = 'none'; - } - }.bind(this); - - playerTarget.setVolume = function (volumeSliderPosition) { - if (localPlayer) { + playerTarget.setVolume = function(volumeSliderPosition) { localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ? - volumeSliderPosition / FULL_VOLUME_HEIGHT : 1; - } - - var p = document.getElementById('audio_bg_level'); - if (typeof p !== 'undefined' && p) { + volumeSliderPosition / FULL_VOLUME_HEIGHT : 1; + var p = document.getElementById('audio_bg_level'); p.style.height = volumeSliderPosition + 'px'; p.style.marginTop = -volumeSliderPosition + 'px'; - } }; - playerTarget.mute = function () { - localPlayer.muted = true; + playerTarget.mute = function() { + localPlayer.muted = true; }; - playerTarget.unMute = function () { - localPlayer.muted = false; + playerTarget.unMute = function() { + localPlayer.muted = false; }; - playerTarget.isMuted = function () { - if (localPlayer) + playerTarget.isMuted = function() { return localPlayer.muted; }; - playerTarget.seekTo = function (time) { - localPlayer.currentTime = time; + playerTarget.seekTo = function(time) { + localPlayer.currentTime = time; }; this.playerHandler.setTarget(playerTarget); @@ -470,11 +388,8 @@ CastPlayer.prototype.setupLocalPlayer = function () { this.showFullscreenButton(); - this.enableProgressBar(true); - if (this.currentMediaTime > 0) { - this.playerHandler.load(); - this.playerHandler.play(); + this.playerHandler.play(); } }; @@ -1520,106 +1435,64 @@ CastPlayer.prototype.resetVolumeSlider = function () { * Initialize UI components and add event listeners */ CastPlayer.prototype.initializeUI = function () { - // Set initial values for title and subtitle. - if (this.mediaContents && this.mediaContents.length > 0) { + // Set initial values for title, subtitle, and description document.getElementById('media_title').innerHTML = - this.mediaContents[0]['title']; - + this.mediaContents[0]['title']; document.getElementById('media_subtitle').innerHTML = - this.mediaContents[this.currentMediaIndex]['subtitle']; - } - - document.getElementById('seekable_window').addEventListener( - 'click', this.seekMediaListener); - document.getElementById('progress').addEventListener( - 'click', this.seekMediaListener); - document.getElementById('progress_indicator').addEventListener( - 'dragend', this.seekMediaListener); - document.getElementById('skip').addEventListener( - 'click', this.skipAd.bind(this)); - document.getElementById('audio_on').addEventListener( - 'click', this.playerHandler.mute.bind(this.playerHandler)); - document.getElementById('audio_off').addEventListener( - 'click', this.playerHandler.unMute.bind(this.playerHandler)); - document.getElementById('audio_bg').addEventListener( - 'mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_on').addEventListener( - 'mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_level').addEventListener( - 'mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_track').addEventListener( - 'mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_level').addEventListener( - 'click', this.setVolume.bind(this)); - document.getElementById('audio_bg_track').addEventListener( - 'click', this.setVolume.bind(this)); - document.getElementById('audio_bg').addEventListener( - 'mouseout', this.hideVolumeSlider.bind(this)); - document.getElementById('audio_on').addEventListener( - 'mouseout', this.hideVolumeSlider.bind(this)); - - let main_video = document.getElementById('main_video'); - if (typeof main_video !== 'undefined' && main_video) { - main_video.addEventListener( - 'mouseover', this.showMediaControl.bind(this)); - main_video.addEventListener( - 'mouseout', this.hideMediaControl.bind(this)); - } - - document.getElementById('media_control').addEventListener( - 'mouseover', this.showMediaControl.bind(this)); - document.getElementById('media_control').addEventListener( - 'mouseout', this.hideMediaControl.bind(this)); - document.getElementById('fullscreen_expand').addEventListener( - 'click', this.requestFullScreen.bind(this)); - document.getElementById('fullscreen_collapse').addEventListener( - 'click', this.cancelFullScreen.bind(this)); - document.addEventListener( - 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false); - document.addEventListener( - 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false); - - // Enable play/pause buttons - document.getElementById('play').addEventListener( - 'click', this.playerHandler.play.bind(this.playerHandler)); - document.getElementById('pause').addEventListener( - 'click', this.playerHandler.pause.bind(this.playerHandler)); - - document.getElementById('progress_indicator').draggable = true; - - // Set up feature radio buttons - let noneRadio = document.getElementById('none'); - noneRadio.onclick = function () { - ENABLE_LIVE = false; - ENABLE_ADS = false; - console.log("Features have been removed"); - } - let adsRadio = document.getElementById('ads'); - adsRadio.onclick = function () { - ENABLE_LIVE = false; - ENABLE_ADS = true; - console.log("Ads have been enabled"); - } - let liveRadio = document.getElementById('live'); - liveRadio.onclick = function () { - ENABLE_LIVE = true; - ENABLE_ADS = false; - console.log("Live has been enabled"); - } - - if (ENABLE_ADS) { - if (ENABLE_LIVE) { - console.error('Only one feature can be enabled at a time. Enabling ads.'); - } - adsRadio.checked = true; - console.log("Ads are enabled"); - } else if (ENABLE_LIVE) { - liveRadio.checked = true; - console.log("Live is enabled"); - } else { - noneRadio.checked = true; - console.log("No features are enabled"); - } + this.mediaContents[this.currentMediaIndex]['subtitle']; + document.getElementById('media_desc').innerHTML = + this.mediaContents[this.currentMediaIndex]['description']; + + // Add event handlers to UI components + document.getElementById('progress_bg').addEventListener( + 'click', this.seekMedia.bind(this)); + document.getElementById('progress').addEventListener( + 'click', this.seekMedia.bind(this)); + document.getElementById('progress_indicator').addEventListener( + 'dragend', this.seekMedia.bind(this)); + document.getElementById('audio_on').addEventListener( + 'click', this.playerHandler.mute.bind(this.playerHandler)); + document.getElementById('audio_off').addEventListener( + 'click', this.playerHandler.unMute.bind(this.playerHandler)); + document.getElementById('audio_bg').addEventListener( + 'mouseover', this.showVolumeSlider.bind(this)); + document.getElementById('audio_on').addEventListener( + 'mouseover', this.showVolumeSlider.bind(this)); + document.getElementById('audio_bg_level').addEventListener( + 'mouseover', this.showVolumeSlider.bind(this)); + document.getElementById('audio_bg_track').addEventListener( + 'mouseover', this.showVolumeSlider.bind(this)); + document.getElementById('audio_bg_level').addEventListener( + 'click', this.setVolume.bind(this)); + document.getElementById('audio_bg_track').addEventListener( + 'click', this.setVolume.bind(this)); + document.getElementById('audio_bg').addEventListener( + 'mouseout', this.hideVolumeSlider.bind(this)); + document.getElementById('audio_on').addEventListener( + 'mouseout', this.hideVolumeSlider.bind(this)); + document.getElementById('main_video').addEventListener( + 'mouseover', this.showMediaControl.bind(this)); + document.getElementById('main_video').addEventListener( + 'mouseout', this.hideMediaControl.bind(this)); + document.getElementById('media_control').addEventListener( + 'mouseover', this.showMediaControl.bind(this)); + document.getElementById('media_control').addEventListener( + 'mouseout', this.hideMediaControl.bind(this)); + document.getElementById('fullscreen_expand').addEventListener( + 'click', this.requestFullScreen.bind(this)); + document.getElementById('fullscreen_collapse').addEventListener( + 'click', this.cancelFullScreen.bind(this)); + document.addEventListener( + 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false); + document.addEventListener( + 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false); + + // Enable play/pause buttons + document.getElementById('play').addEventListener( + 'click', this.playerHandler.play.bind(this.playerHandler)); + document.getElementById('pause').addEventListener( + 'click', this.playerHandler.pause.bind(this.playerHandler)); + document.getElementById('progress_indicator').draggable = true; }; /** @@ -1645,6 +1518,12 @@ CastPlayer.prototype.addVideoThumbs = function () { } }; +CastPlayer.prototype.addMediaContents = function () { + if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) { + this.mediaContents = this.mediaJSON['categories'][0]['videos']; + } +}; + /** * Makes human-readable message from chrome.cast.Error * @param {chrome.cast.Error} error diff --git a/dist/bundles/thinkam.net-ng-cast.umd.js b/dist/bundles/thinkam.net-ng-cast.umd.js index d2d6b1a..6d910b0 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.js +++ b/dist/bundles/thinkam.net-ng-cast.umd.js @@ -1,1861 +1,1769 @@ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('rxjs')) : - typeof define === 'function' && define.amd ? define('@thinkam.net/ng-cast', ['exports', '@angular/core', '@angular/common', 'rxjs'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.thinkam = global.thinkam || {}, global.thinkam.net = global.thinkam.net || {}, global.thinkam.net['ng-cast'] = {}), global.ng.core, global.ng.common, global.rxjs)); + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('rxjs')) : + typeof define === 'function' && define.amd ? define('@thinkam.net/ng-cast', ['exports', '@angular/core', '@angular/common', 'rxjs'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.thinkam = global.thinkam || {}, global.thinkam.net = global.thinkam.net || {}, global.thinkam.net['ng-cast'] = {}), global.ng.core, global.ng.common, global.rxjs)); }(this, (function (exports, core, common, rxjs) { 'use strict'; - 'use strict'; - /** Cleaner UI for demo purposes. */ - var DEMO_MODE = false; - /** @const {string} Media source root URL */ - var MEDIA_SOURCE_ROOT = 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/'; - /** - * Controls if Ads are enabled. Controlled by radio button. - * @type {boolean} - */ - var ENABLE_ADS = false; - /** - * Controls if Live stream is played. Controlled by radio button. - * @type {boolean} - */ - var ENABLE_LIVE = false; - /** - * Buffer to decide if the live indicator should be displayed to show that - * playback is at the playback head. - * @const {number} - */ - var LIVE_INDICATOR_BUFFER = 50; - /** - * Width of progress bar in pixels. - * @const {number} - */ - var PROGRESS_BAR_WIDTH = 700; - /** - * Time in milliseconds for minimal progress update. - * @const {number} - */ - var TIMER_STEP = 1000; - /** - * Cast volume upon initial connection. - * @const {number} - */ - var DEFAULT_VOLUME = 0.5; - /** - * Height, in pixels, of volume bar. - * @const {number} - */ - var FULL_VOLUME_HEIGHT = 100; - /** @enum {string} Constants of states for media for both local and remote playback */ - var PLAYER_STATE = { - // No media is loaded into the player. For remote playback, maps to - // the PlayerState.IDLE state. - IDLE: 'IDLE', - // Player is in PLAY mode but not actively playing content. For remote - // playback, maps to the PlayerState.BUFFERING state. - BUFFERING: 'BUFFERING', - // The media is loaded but not playing. - LOADED: 'LOADED', - // The media is playing. For remote playback, maps to the PlayerState.PLAYING state. - PLAYING: 'PLAYING', - // The media is paused. For remote playback, maps to the PlayerState.PAUSED state. - PAUSED: 'PAUSED' - }; - /** - * Cast player object - * Main variables: - * - PlayerHandler object for handling media playback - * - Cast player variables for controlling Cast mode media playback - * - Current media variables for transition between Cast and local modes - * - Current ad variables for controlling UI based on ad playback - * - Current live variables for controlling UI based on ad playback - * @struct @constructor - */ - var CastPlayer = function () { - /** @type {PlayerHandler} Delegation proxy for media playback */ - this.playerHandler = new PlayerHandler(this); - /** @type {PLAYER_STATE} A state for media playback */ - this.playerState = PLAYER_STATE.IDLE; - /** - * @type {PLAYER_STATE} Player state before switching between local and - * remote playback. - */ - this.playerStateBeforeSwitch = null; - /* Cast player variables */ - /** @type {cast.framework.RemotePlayer} */ - this.remotePlayer = null; - /** @type {cast.framework.RemotePlayerController} */ - this.remotePlayerController = null; - /* Local+Remote player variables */ - /** @type {number} A number for current time in seconds. Maintained in media time. */ - this.currentMediaTime = 0; - /** - * @type {?number} A number for current duration in seconds. Maintained in media time. - * Null if duration should not be shown. - */ - this.mediaDuration = -1; - /** @type {?number} A timer for tracking progress of media */ - this.timer = null; - /** @type {function()} Listener for handling current time increments */ - this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this); - /** @type {function()} Listener to be added/removed for the seek action */ - this.seekMediaListener = this.seekMedia.bind(this); - /* Local player variables */ - /** @type {number} A number for current media index */ - this.currentMediaIndex = 0; - /** @type {?Object} media contents from JSON */ - this.mediaContents = null; - /** @type {boolean} Fullscreen mode on/off */ - this.fullscreen = false; - /* Remote Player variables */ - /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */ - this.mediaInfo = null; - /* Ad variables */ - /** - * @type {?number} The time in seconds when the break clip becomes skippable. - * 5 means that the end user can skip this break clip after 5 seconds. If - * negative or not defined, it means that the current break clip is not skippable. - */ - this.whenSkippable = null; - /* Live variables */ - /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */ - this.liveSeekableRange = null; - /** @type {boolean} Remote player is playing live content. */ - this.isLiveContent = false; - this.setupLocalPlayer(); - this.addVideoThumbs(); - this.initializeUI(); - this.mediaJSON = { - 'categories': [] - }; - }; - CastPlayer.prototype.initializeCastPlayer = function () { - var options = {}; - // Set the receiver application ID to your own (created in the - // Google Cast Developer Console), or optionally - // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID - options.receiverApplicationId = 'C0868879'; - // Auto join policy can be one of the following three: - // ORIGIN_SCOPED - Auto connect from same appId and page origin - // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab - // PAGE_SCOPED - No auto connect - options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED; - cast.framework.CastContext.getInstance().setOptions(options); - this.remotePlayer = new cast.framework.RemotePlayer(); - this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, function (e) { - this.switchPlayer(e.value); - }.bind(this)); - }; - /** - * Switch between the remote and local players. - */ - CastPlayer.prototype.switchPlayer = function () { - this.playerStateBeforeSwitch = this.playerState; - this.stopProgressTimer(); - this.resetVolumeSlider(); - // Session is active - if (cast && cast.framework && this.remotePlayer.isConnected) { - // Pause local playback - this.playerHandler.pause(); - this.setupRemotePlayer(); - } - else { - this.setupLocalPlayer(); - } - }; - /** - * PlayerHandler - * - * This is a handler through which the application will interact - * with both the RemotePlayer and LocalPlayer. Combining these two into - * one interface is one approach to the dual-player nature of a Cast - * Chrome application. Otherwise, the state of the RemotePlayer can be - * queried at any time to decide whether to interact with the local - * or remote players. - * - * To set the player used, implement the following methods for a target object - * and call setTarget(target). - * - * Methods to implement: - * - play() - * - pause() - * - stop() - * - seekTo(time) - * - load(mediaIndex) - * - isMediaLoaded(mediaIndex) - * - prepareToPlay() - * - getMediaDuration() - * - getCurrentMediaTime() - * - setVolume(volumeSliderPosition) - * - mute() - * - unMute() - * - isMuted() - * - updateDisplay() - * - updateCurrentTimeDisplay() - * - updateDurationDisplay() - * - setTimeString(element, time) - */ - var PlayerHandler = function (castPlayer) { - this.target = {}; - this.setTarget = function (target) { - this.target = target; - }; - this.play = function () { - if (castPlayer.playerState == PLAYER_STATE.IDLE || - !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) { - this.load(castPlayer.currentMediaIndex); - return; - } - castPlayer.playerState = PLAYER_STATE.PLAYING; - this.target.play(); - document.getElementById('play').style.display = 'none'; - document.getElementById('pause').style.display = 'block'; - }; - this.pause = function () { - this.target.pause(); - castPlayer.playerState = PLAYER_STATE.PAUSED; - document.getElementById('play').style.display = 'block'; - document.getElementById('pause').style.display = 'none'; - }; - this.stop = function () { - castPlayer.playerState = PLAYER_STATE.IDLE; - this.target.stop(); - }; - this.load = function (mediaIndex) { - if (mediaIndex === void 0) { mediaIndex = null; } - if (!mediaIndex) { - mediaIndex = castPlayer.currentMediaIndex; - } - castPlayer.playerState = PLAYER_STATE.BUFFERING; - this.target.load(mediaIndex); - }; - /** - * Check if media has been loaded on the target player. - * @param {number?} mediaIndex The desired media index. If null, verify if - * any media is loaded. - */ - this.isMediaLoaded = function (mediaIndex) { - return this.target.isMediaLoaded(mediaIndex); - }; - /** - * Called after media has been successfully loaded and is ready to start playback. - * When local, will start playing the video, start the timer, and update the UI. - * When remote, will set the UI to PLAYING and start the timer to update the - * UI based on remote playback. - */ - this.prepareToPlay = function () { - castPlayer.mediaDuration = this.getMediaDuration(); - castPlayer.playerHandler.updateDurationDisplay(); - castPlayer.playerState = PLAYER_STATE.LOADED; - this.play(); - castPlayer.startProgressTimer(); - this.updateDisplay(); - }; - this.getCurrentMediaTime = function () { - return this.target.getCurrentMediaTime(); - }; - this.getMediaDuration = function () { - return this.target.getMediaDuration(); - }; - this.updateDisplay = function () { - // Update local variables - this.currentMediaTime = this.target.getCurrentMediaTime(); - this.mediaDuration = this.target.getMediaDuration(); - this.target.updateDisplay(); - }; - this.updateCurrentTimeDisplay = function () { - this.target.updateCurrentTimeDisplay(); - }; - this.updateDurationDisplay = function () { - this.target.updateDurationDisplay(); - }; - /** - * Determines the correct time string (media or clock) and sets it for the given element. - */ - this.setTimeString = function (element, time) { - this.target.setTimeString(element, time); - }; - this.setVolume = function (volumeSliderPosition) { - this.target.setVolume(volumeSliderPosition); - }; - this.mute = function () { - this.target.mute(); - document.getElementById('audio_on').style.display = 'none'; - document.getElementById('audio_off').style.display = 'block'; - }; - this.unMute = function () { - this.target.unMute(); - document.getElementById('audio_on').style.display = 'block'; - document.getElementById('audio_off').style.display = 'none'; - }; - this.isMuted = function () { - return this.target.isMuted(); - }; - this.seekTo = function (time) { - this.target.seekTo(time); - }; - }; - /** - * Set the PlayerHandler target to use the video-element player - */ - CastPlayer.prototype.setupLocalPlayer = function () { - // Cleanup remote player UI - var live_indicator = document.getElementById('live_indicator'); - if (live_indicator && live_indicator.style && live_indicator.style.display) { - live_indicator.style.display = 'none'; - } - this.removeAdMarkers(); - document.getElementById('skip').style.display = 'none'; - var localPlayer = document.getElementById('video_element'); - if (typeof localPlayer !== 'undefined' && localPlayer) - localPlayer.addEventListener('loadeddata', this.onMediaLoadedLocally.bind(this)); - // This object will implement PlayerHandler callbacks with localPlayer - var playerTarget = {}; - playerTarget.play = function () { - localPlayer.play(); - var vi = document.getElementById('video_image'); - vi.style.display = 'none'; - localPlayer.style.display = 'block'; - }; - playerTarget.pause = function () { - localPlayer.pause(); - }; - playerTarget.stop = function () { - localPlayer.stop(); - }; - playerTarget.load = function (mediaIndex) { - localPlayer.src = this.mediaContents[mediaIndex]['sources'][0]; - localPlayer.load(); - }.bind(this); - playerTarget.isMediaLoaded = function (mediaIndex) { - if (!mediaIndex) { - return (localPlayer.src !== null && localPlayer.src !== ""); - } - else { - return (localPlayer.src == this.mediaContents[mediaIndex]['sources'][0]); - } - }.bind(this); - playerTarget.getCurrentMediaTime = function () { - return localPlayer.currentTime; - }; - playerTarget.getMediaDuration = function () { - return localPlayer.duration; - }; - playerTarget.updateDisplay = function () { - // playerstate view - document.getElementById('playerstate').style.display = 'none'; - document.getElementById('playerstatebg').style.display = 'none'; - document.getElementById('video_image_overlay').style.display = 'none'; - // media_info view - document.getElementById('media_title').innerHTML = - castPlayer.mediaContents[castPlayer.currentMediaIndex]['title']; - document.getElementById('media_subtitle').innerHTML = - castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle']; - }; - playerTarget.updateCurrentTimeDisplay = function () { - // Increment for local playback - this.currentMediaTime += 1; - this.playerHandler.setTimeString(document.getElementById('currentTime'), this.currentMediaTime); - }.bind(this); - playerTarget.updateDurationDisplay = function () { - this.playerHandler.setTimeString(document.getElementById('duration'), this.mediaDuration); - }.bind(this); - playerTarget.setTimeString = function (element, time) { - var currentTimeString = this.getMediaTimeString(time); - if (currentTimeString !== null) { - element.style.display = ''; - element.innerHTML = currentTimeString; - } - else { - element.style.display = 'none'; - } - }.bind(this); - playerTarget.setVolume = function (volumeSliderPosition) { - if (localPlayer) { - localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ? - volumeSliderPosition / FULL_VOLUME_HEIGHT : 1; - } - var p = document.getElementById('audio_bg_level'); - if (typeof p !== 'undefined' && p) { - p.style.height = volumeSliderPosition + 'px'; - p.style.marginTop = -volumeSliderPosition + 'px'; - } - }; - playerTarget.mute = function () { - localPlayer.muted = true; - }; - playerTarget.unMute = function () { - localPlayer.muted = false; - }; - playerTarget.isMuted = function () { - if (localPlayer) - return localPlayer.muted; - }; - playerTarget.seekTo = function (time) { - localPlayer.currentTime = time; - }; - this.playerHandler.setTarget(playerTarget); - this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT); - this.showFullscreenButton(); - this.enableProgressBar(true); - if (this.currentMediaTime > 0) { - this.playerHandler.load(); - this.playerHandler.play(); - } - }; - /** - * Set the PlayerHandler target to use the remote player - * Add event listeners for player changes which may occur outside sender app. - */ - CastPlayer.prototype.setupRemotePlayer = function () { - // Triggers when the media info or the player state changes - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED, function (event) { - var session = cast.framework.CastContext.getInstance().getCurrentSession(); - if (!session) { - this.mediaInfo = null; - this.isLiveContent = false; - this.playerHandler.updateDisplay(); - return; - } - var media = session.getMediaSession(); - if (!media) { - this.mediaInfo = null; - this.isLiveContent = false; - this.playerHandler.updateDisplay(); - return; - } - this.mediaInfo = media.media; - if (this.mediaInfo) { - this.isLiveContent = (this.mediaInfo.streamType == - chrome.cast.media.StreamType.LIVE); - } - else { - this.isLiveContent = false; - } - if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) { - this.playerHandler.prepareToPlay(); - } - this.removeAdMarkers(); - this.updateAdMarkers(); - this.playerHandler.updateDisplay(); - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED, function (event) { - this.enableProgressBar(event.value); - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, function () { - if (this.remotePlayer.isPaused) { - this.playerHandler.pause(); - } - else if (this.playerState !== PLAYER_STATE.PLAYING) { - // If currently not playing, start to play. - // This occurs if starting to play from local, but this check is - // required if the state is changed remotely. - this.playerHandler.play(); - } - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED, function () { - if (this.remotePlayer.isMuted) { - this.playerHandler.mute(); - } - else { - this.playerHandler.unMute(); - } - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED, function () { - var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; - var p = document.getElementById('audio_bg_level'); - p.style.height = newVolume + 'px'; - p.style.marginTop = -newVolume + 'px'; - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED, function (event) { - this.isPlayingBreak(event.value); - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED, function (event) { - this.onWhenSkippableChanged(event.value); - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED, function (event) { - this.onCurrentBreakClipTimeChanged(event.value); - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED, function (event) { - this.onBreakClipIdChanged(event.value); - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED, function (event) { - console.log('LIVE_SEEKABLE_RANGE_CHANGED'); - this.liveSeekableRange = event.value; - }.bind(this)); - // This object will implement PlayerHandler callbacks with - // remotePlayerController, and makes necessary UI updates specific - // to remote playback. - var playerTarget = {}; - playerTarget.play = function () { - if (this.remotePlayer.isPaused) { - this.remotePlayerController.playOrPause(); - } - var vi = document.getElementById('video_image'); - vi.style.display = ''; - var localPlayer = document.getElementById('video_element'); - localPlayer.style.display = 'none'; - }.bind(this); - playerTarget.pause = function () { - if (!this.remotePlayer.isPaused) { - this.remotePlayerController.playOrPause(); - } - }.bind(this); - playerTarget.stop = function () { - this.remotePlayerController.stop(); - }.bind(this); - // Load request for local -> remote - playerTarget.load = function (mediaIndex) { - console.log('Loading...' + this.mediaContents[mediaIndex]['title']); - var mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4'); - mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED; - mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata(); - mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title']; - mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle']; - mediaInfo.metadata.images = [{ - 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'] - }]; - var request = new chrome.cast.media.LoadRequest(mediaInfo); - request.currentTime = this.currentMediaTime; - if (ENABLE_ADS) { - // Add sample breaks and breakClips. - mediaInfo.breakClips = breakClipsJSON; - mediaInfo.breaks = breaksJSON; - } - else if (ENABLE_LIVE) { - // Change the streamType and add live specific metadata. - mediaInfo.streamType = chrome.cast.media.StreamType.LIVE; - // TODO: Set the metadata on the receiver side in your implementation. - // startAbsoluteTime and sectionStartTimeInMedia will be set for you. - // See https://developers.google.com/cast/docs/caf_receiver/live. - // TODO: Start time, is a fake timestamp. Use correct values for your implementation. - var currentTime = new Date(); - // Convert from milliseconds to seconds. - currentTime = currentTime / 1000; - var sectionStartAbsoluteTime = currentTime; - // Duration should be -1 for live streams. - mediaInfo.duration = -1; - // TODO: Set on the receiver for your implementation. - mediaInfo.startAbsoluteTime = currentTime; - mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime; - // TODO: Set on the receiver for your implementation. - mediaInfo.metadata.sectionStartTimeInMedia = 0; - mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration']; - var item = new chrome.cast.media.QueueItem(mediaInfo); - request.queueData = new chrome.cast.media.QueueData(); - request.queueData.items = [item]; - request.queueData.name = "Sample Queue for Live"; - } - // Do not immediately start playing if the player was previously PAUSED. - if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) { - request.autoplay = false; - } - else { - request.autoplay = true; - } - cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(function () { - console.log('Remote media loaded'); - }.bind(this), function (errorCode) { - this.playerState = PLAYER_STATE.IDLE; - console.log('Remote media load error: ' + - CastPlayer.getErrorMessage(errorCode)); - this.playerHandler.updateDisplay(); - }.bind(this)); - }.bind(this); - playerTarget.isMediaLoaded = function (mediaIndex) { - var session = cast.framework.CastContext.getInstance().getCurrentSession(); - if (!session) - return false; - var media = session.getMediaSession(); - if (!media) - return false; - if (media.playerState == PLAYER_STATE.IDLE) { - return false; - } - // No need to verify local mediaIndex content. - return true; - }.bind(this); - /** - * @return {number?} Current media time for the content. Always returns - * media time even if in clock time (conversion done when displaying). - */ - playerTarget.getCurrentMediaTime = function () { - if (this.isLiveContent && this.mediaInfo.metadata && - this.mediaInfo.metadata.sectionStartTimeInMedia) { - return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia; - } - else { - // VOD and live scenerios where live metadata is not provided. - return this.remotePlayer.currentTime; - } - }.bind(this); - /** - * @return {number?} media time duration for the content. Always returns - * media time even if in clock time (conversion done when displaying). - */ - playerTarget.getMediaDuration = function () { - if (this.isLiveContent) { - // Scenerios when live metadata is not provided. - if (this.mediaInfo.metadata == undefined || - this.mediaInfo.metadata.sectionDuration == undefined || - this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) { - return null; - } - return this.mediaInfo.metadata.sectionDuration; - } - else { - return this.remotePlayer.duration; - } - }.bind(this); - playerTarget.updateDisplay = function () { - var castSession = cast.framework.CastContext.getInstance().getCurrentSession(); - if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) { - var media = castSession.getMediaSession(); - var mediaInfo = media.media; - // image placeholder for video view - var vi = document.getElementById('video_image'); - if (mediaInfo.metadata && mediaInfo.metadata.images && - mediaInfo.metadata.images.length > 0) { - vi.src = mediaInfo.metadata.images[0].url; - } - // playerstate view - document.getElementById('playerstate').style.display = 'block'; - document.getElementById('playerstatebg').style.display = 'block'; - document.getElementById('video_image_overlay').style.display = 'block'; - var mediaTitle = ''; - var mediaEpisodeTitle = ''; - var mediaSubtitle = ''; - if (mediaInfo.metadata) { - mediaTitle = mediaInfo.metadata.title; - mediaEpisodeTitle = mediaInfo.metadata.episodeTitle; - // Append episode title if present - mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle; - // Do not display mediaTitle if not defined. - mediaTitle = (mediaTitle) ? mediaTitle + ' ' : ''; - mediaSubtitle = mediaInfo.metadata.subtitle; - mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : ''; - } - if (DEMO_MODE) { - document.getElementById('playerstate').innerHTML = - (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast'; - // media_info view - document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video'); - document.getElementById('media_subtitle').innerHTML = ''; - } - else { - document.getElementById('playerstate').innerHTML = - mediaTitle + media.playerState + ' on ' + - castSession.getCastDevice().friendlyName; - // media_info view - document.getElementById('media_title').innerHTML = mediaTitle; - document.getElementById('media_subtitle').innerHTML = mediaSubtitle; - } - // live information - if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) { - this.liveSeekableRange = media.liveSeekableRange; - var live_indicator = document.getElementById('live_indicator'); - live_indicator.style.display = 'block'; - // Display indicator if current time is close to the end of - // the seekable range. - if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) { - live_indicator.src = "imagefiles/live_indicator_active.png"; - } - else { - live_indicator.src = "imagefiles/live_indicator_inactive.png"; - } - } - else { - document.getElementById('live_indicator').style.display = 'none'; - } - } - else { - // playerstate view - document.getElementById('playerstate').style.display = 'none'; - document.getElementById('playerstatebg').style.display = 'none'; - document.getElementById('video_image_overlay').style.display = 'none'; - // media_info view - document.getElementById('media_title').innerHTML = ""; - document.getElementById('media_subtitle').innerHTML = ""; - } - }.bind(this); - playerTarget.updateCurrentTimeDisplay = function () { - this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime()); - }.bind(this); - playerTarget.updateDurationDisplay = function () { - this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration()); - }.bind(this); - playerTarget.setTimeString = function (element, time) { - var currentTimeString = this.getMediaTimeString(time); - if (this.isLiveContent) { - if (currentTimeString == null) { - element.style.display = 'none'; - return; - } - // clock time - if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) { - element.style.display = 'flex'; - element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime); - } - else { - // media time - element.style.display = 'flex'; - element.innerHTML = currentTimeString; - } - } - else { - if (currentTimeString !== null) { - element.style.display = 'flex'; - element.innerHTML = currentTimeString; - } - else { - element.style.display = 'none'; - } - } - }.bind(this); - playerTarget.setVolume = function (volumeSliderPosition) { - var currentVolume = this.remotePlayer.volumeLevel; - var p = document.getElementById('audio_bg_level'); - if (volumeSliderPosition < FULL_VOLUME_HEIGHT) { - p.style.height = volumeSliderPosition + 'px'; - p.style.marginTop = -volumeSliderPosition + 'px'; - currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT; - } - else { - currentVolume = 1; - } - this.remotePlayer.volumeLevel = currentVolume; - this.remotePlayerController.setVolumeLevel(); - }.bind(this); - playerTarget.mute = function () { - if (!this.remotePlayer.isMuted) { - this.remotePlayerController.muteOrUnmute(); - } - }.bind(this); - playerTarget.unMute = function () { - if (this.remotePlayer.isMuted) { - this.remotePlayerController.muteOrUnmute(); - } - }.bind(this); - playerTarget.isMuted = function () { - return this.remotePlayer.isMuted; - }.bind(this); - playerTarget.seekTo = function (time) { - this.remotePlayer.currentTime = time; - this.remotePlayerController.seek(); - }.bind(this); - this.playerHandler.setTarget(playerTarget); - // Setup remote player properties on setup - if (this.remotePlayer.isMuted) { - this.playerHandler.mute(); - } - this.enableProgressBar(this.remotePlayer.canSeek); - // The remote player may have had a volume set from previous playback - var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; - var p = document.getElementById('audio_bg_level'); - p.style.height = currentVolume + 'px'; - p.style.marginTop = -currentVolume + 'px'; - // Show media_control - document.getElementById('media_control').style.opacity = 0.7; - this.hideFullscreenButton(); - // If resuming a session, take the remote properties and continue the existing - // playback. Otherwise, load local content. - if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() == - cast.framework.SessionState.SESSION_RESUMED) { - console.log('Resuming session'); - this.playerHandler.prepareToPlay(); - // New media has been loaded so the previous ad markers should - // be removed. - this.removeAdMarkers(); - this.updateAdMarkers(); - } - else { - this.playerHandler.load(); - } - }; - /** - * Callback when media is loaded in local player - */ - CastPlayer.prototype.onMediaLoadedLocally = function () { - var localPlayer = document.getElementById('video_element'); - localPlayer.currentTime = this.currentMediaTime; - this.playerHandler.prepareToPlay(); - }; - /** - * Select a media content - * @param {number} mediaIndex A number for media index - */ - CastPlayer.prototype.selectMedia = function (mediaIndex) { - console.log('Media index selected: ' + mediaIndex); - this.currentMediaIndex = mediaIndex; - // Clear currentMediaInfo when playing content from the sender. - this.playerHandler.currentMediaInfo = undefined; - // Set video image - var vi = document.getElementById('video_image'); - vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']; - // Reset progress bar - var pi = document.getElementById('progress_indicator'); - pi.style.marginLeft = '0px'; - var progress = document.getElementById('progress'); - progress.style.width = '0px'; - var seekable_window = document.getElementById('seekable_window'); - var unseekable_overlay = document.getElementById('unseekable_overlay'); - seekable_window.style.width = PROGRESS_BAR_WIDTH; - unseekable_overlay.style.width = '0px'; - // Stop timer and reset time displays - this.stopProgressTimer(); - this.currentMediaTime = 0; - this.playerHandler.setTimeString(document.getElementById('currentTime'), 0); - this.playerHandler.setTimeString(document.getElementById('duration'), 0); - this.playerState = PLAYER_STATE.IDLE; - this.playerHandler.play(); - }; - /** - * Media seek function - * @param {Event} event An event object from seek - */ - CastPlayer.prototype.seekMedia = function (event) { - if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) { - console.log('Error - Not seekable'); - return; - } - if (this.isLiveContent && !this.liveSeekableRange) { - console.log('Live content has no seekable range.'); - return; - } - var position = parseInt(event.offsetX, 10); - var pi = document.getElementById('progress_indicator'); - var progress = document.getElementById('progress'); - var seekTime = 0; - var pp = 0; - var pw = 0; - if (event.currentTarget.id == 'progress_indicator') { - seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position / - PROGRESS_BAR_WIDTH, 10); - pp = parseInt(pi.style.marginLeft, 10) + position; - pw = parseInt(progress.style.width, 10) + position; - } - else { - seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10); - pp = position; - pw = position; - } - if (this.playerState === PLAYER_STATE.PLAYING || - this.playerState === PLAYER_STATE.PAUSED) { - this.currentMediaTime = seekTime; - progress.style.width = pw + 'px'; - pi.style.marginLeft = pp + 'px'; - } - if (this.isLiveContent) { - seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia; - } - this.playerHandler.seekTo(seekTime); - }; - /** - * Set current player volume - * @param {Event} mouseEvent - */ - CastPlayer.prototype.setVolume = function (mouseEvent) { - var p = document.getElementById('audio_bg_level'); - var pos = 0; - if (mouseEvent.currentTarget.id === 'audio_bg_track') { - pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10); - } - else { - pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10); - } - this.playerHandler.setVolume(pos); - }; - /** - * Starts the timer to increment the media progress bar - */ - CastPlayer.prototype.startProgressTimer = function () { - this.stopProgressTimer(); - // Start progress timer - this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP); - }; - /** - * Stops the timer to increment the media progress bar - */ - CastPlayer.prototype.stopProgressTimer = function () { - if (this.timer) { - clearInterval(this.timer); - this.timer = null; - } - }; - /** - * Increment media current time depending on remote or local playback - */ - CastPlayer.prototype.incrementMediaTime = function () { - // First sync with the current player's time - this.currentMediaTime = this.playerHandler.getCurrentMediaTime(); - this.mediaDuration = this.playerHandler.getMediaDuration(); - this.playerHandler.updateDurationDisplay(); - if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) { - this.playerHandler.updateCurrentTimeDisplay(); - this.updateProgressBarByTimer(); - } - else if (this.mediaDuration > 0) { - this.endPlayback(); - } - }; - /** - * Update progress bar and currentTime based on timer - */ - CastPlayer.prototype.updateProgressBarByTimer = function () { - var progressBar = document.getElementById('progress'); - var pi = document.getElementById('progress_indicator'); - // Live situation where the progress and duration is unknown. - if (this.mediaDuration == null) { - if (!this.isLiveContent) { - console.log('Error - Duration is not defined for a VOD stream.'); - } - progressBar.style.width = '0px'; - var skip = document.getElementById('skip'); - if (skip && skip.style && skip.style.display) { - skip.style.display = 'none'; - } - pi.style.display = 'none'; - var seekable_window_1 = document.getElementById('seekable_window'); - if (seekable_window_1 && seekable_window_1.style && seekable_window_1.style.width) - seekable_window_1.style.width = '0px'; - var unseekable_overlay_1 = document.getElementById('unseekable_overlay'); - if (unseekable_overlay_1 && unseekable_overlay_1.style && unseekable_overlay_1.style.width) - unseekable_overlay_1.style.width = '0px'; - return; - } - else { - pi.style.display = ''; - } - if (isNaN(parseInt(progressBar.style.width, 10))) { - progressBar.style.width = '0px'; - } - // Prevent indicator from exceeding the max width. Happens during - // short media when each progress step is large - var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration); - if (pp > PROGRESS_BAR_WIDTH) { - pp = PROGRESS_BAR_WIDTH; - } - else if (pp < 0) { - pp = 0; - } - progressBar.style.width = pp + 'px'; - pi.style.marginLeft = pp + 'px'; - var seekable_window = document.getElementById('seekable_window'); - var unseekable_overlay = document.getElementById('unseekable_overlay'); - if (this.isLiveContent) { - if (this.liveSeekableRange) { - // Use the liveSeekableRange to draw the seekable and unseekable windows - var seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) - - this.mediaInfo.metadata.sectionStartTimeInMedia; - var seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration); - if (seekableWidth > PROGRESS_BAR_WIDTH) { - seekableWidth = PROGRESS_BAR_WIDTH; - } - else if (seekableWidth < 0) { - seekableWidth = 0; - } - seekable_window.style.width = seekableWidth + 'px'; - var unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) - - this.mediaInfo.metadata.sectionStartTimeInMedia; - var unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration); - if (unseekableWidth > PROGRESS_BAR_WIDTH) { - unseekableWidth = PROGRESS_BAR_WIDTH; - } - else if (unseekableWidth < 0) { - unseekableWidth = 0; - } - unseekable_overlay.style.width = unseekableWidth + 'px'; - } - else { - // Nothing is seekable if no liveSeekableRange - seekable_window.style.width = '0px'; - unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px'; - } - } - else { - // Default to everything seekable - seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px'; - unseekable_overlay.style.width = '0px'; - } - if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) { - this.endPlayback(); - } - }; - /** - * End playback. Called when media ends. - */ - CastPlayer.prototype.endPlayback = function () { - this.currentMediaTime = 0; - this.stopProgressTimer(); - this.playerState = PLAYER_STATE.IDLE; - this.playerHandler.updateDisplay(); - var play = document.getElementById('play'); - if (play && play.style && play.display) - play.style.display = 'block'; - var pause = document.getElementById('pause'); - if (pause && pause.style && pause.style.display) - pause.style.display = 'none'; - }; - /** - * @param {?number} timestamp Linux timestamp - * @return {?string} media time string. Null if time is invalid. - */ - CastPlayer.prototype.getMediaTimeString = function (timestamp) { - if (timestamp == undefined || timestamp == null) { - return null; - } - var isNegative = false; - if (timestamp < 0) { - isNegative = true; - timestamp *= -1; - } - var hours = Math.floor(timestamp / 3600); - var minutes = Math.floor((timestamp - (hours * 3600)) / 60); - var seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60)); - if (hours < 10) - hours = '0' + hours; - if (minutes < 10) - minutes = '0' + minutes; - if (seconds < 10) - seconds = '0' + seconds; - return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds; - }; - /** - * @param {number} timestamp Linux timestamp - * @return {?string} ClockTime string. Null if time is invalid. - */ - CastPlayer.prototype.getClockTimeString = function (timestamp) { - if (!timestamp) - return "0:00:00"; - var date = new Date(timestamp * 1000); - var hours = date.getHours(); - var minutes = date.getMinutes(); - var seconds = date.getSeconds(); - var ampm = hours >= 12 ? 'PM' : 'AM'; - hours = hours % 12; - // Hour '0' should be '12' - hours = hours ? hours : 12; - minutes = ('0' + minutes).slice(-2); - seconds = ('0' + seconds).slice(-2); - var clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm; - return clockTime; - }; - /** - * Updates Ad markers in UI - */ - CastPlayer.prototype.updateAdMarkers = function () { - var castSession = cast.framework.CastContext.getInstance().getCurrentSession(); - if (!castSession) - return; - var media = castSession.getMediaSession(); - if (!media) - return; - var mediaInfo = media.media; - if (!mediaInfo) - return; - var breaks = mediaInfo.breaks; - var contentDuration = mediaInfo.duration; - if (!breaks) { - return; - } - for (var i = 0; i < breaks.length; i++) { - var adBreak = breaks[i]; - // Server-side stitched Ads (embedded) are skipped when the position is beyond - // the duration, so they shouldn't be shown with an ad marker on the UI. - if (adBreak.position > contentDuration && adBreak.isEmbedded) { - continue; - } - // Place marker if not already set in position - if (!document.getElementById('ad' + adBreak.position)) { - var div = document.getElementById('progress'); - div.innerHTML += '
'; - } - } - }; - /** - * Remove Ad markers in UI - */ - CastPlayer.prototype.removeAdMarkers = function () { - document.querySelectorAll('.adMarker').forEach(function (adMarker) { - adMarker.remove(); - }); - }; - /** - * Position of the ad marker from the margin - */ - CastPlayer.prototype.adPositionToMargin = function (position, contentDuration) { - // Post-roll - if (position == -1) { - return PROGRESS_BAR_WIDTH; - } - // Client stitched Ads (not embedded) beyond the duration, will play at the - // end of the content. - if (position > contentDuration) { - return PROGRESS_BAR_WIDTH; - } - // Convert Ad position to margin - return (PROGRESS_BAR_WIDTH * position) / contentDuration; - }; - /** - * Handle BREAK_CLIP_ID_CHANGED event - */ - CastPlayer.prototype.onBreakClipIdChanged = function () { - // Hide skip button when switching to a new breakClip - var skip = document.getElementById('skip'); - if (skip && skip.style && skip.style.display) - skip.style.display = 'none'; - }; - /** - * Disable progress bar if playing a break. - */ - CastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) { - this.enableProgressBar(!isPlayingBreak); - }; - /** - * Handle WHEN_SKIPPABLE_CHANGED event - */ - CastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) { - this.whenSkippable = whenSkippable; - }; - /** - * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event - */ - CastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) { - var skip = document.getElementById('skip'); - // Unskippable - if (this.whenSkippable == undefined || this.whenSkippable < 0) { - // Hide skip button - if (skip && skip.style && skip.style.display) - skip.style.display = 'none'; - } - // Skippable - else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) { - // Show skip button - if (skip && skip.style && skip.style.display) - skip.style.display = 'block'; - } - // Not ready to be skipped - else { - // Hide skip button - if (skip && skip.style && skip.style.display) - skip.style.display = 'none'; - } - }; - /** - * Skip the current Ad - */ - CastPlayer.prototype.skipAd = function () { - this.remotePlayerController.skipAd(); - }; - /** - * Enable/disable progress bar - */ - CastPlayer.prototype.enableProgressBar = function (enable) { - var progress = document.getElementById('progress'); - var progress_indicator = document.getElementById('progress_indicator'); - var seekable_window = document.getElementById('seekable_window'); - if (enable) { - // Enable UI - progress.style.backgroundImage = "url('./assets/imagefiles/timeline_bg_progress.png')"; - progress.style.cursor = "pointer"; - seekable_window.style.cursor = "pointer"; - progress_indicator.style.cursor = "pointer"; - progress_indicator.draggable = true; - // Add listeners - progress.addEventListener('click', this.seekMediaListener); - seekable_window.addEventListener('click', this.seekMediaListener); - progress_indicator.addEventListener('dragend', this.seekMediaListener); - } - else { - // Disable UI - progress.style.backgroundImage = "url('./assets/imagefiles/timeline_bg_buffer.png')"; - progress.style.cursor = "default"; - seekable_window.style.cursor = "default"; - progress_indicator.style.cursor = "default"; - progress_indicator.draggable = false; - // Remove listeners - progress.removeEventListener('click', this.seekMediaListener); - seekable_window.removeEventListener('click', this.seekMediaListener); - progress_indicator.removeEventListener('dragend', this.seekMediaListener); - } - }; - /** - * Request full screen mode - */ - CastPlayer.prototype.requestFullScreen = function () { - // Supports most browsers and their versions - var element = document.getElementById('video_element'); - var requestMethod = element['requestFullScreen'] || element['webkitRequestFullScreen']; - if (requestMethod) { - // Native full screen. - requestMethod.call(element); - console.log('Requested fullscreen'); - } - }; - /** - * Exit full screen mode - */ - CastPlayer.prototype.cancelFullScreen = function () { - // Supports most browsers and their versions. - var requestMethod = document['cancelFullScreen'] || document['webkitCancelFullScreen']; - if (requestMethod) { - requestMethod.call(document); - } - }; - /** - * Exit fullscreen mode by escape - */ - CastPlayer.prototype.fullscreenChangeHandler = function () { - this.fullscreen = !this.fullscreen; - }; - /** - * Show expand/collapse fullscreen button - */ - CastPlayer.prototype.showFullscreenButton = function () { - var fullscreen_expand = document.getElementById('fullscreen_expand'); - var fullscreen_collapse = document.getElementById('fullscreen_collapse'); - if (this.fullscreen) { - if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) - fullscreen_expand.style.display = 'none'; - if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display) - fullscreen_collapse.style.display = 'block'; - } - else { - if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) - fullscreen_expand.style.display = 'block'; - if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display) - fullscreen_collapse.style.display = 'none'; - } - }; - /** - * Hide expand/collapse fullscreen button - */ - CastPlayer.prototype.hideFullscreenButton = function () { - var fullscreen_expand = document.getElementById('fullscreen_expand'); - var fullscreen_collapse = document.getElementById('fullscreen_collapse'); - if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) - fullscreen_expand.style.display = 'none'; - if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display) - fullscreen_collapse.style.display = 'none'; - }; - /** - * Show the media control - */ - CastPlayer.prototype.showMediaControl = function () { - var media_control = document.getElementById('media_control'); - if (media_control && media_control.style && media_control.opacity) - media_control.style.opacity = 0.7; - }; - /** - * Hide the media control - */ - CastPlayer.prototype.hideMediaControl = function () { - if (typeof cast !== 'undefined') { - var context = cast.framework.CastContext.getInstance(); - if (context && context.getCurrentSession()) { - // Do not hide controls during an active cast session. - document.getElementById('media_control').style.opacity = 0.7; - } - else { - document.getElementById('media_control').style.opacity = 0; - } - } - }; - /** - * Show the volume slider - */ - CastPlayer.prototype.showVolumeSlider = function () { - if (!this.playerHandler.isMuted()) { - document.getElementById('audio_bg').style.opacity = 1; - document.getElementById('audio_bg_track').style.opacity = 1; - document.getElementById('audio_bg_level').style.opacity = 1; - document.getElementById('audio_indicator').style.opacity = 1; - } - }; - /** - * Hide the volume slider - */ - CastPlayer.prototype.hideVolumeSlider = function () { - document.getElementById('audio_bg').style.opacity = 0; - document.getElementById('audio_bg_track').style.opacity = 0; - document.getElementById('audio_bg_level').style.opacity = 0; - document.getElementById('audio_indicator').style.opacity = 0; - }; - /** - * Reset the volume slider - */ - CastPlayer.prototype.resetVolumeSlider = function () { - var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight; - var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight; - document.getElementById('audio_bg_level').style.height = - defaultVolumeSliderHeight + 'px'; - document.getElementById('audio_on').style.display = 'block'; - document.getElementById('audio_off').style.display = 'none'; - }; - /** - * Initialize UI components and add event listeners - */ - CastPlayer.prototype.initializeUI = function () { - // Set initial values for title and subtitle. - if (this.mediaContents && this.mediaContents.length > 0) { - document.getElementById('media_title').innerHTML = - this.mediaContents[0]['title']; - document.getElementById('media_subtitle').innerHTML = - this.mediaContents[this.currentMediaIndex]['subtitle']; - } - document.getElementById('seekable_window').addEventListener('click', this.seekMediaListener); - document.getElementById('progress').addEventListener('click', this.seekMediaListener); - document.getElementById('progress_indicator').addEventListener('dragend', this.seekMediaListener); - document.getElementById('skip').addEventListener('click', this.skipAd.bind(this)); - document.getElementById('audio_on').addEventListener('click', this.playerHandler.mute.bind(this.playerHandler)); - document.getElementById('audio_off').addEventListener('click', this.playerHandler.unMute.bind(this.playerHandler)); - document.getElementById('audio_bg').addEventListener('mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_on').addEventListener('mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_level').addEventListener('mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_track').addEventListener('mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_level').addEventListener('click', this.setVolume.bind(this)); - document.getElementById('audio_bg_track').addEventListener('click', this.setVolume.bind(this)); - document.getElementById('audio_bg').addEventListener('mouseout', this.hideVolumeSlider.bind(this)); - document.getElementById('audio_on').addEventListener('mouseout', this.hideVolumeSlider.bind(this)); - var main_video = document.getElementById('main_video'); - if (typeof main_video !== 'undefined' && main_video) { - main_video.addEventListener('mouseover', this.showMediaControl.bind(this)); - main_video.addEventListener('mouseout', this.hideMediaControl.bind(this)); - } - document.getElementById('media_control').addEventListener('mouseover', this.showMediaControl.bind(this)); - document.getElementById('media_control').addEventListener('mouseout', this.hideMediaControl.bind(this)); - document.getElementById('fullscreen_expand').addEventListener('click', this.requestFullScreen.bind(this)); - document.getElementById('fullscreen_collapse').addEventListener('click', this.cancelFullScreen.bind(this)); - document.addEventListener('fullscreenchange', this.fullscreenChangeHandler.bind(this), false); - document.addEventListener('webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false); - // Enable play/pause buttons - document.getElementById('play').addEventListener('click', this.playerHandler.play.bind(this.playerHandler)); - document.getElementById('pause').addEventListener('click', this.playerHandler.pause.bind(this.playerHandler)); - document.getElementById('progress_indicator').draggable = true; - // Set up feature radio buttons - var noneRadio = document.getElementById('none'); - noneRadio.onclick = function () { - ENABLE_LIVE = false; - ENABLE_ADS = false; - console.log("Features have been removed"); - }; - var adsRadio = document.getElementById('ads'); - adsRadio.onclick = function () { - ENABLE_LIVE = false; - ENABLE_ADS = true; - console.log("Ads have been enabled"); - }; - var liveRadio = document.getElementById('live'); - liveRadio.onclick = function () { - ENABLE_LIVE = true; - ENABLE_ADS = false; - console.log("Live has been enabled"); - }; - if (ENABLE_ADS) { - if (ENABLE_LIVE) { - console.error('Only one feature can be enabled at a time. Enabling ads.'); - } - adsRadio.checked = true; - console.log("Ads are enabled"); - } - else if (ENABLE_LIVE) { - liveRadio.checked = true; - console.log("Live is enabled"); - } - else { - noneRadio.checked = true; - console.log("No features are enabled"); - } - }; - /** - * Add video thumbnails div's to UI for media JSON contents - */ - CastPlayer.prototype.addVideoThumbs = function () { - if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) { - this.mediaContents = this.mediaJSON['categories'][0]['videos']; - var ni = document.getElementById('carousel'); - var newdiv = null; - var divIdName = null; - for (var i = 0; i < this.mediaContents.length; i++) { - newdiv = document.createElement('div'); - divIdName = 'thumb' + i + 'Div'; - newdiv.setAttribute('id', divIdName); - newdiv.setAttribute('class', 'thumb'); - newdiv.innerHTML = - ''; - newdiv.addEventListener('click', this.selectMedia.bind(this, i)); - ni.appendChild(newdiv); - } - } - }; - /** - * Makes human-readable message from chrome.cast.Error - * @param {chrome.cast.Error} error - * @return {string} error message - */ - CastPlayer.getErrorMessage = function (error) { - switch (error.code) { - case chrome.cast.ErrorCode.API_NOT_INITIALIZED: - return 'The API is not initialized.' + - (error.description ? ' :' + error.description : ''); - case chrome.cast.ErrorCode.CANCEL: - return 'The operation was canceled by the user' + - (error.description ? ' :' + error.description : ''); - case chrome.cast.ErrorCode.CHANNEL_ERROR: - return 'A channel to the receiver is not available.' + - (error.description ? ' :' + error.description : ''); - case chrome.cast.ErrorCode.EXTENSION_MISSING: - return 'The Cast extension is not available.' + - (error.description ? ' :' + error.description : ''); - case chrome.cast.ErrorCode.INVALID_PARAMETER: - return 'The parameters to the operation were not valid.' + - (error.description ? ' :' + error.description : ''); - case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE: - return 'No receiver was compatible with the session request.' + - (error.description ? ' :' + error.description : ''); - case chrome.cast.ErrorCode.SESSION_ERROR: - return 'A session could not be created, or a session was invalid.' + - (error.description ? ' :' + error.description : ''); - case chrome.cast.ErrorCode.TIMEOUT: - return 'The operation timed out.' + - (error.description ? ' :' + error.description : ''); - default: - return error; - } - }; - var castPlayer = new CastPlayer(); - window['__onGCastApiAvailable'] = function (isAvailable) { - if (isAvailable) { - castPlayer.initializeCastPlayer(); - } - }; - window.CastPlayer = castPlayer; + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + /* global Reflect, Promise */ + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) + if (b.hasOwnProperty(p)) + d[p] = b[p]; }; + return extendStatics(d, b); + }; + function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + var __assign = function () { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + function __rest(s, e) { + var t = {}; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; + } + function __decorate(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") + r = Reflect.decorate(decorators, target, key, desc); + else + for (var i = decorators.length - 1; i >= 0; i--) + if (d = decorators[i]) + r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + } + function __param(paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); }; + } + function __metadata(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") + return Reflect.metadata(metadataKey, metadataValue); + } + function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { + step(generator.next(value)); + } + catch (e) { + reject(e); + } } + function rejected(value) { try { + step(generator["throw"](value)); + } + catch (e) { + reject(e); + } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + } + function __generator(thisArg, body) { + var _ = { label: 0, sent: function () { if (t[0] & 1) + throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) + throw new TypeError("Generator is already executing."); + while (_) + try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) + return t; + if (y = 0, t) + op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: + case 1: + t = op; + break; + case 4: + _.label++; + return { value: op[1], done: false }; + case 5: + _.label++; + y = op[1]; + op = [0]; + continue; + case 7: + op = _.ops.pop(); + _.trys.pop(); + continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { + _ = 0; + continue; + } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { + _.label = op[1]; + break; + } + if (op[0] === 6 && _.label < t[1]) { + _.label = t[1]; + t = op; + break; + } + if (t && _.label < t[2]) { + _.label = t[2]; + _.ops.push(op); + break; + } + if (t[2]) + _.ops.pop(); + _.trys.pop(); + continue; + } + op = body.call(thisArg, _); + } + catch (e) { + op = [6, e]; + y = 0; + } + finally { + f = t = 0; + } + if (op[0] & 5) + throw op[1]; + return { value: op[0] ? op[1] : void 0, done: true }; + } + } + function __createBinding(o, m, k, k2) { + if (k2 === undefined) + k2 = k; + o[k2] = m[k]; + } + function __exportStar(m, exports) { + for (var p in m) + if (p !== "default" && !exports.hasOwnProperty(p)) + exports[p] = m[p]; + } + function __values(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) + return m.call(o); + if (o && typeof o.length === "number") + return { + next: function () { + if (o && i >= o.length) + o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); + } + function __read(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) + return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) + ar.push(r.value); + } + catch (error) { + e = { error: error }; + } + finally { + try { + if (r && !r.done && (m = i["return"])) + m.call(i); + } + finally { + if (e) + throw e.error; + } + } + return ar; + } + function __spread() { + for (var ar = [], i = 0; i < arguments.length; i++) + ar = ar.concat(__read(arguments[i])); + return ar; + } + function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) + s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; + } + ; + function __await(v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); + } + function __asyncGenerator(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) + throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; + function verb(n) { if (g[n]) + i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + function resume(n, v) { try { + step(g[n](v)); + } + catch (e) { + settle(q[0][3], e); + } } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function fulfill(value) { resume("next", value); } + function reject(value) { resume("throw", value); } + function settle(f, v) { if (f(v), q.shift(), q.length) + resume(q[0][0], q[0][1]); } + } + function __asyncDelegator(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; + function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } + } + function __asyncValues(o) { + if (!Symbol.asyncIterator) + throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); } + } + function __makeTemplateObject(cooked, raw) { + if (Object.defineProperty) { + Object.defineProperty(cooked, "raw", { value: raw }); + } + else { + cooked.raw = raw; + } + return cooked; + } + ; + function __importStar(mod) { + if (mod && mod.__esModule) + return mod; + var result = {}; + if (mod != null) + for (var k in mod) + if (Object.hasOwnProperty.call(mod, k)) + result[k] = mod[k]; + result.default = mod; + return result; + } + function __importDefault(mod) { + return (mod && mod.__esModule) ? mod : { default: mod }; + } + function __classPrivateFieldGet(receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); + } + function __classPrivateFieldSet(receiver, privateMap, value) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to set private field on non-instance"); + } + privateMap.set(receiver, value); + return value; + } - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */ - /* global Reflect, Promise */ - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) - if (b.hasOwnProperty(p)) - d[p] = b[p]; }; - return extendStatics(d, b); - }; - function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - } - var __assign = function () { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - function __rest(s, e) { - var t = {}; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { - if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) - t[p[i]] = s[p[i]]; - } - return t; - } - function __decorate(decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") - r = Reflect.decorate(decorators, target, key, desc); - else - for (var i = decorators.length - 1; i >= 0; i--) - if (d = decorators[i]) - r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - } - function __param(paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); }; - } - function __metadata(metadataKey, metadataValue) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") - return Reflect.metadata(metadataKey, metadataValue); - } - function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { - step(generator.next(value)); - } - catch (e) { - reject(e); - } } - function rejected(value) { try { - step(generator["throw"](value)); - } - catch (e) { - reject(e); - } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - } - function __generator(thisArg, body) { - var _ = { label: 0, sent: function () { if (t[0] & 1) - throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) - throw new TypeError("Generator is already executing."); - while (_) - try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) - return t; - if (y = 0, t) - op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: - case 1: - t = op; - break; - case 4: - _.label++; - return { value: op[1], done: false }; - case 5: - _.label++; - y = op[1]; - op = [0]; - continue; - case 7: - op = _.ops.pop(); - _.trys.pop(); - continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { - _ = 0; - continue; - } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { - _.label = op[1]; - break; - } - if (op[0] === 6 && _.label < t[1]) { - _.label = t[1]; - t = op; - break; - } - if (t && _.label < t[2]) { - _.label = t[2]; - _.ops.push(op); - break; - } - if (t[2]) - _.ops.pop(); - _.trys.pop(); - continue; - } - op = body.call(thisArg, _); - } - catch (e) { - op = [6, e]; - y = 0; - } - finally { - f = t = 0; - } - if (op[0] & 5) - throw op[1]; - return { value: op[0] ? op[1] : void 0, done: true }; - } - } - function __createBinding(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - } - function __exportStar(m, exports) { - for (var p in m) - if (p !== "default" && !exports.hasOwnProperty(p)) - exports[p] = m[p]; - } - function __values(o) { - var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) - return m.call(o); - if (o && typeof o.length === "number") - return { - next: function () { - if (o && i >= o.length) - o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); - } - function __read(o, n) { - var m = typeof Symbol === "function" && o[Symbol.iterator]; - if (!m) - return o; - var i = m.call(o), r, ar = [], e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) - ar.push(r.value); - } - catch (error) { - e = { error: error }; - } - finally { - try { - if (r && !r.done && (m = i["return"])) - m.call(i); - } - finally { - if (e) - throw e.error; - } - } - return ar; - } - function __spread() { - for (var ar = [], i = 0; i < arguments.length; i++) - ar = ar.concat(__read(arguments[i])); - return ar; - } - function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) - s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; - } - ; - function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); - } - function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) - throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; - function verb(n) { if (g[n]) - i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } - function resume(n, v) { try { - step(g[n](v)); - } - catch (e) { - settle(q[0][3], e); - } } - function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } - function fulfill(value) { resume("next", value); } - function reject(value) { resume("throw", value); } - function settle(f, v) { if (f(v), q.shift(), q.length) - resume(q[0][0], q[0][1]); } - } - function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; - function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } - } - function __asyncValues(o) { - if (!Symbol.asyncIterator) - throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); - function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } - function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); } - } - function __makeTemplateObject(cooked, raw) { - if (Object.defineProperty) { - Object.defineProperty(cooked, "raw", { value: raw }); - } - else { - cooked.raw = raw; - } - return cooked; - } - ; - function __importStar(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) - for (var k in mod) - if (Object.hasOwnProperty.call(mod, k)) - result[k] = mod[k]; - result.default = mod; - return result; - } - function __importDefault(mod) { - return (mod && mod.__esModule) ? mod : { default: mod }; - } - function __classPrivateFieldGet(receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); - } - function __classPrivateFieldSet(receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; - } + exports.ɵa = /** @class */ (function () { + function NgCastComponent(ngCastService) { + this.ngCastService = ngCastService; + this.videoImage = ''; + this.imageOffline = false; + this.srcImageOffline = ''; + } + NgCastComponent.prototype.ngOnInit = function () { + this.window = window; + var ngCastService = this.ngCastService; + this.window['__onGCastApiAvailable'] = function (isAvailable) { + if (isAvailable) { + ngCastService.initializeCastApi(); + } + }; + this.castingStatus = this.ngCastService.getStatus(); + }; + NgCastComponent.prototype.openSession = function () { + this.ngCastService.discoverDevices(); + }; + NgCastComponent.prototype.closeSession = function () { + this.ngCastService.discoverDevices(); + }; + return NgCastComponent; + }()); + __decorate([ + core.Input() + ], exports.ɵa.prototype, "videoImage", void 0); + __decorate([ + core.Input() + ], exports.ɵa.prototype, "imageOffline", void 0); + __decorate([ + core.Input() + ], exports.ɵa.prototype, "srcImageOffline", void 0); + exports.ɵa = __decorate([ + core.Component({ + selector: 'ng-cast', + template: "
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", + styles: [""] + }) + ], exports.ɵa); - exports.ɵa = /** @class */ (function () { - function NgCastComponent(ngCastService) { - this.ngCastService = ngCastService; - } - NgCastComponent.prototype.ngOnInit = function () { - this.window = window; - var ngCastService = this.ngCastService; - this.window['__onGCastApiAvailable'] = function (isAvailable) { - if (isAvailable) { - ngCastService.initializeCastApi(); - } - }; - this.castingStatus = this.ngCastService.getStatus(); - }; - NgCastComponent.prototype.openSession = function () { - this.ngCastService.discoverDevices(); - }; - NgCastComponent.prototype.closeSession = function () { - this.ngCastService.discoverDevices(); - }; - return NgCastComponent; - }()); - exports.ɵa = __decorate([ - core.Component({ - selector: 'ng-cast', - template: "cast\ncast_connected", - styles: [""] - }) - ], exports.ɵa); + exports.NgCastService = /** @class */ (function () { + function NgCastService() { + var _this = this; + this.window = window; + this.status = { + casting: false + }; + this.onInitSuccess = function () { + console.log('GCast initialization success'); + }; + this.onError = function (err) { + console.log('GCast initialization failed', err); + }; + this.discoverDevices = function () { + var self = _this; + var subj = new rxjs.Subject(); + _this.cast.requestSession(function (s) { + self.session = s; + self.setCasting(true); + subj.next('CONNECTED'); + }, function (err) { + self.setCasting(false); + if (err.code === 'cancel') { + self.session = undefined; + subj.next('CANCEL'); + } + else { + console.error('Error selecting a cast device', err); + } + }); + return subj; + }; + this.onMediaDiscovered = function (categories) { + var script = window['document'].createElement('script'); + script.setAttribute('type', 'text/javascript'); + script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1'); + window['document'].body.appendChild(script); + globalThis.CastPlayer.mediaJSON.categories = categories; + globalThis.CastPlayer.addMediaContents(); + globalThis.CastPlayer.setupLocalPlayer(); + globalThis.CastPlayer.initializeUI(); + }; + this.play = function () { + _this.currentMedia.play(null); + }; + this.pause = function () { + _this.currentMedia.pause(null); + }; + this.stop = function () { + _this.currentMedia.stop(null); + }; + this.onMediaError = function (err) { + console.error('Error launching media', err); + }; + globalThis.CastPlayer.mediaJSON = { + categories: [] + }; + } + NgCastService.prototype.initializeCastApi = function () { + var _this = this; + this.cast = this.window['chrome'].cast; + var sessionRequest = new this.cast.SessionRequest('4F8B3483'); + var apiConfig = new this.cast.ApiConfig(sessionRequest, function () { }, function (status) { if (status === _this.cast.ReceiverAvailability.AVAILABLE) { } }); + var x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError); + }; + ; + NgCastService.prototype.setCasting = function (value) { + globalThis.CastPlayer.addMediaContents(); + this.status.casting = value; + }; + NgCastService.prototype.getStatus = function () { + return this.status; + }; + return NgCastService; + }()); + exports.NgCastService = __decorate([ + core.Injectable() + ], exports.NgCastService); - exports.NgCastService = /** @class */ (function () { - function NgCastService() { - var _this = this; - this.window = window; - this.status = { - casting: false - }; - this.onInitSuccess = function () { - console.log('GCast initialization success'); - }; - this.onError = function (err) { - console.log('GCast initialization failed', err); - }; - this.discoverDevices = function () { - var self = _this; - var subj = new rxjs.Subject(); - _this.cast.requestSession(function (s) { - self.session = s; - self.setCasting(true); - subj.next('CONNECTED'); - }, function (err) { - self.setCasting(false); - if (err.code === 'cancel') { - self.session = undefined; - subj.next('CANCEL'); - } - else { - console.error('Error selecting a cast device', err); - } - }); - return subj; - }; - this.onMediaDiscovered = function (categories) { - var script = window['document'].createElement('script'); - script.setAttribute('type', 'text/javascript'); - script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1'); - window['document'].body.appendChild(script); - globalThis.CastPlayer.mediaJSON.categories = categories; - }; - this.play = function () { - _this.currentMedia.play(null); - }; - this.pause = function () { - _this.currentMedia.pause(null); - }; - this.stop = function () { - _this.currentMedia.stop(null); - }; - this.onMediaError = function (err) { - console.error('Error launching media', err); - }; - globalThis.CastPlayer.mediaJSON = { - categories: [] - }; - } - NgCastService.prototype.initializeCastApi = function () { - var _this = this; - this.cast = this.window['chrome'].cast; - var sessionRequest = new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID); - var apiConfig = new this.cast.ApiConfig(sessionRequest, function () { }, function (status) { if (status === _this.cast.ReceiverAvailability.AVAILABLE) { } }); - var x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError); - }; - ; - NgCastService.prototype.setCasting = function (value) { - globalThis.CastPlayer.addVideoThumbs(); - this.status.casting = value; - }; - NgCastService.prototype.getStatus = function () { - return this.status; - }; - return NgCastService; - }()); - exports.NgCastService = __decorate([ - core.Injectable() - ], exports.NgCastService); + exports.NgCastModule = /** @class */ (function () { + function NgCastModule() { + } + return NgCastModule; + }()); + exports.NgCastModule = __decorate([ + core.NgModule({ + schemas: [core.CUSTOM_ELEMENTS_SCHEMA], + imports: [ + common.CommonModule + ], + exports: [exports.ɵa], + providers: [exports.NgCastService], + declarations: [exports.ɵa] + }) + ], exports.NgCastModule); - exports.NgCastModule = /** @class */ (function () { - function NgCastModule() { - } - return NgCastModule; - }()); - exports.NgCastModule = __decorate([ - core.NgModule({ - schemas: [core.CUSTOM_ELEMENTS_SCHEMA], - imports: [ - common.CommonModule - ], - exports: [exports.ɵa], - providers: [exports.NgCastService], - declarations: [exports.ɵa] - }) - ], exports.NgCastModule); + "use strict"; + /** @const {string} Media source root URL */ + var MEDIA_SOURCE_ROOT = ''; + /** + * Width of progress bar in pixel + * @const + */ + var PROGRESS_BAR_WIDTH = 600; + /** @const {number} Time in milliseconds for minimal progress update */ + var TIMER_STEP = 1000; + /** @const {number} Cast volume upon initial connection */ + var DEFAULT_VOLUME = 0.5; + /** @const {number} Height, in pixels, of volume bar */ + var FULL_VOLUME_HEIGHT = 100; + /** @enum {string} Constants of states for media for both local and remote playback */ + var PLAYER_STATE = { + // No media is loaded into the player. For remote playback, maps to + // the PlayerState.IDLE state. + IDLE: 'IDLE', + LOADING: 'LOADING', + // Player is in PLAY mode but not actively playing content. For remote + // playback, maps to the PlayerState.BUFFERING state. + BUFFERING: 'BUFFERING', + // The media is loaded but not playing. + LOADED: 'LOADED', + // The media is playing. For remote playback, maps to the PlayerState.PLAYING state. + PLAYING: 'PLAYING', + // The media is paused. For remote playback, maps to the PlayerState.PAUSED state. + PAUSED: 'PAUSED', + STOPPED: 'STOPPED', + ERROR: 'ERROR' + }; + /** + * Cast player object + * Main variables: + * - PlayerHandler object for handling media playback + * - Cast player variables for controlling Cast mode media playback + * - Current media variables for transition between Cast and local modes + * - Current ad variables for controlling UI based on ad playback + * - Current live variables for controlling UI based on ad playback + * @struct @constructor + */ + var CastPlayer = function () { + /** @type {PlayerHandler} Delegation proxy for media playback */ + this.playerHandler = new PlayerHandler(this); + /** @type {PLAYER_STATE} A state for media playback */ + this.playerState = PLAYER_STATE.IDLE; + /** + * @type {PLAYER_STATE} Player state before switching between local and + * remote playback. + */ + this.playerStateBeforeSwitch = null; + /* Cast player variables */ + /** @type {cast.framework.RemotePlayer} */ + this.remotePlayer = null; + /** @type {cast.framework.RemotePlayerController} */ + this.remotePlayerController = null; + /* Local+Remote player variables */ + /** @type {number} A number for current time in seconds. Maintained in media time. */ + this.currentMediaTime = 0; + /** + * @type {?number} A number for current duration in seconds. Maintained in media time. + * Null if duration should not be shown. + */ + this.mediaDuration = -1; + /** @type {?number} A timer for tracking progress of media */ + this.timer = null; + /** @type {function()} Listener for handling current time increments */ + this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this); + /** @type {function()} Listener to be added/removed for the seek action */ + this.seekMediaListener = this.seekMedia.bind(this); + /* Local player variables */ + /** @type {number} A number for current media index */ + this.currentMediaIndex = 0; + /** @type {?Object} media contents from JSON */ + this.mediaContents = null; + /** @type {boolean} Fullscreen mode on/off */ + this.fullscreen = false; + /* Remote Player variables */ + /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */ + this.mediaInfo = null; + /* Ad variables */ + /** + * @type {?number} The time in seconds when the break clip becomes skippable. + * 5 means that the end user can skip this break clip after 5 seconds. If + * negative or not defined, it means that the current break clip is not skippable. + */ + this.whenSkippable = null; + /* Live variables */ + /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */ + this.liveSeekableRange = null; + /** @type {boolean} Remote player is playing live content. */ + this.isLiveContent = false; + this.mediaJSON = { + 'categories': [] + }; + }; + CastPlayer.prototype.initializeCastPlayer = function () { + var options = {}; + // Set the receiver application ID to your own (created in the + // Google Cast Developer Console), or optionally + // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID + options.receiverApplicationId = '4F8B3483'; + // Auto join policy can be one of the following three: + // ORIGIN_SCOPED - Auto connect from same appId and page origin + // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab + // PAGE_SCOPED - No auto connect + options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED; + cast.framework.CastContext.getInstance().setOptions(options); + this.remotePlayer = new cast.framework.RemotePlayer(); + this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, function (e) { + this.switchPlayer(e.value); + }.bind(this)); + }; + /** + * Switch between the remote and local players. + */ + CastPlayer.prototype.switchPlayer = function () { + this.playerStateBeforeSwitch = this.playerState; + this.stopProgressTimer(); + this.resetVolumeSlider(); + // Session is active + if (cast && cast.framework && this.remotePlayer.isConnected) { + // Pause local playback + this.playerHandler.pause(); + this.setupRemotePlayer(); + } + else { + this.setupLocalPlayer(); + } + }; + /** + * PlayerHandler + * + * This is a handler through which the application will interact + * with both the RemotePlayer and LocalPlayer. Combining these two into + * one interface is one approach to the dual-player nature of a Cast + * Chrome application. Otherwise, the state of the RemotePlayer can be + * queried at any time to decide whether to interact with the local + * or remote players. + * + * To set the player used, implement the following methods for a target object + * and call setTarget(target). + * + * Methods to implement: + * - play() + * - pause() + * - stop() + * - seekTo(time) + * - load(mediaIndex) + * - isMediaLoaded(mediaIndex) + * - prepareToPlay() + * - getMediaDuration() + * - getCurrentMediaTime() + * - setVolume(volumeSliderPosition) + * - mute() + * - unMute() + * - isMuted() + * - updateDisplay() + * - updateCurrentTimeDisplay() + * - updateDurationDisplay() + * - setTimeString(element, time) + */ + var PlayerHandler = function (castPlayer) { + this.target = {}; + this.setTarget = function (target) { + this.target = target; + }; + this.play = function () { + if (castPlayer.playerState == PLAYER_STATE.IDLE || + !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) { + this.load(castPlayer.currentMediaIndex); + return; + } + castPlayer.playerState = PLAYER_STATE.PLAYING; + this.target.play(); + document.getElementById('play').style.display = 'none'; + document.getElementById('pause').style.display = 'block'; + }; + this.pause = function () { + this.target.pause(); + castPlayer.playerState = PLAYER_STATE.PAUSED; + document.getElementById('play').style.display = 'block'; + document.getElementById('pause').style.display = 'none'; + }; + this.stop = function () { + castPlayer.playerState = PLAYER_STATE.IDLE; + this.target.stop(); + }; + this.load = function (mediaIndex) { + if (mediaIndex === void 0) { mediaIndex = null; } + if (!mediaIndex) { + mediaIndex = castPlayer.currentMediaIndex; + } + castPlayer.playerState = PLAYER_STATE.BUFFERING; + this.target.load(mediaIndex); + }; + /** + * Check if media has been loaded on the target player. + * @param {number?} mediaIndex The desired media index. If null, verify if + * any media is loaded. + */ + this.isMediaLoaded = function (mediaIndex) { + return this.target.isMediaLoaded(mediaIndex); + }; + /** + * Called after media has been successfully loaded and is ready to start playback. + * When local, will start playing the video, start the timer, and update the UI. + * When remote, will set the UI to PLAYING and start the timer to update the + * UI based on remote playback. + */ + this.prepareToPlay = function () { + castPlayer.mediaDuration = this.getMediaDuration(); + castPlayer.playerHandler.updateDurationDisplay(); + castPlayer.playerState = PLAYER_STATE.LOADED; + this.play(); + castPlayer.startProgressTimer(); + this.updateDisplay(); + }; + this.getCurrentMediaTime = function () { + return this.target.getCurrentMediaTime(); + }; + this.getMediaDuration = function () { + return this.target.getMediaDuration(); + }; + this.updateDisplay = function () { + // Update local variables + this.currentMediaTime = this.target.getCurrentMediaTime(); + this.mediaDuration = this.target.getMediaDuration(); + this.target.updateDisplay(); + }; + this.updateCurrentTimeDisplay = function () { + this.target.updateCurrentTimeDisplay(); + }; + this.updateDurationDisplay = function () { + this.target.updateDurationDisplay(); + }; + /** + * Determines the correct time string (media or clock) and sets it for the given element. + */ + this.setTimeString = function (element, time) { + this.target.setTimeString(element, time); + }; + this.setVolume = function (volumeSliderPosition) { + this.target.setVolume(volumeSliderPosition); + }; + this.mute = function () { + this.target.mute(); + document.getElementById('audio_on').style.display = 'none'; + document.getElementById('audio_off').style.display = 'block'; + }; + this.unMute = function () { + this.target.unMute(); + document.getElementById('audio_on').style.display = 'block'; + document.getElementById('audio_off').style.display = 'none'; + }; + this.isMuted = function () { + return this.target.isMuted(); + }; + this.seekTo = function (time) { + this.target.seekTo(time); + }; + }; + /** + * Set the PlayerHandler target to use the video-element player + */ + CastPlayer.prototype.setupLocalPlayer = function () { + var localPlayer = document.getElementById('video_element'); + localPlayer.addEventListener('loadeddata', this.onMediaLoadedLocally.bind(this)); + // This object will implement PlayerHandler callbacks with localPlayer + var playerTarget = {}; + playerTarget.play = function () { + localPlayer.play(); + var vi = document.getElementById('video_image'); + vi.style.display = 'none'; + localPlayer.style.display = 'block'; + }; + playerTarget.pause = function () { + localPlayer.pause(); + }; + playerTarget.stop = function () { + localPlayer.stop(); + }; + playerTarget.load = function (mediaIndex) { + localPlayer.src = + this.mediaContents[mediaIndex]['sources'][0]; + localPlayer.load(); + }.bind(this); + playerTarget.getCurrentMediaTime = function () { + return localPlayer.currentTime; + }; + playerTarget.getMediaDuration = function () { + return localPlayer.duration; + }; + playerTarget.updateDisplayMessage = function () { + document.getElementById('playerstate').style.display = 'none'; + document.getElementById('playerstatebg').style.display = 'none'; + document.getElementById('video_image_overlay').style.display = 'none'; + }; + playerTarget.setVolume = function (volumeSliderPosition) { + localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ? + volumeSliderPosition / FULL_VOLUME_HEIGHT : 1; + var p = document.getElementById('audio_bg_level'); + p.style.height = volumeSliderPosition + 'px'; + p.style.marginTop = -volumeSliderPosition + 'px'; + }; + playerTarget.mute = function () { + localPlayer.muted = true; + }; + playerTarget.unMute = function () { + localPlayer.muted = false; + }; + playerTarget.isMuted = function () { + return localPlayer.muted; + }; + playerTarget.seekTo = function (time) { + localPlayer.currentTime = time; + }; + this.playerHandler.setTarget(playerTarget); + this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT); + this.showFullscreenButton(); + if (this.currentMediaTime > 0) { + this.playerHandler.play(); + } + }; + /** + * Set the PlayerHandler target to use the remote player + * Add event listeners for player changes which may occur outside sender app. + */ + CastPlayer.prototype.setupRemotePlayer = function () { + // Triggers when the media info or the player state changes + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED, function (event) { + var session = cast.framework.CastContext.getInstance().getCurrentSession(); + if (!session) { + this.mediaInfo = null; + this.isLiveContent = false; + this.playerHandler.updateDisplay(); + return; + } + var media = session.getMediaSession(); + if (!media) { + this.mediaInfo = null; + this.isLiveContent = false; + this.playerHandler.updateDisplay(); + return; + } + this.mediaInfo = media.media; + if (this.mediaInfo) { + this.isLiveContent = (this.mediaInfo.streamType == + chrome.cast.media.StreamType.LIVE); + } + else { + this.isLiveContent = false; + } + if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) { + this.playerHandler.prepareToPlay(); + } + this.removeAdMarkers(); + this.updateAdMarkers(); + this.playerHandler.updateDisplay(); + }.bind(this)); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED, function (event) { + this.enableProgressBar(event.value); + }.bind(this)); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, function () { + if (this.remotePlayer.isPaused) { + this.playerHandler.pause(); + } + else if (this.playerState !== PLAYER_STATE.PLAYING) { + // If currently not playing, start to play. + // This occurs if starting to play from local, but this check is + // required if the state is changed remotely. + this.playerHandler.play(); + } + }.bind(this)); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED, function () { + if (this.remotePlayer.isMuted) { + this.playerHandler.mute(); + } + else { + this.playerHandler.unMute(); + } + }.bind(this)); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED, function () { + var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; + var p = document.getElementById('audio_bg_level'); + p.style.height = newVolume + 'px'; + p.style.marginTop = -newVolume + 'px'; + }.bind(this)); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED, function (event) { + this.isPlayingBreak(event.value); + }.bind(this)); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED, function (event) { + this.onWhenSkippableChanged(event.value); + }.bind(this)); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED, function (event) { + this.onCurrentBreakClipTimeChanged(event.value); + }.bind(this)); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED, function (event) { + this.onBreakClipIdChanged(event.value); + }.bind(this)); + this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED, function (event) { + console.log('LIVE_SEEKABLE_RANGE_CHANGED'); + this.liveSeekableRange = event.value; + }.bind(this)); + // This object will implement PlayerHandler callbacks with + // remotePlayerController, and makes necessary UI updates specific + // to remote playback. + var playerTarget = {}; + playerTarget.play = function () { + if (this.remotePlayer.isPaused) { + this.remotePlayerController.playOrPause(); + } + var vi = document.getElementById('video_image'); + vi.style.display = ''; + var localPlayer = document.getElementById('video_element'); + localPlayer.style.display = 'none'; + }.bind(this); + playerTarget.pause = function () { + if (!this.remotePlayer.isPaused) { + this.remotePlayerController.playOrPause(); + } + }.bind(this); + playerTarget.stop = function () { + this.remotePlayerController.stop(); + }.bind(this); + // Load request for local -> remote + playerTarget.load = function (mediaIndex) { + console.log('Loading...' + this.mediaContents[mediaIndex]['title']); + var mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4'); + mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED; + mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata(); + mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title']; + mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle']; + mediaInfo.metadata.images = [{ + 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'] + }]; + var request = new chrome.cast.media.LoadRequest(mediaInfo); + request.currentTime = this.currentMediaTime; + if (ENABLE_ADS) { + // Add sample breaks and breakClips. + mediaInfo.breakClips = breakClipsJSON; + mediaInfo.breaks = breaksJSON; + } + else if (ENABLE_LIVE) { + // Change the streamType and add live specific metadata. + mediaInfo.streamType = chrome.cast.media.StreamType.LIVE; + // TODO: Set the metadata on the receiver side in your implementation. + // startAbsoluteTime and sectionStartTimeInMedia will be set for you. + // See https://developers.google.com/cast/docs/caf_receiver/live. + // TODO: Start time, is a fake timestamp. Use correct values for your implementation. + var currentTime = new Date(); + // Convert from milliseconds to seconds. + currentTime = currentTime / 1000; + var sectionStartAbsoluteTime = currentTime; + // Duration should be -1 for live streams. + mediaInfo.duration = -1; + // TODO: Set on the receiver for your implementation. + mediaInfo.startAbsoluteTime = currentTime; + mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime; + // TODO: Set on the receiver for your implementation. + mediaInfo.metadata.sectionStartTimeInMedia = 0; + mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration']; + var item = new chrome.cast.media.QueueItem(mediaInfo); + request.queueData = new chrome.cast.media.QueueData(); + request.queueData.items = [item]; + request.queueData.name = "Sample Queue for Live"; + } + // Do not immediately start playing if the player was previously PAUSED. + if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) { + request.autoplay = false; + } + else { + request.autoplay = true; + } + cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(function () { + console.log('Remote media loaded'); + }.bind(this), function (errorCode) { + this.playerState = PLAYER_STATE.IDLE; + console.log('Remote media load error: ' + + CastPlayer.getErrorMessage(errorCode)); + this.playerHandler.updateDisplay(); + }.bind(this)); + }.bind(this); + playerTarget.isMediaLoaded = function (mediaIndex) { + var session = cast.framework.CastContext.getInstance().getCurrentSession(); + if (!session) + return false; + var media = session.getMediaSession(); + if (!media) + return false; + if (media.playerState == PLAYER_STATE.IDLE) { + return false; + } + // No need to verify local mediaIndex content. + return true; + }.bind(this); + /** + * @return {number?} Current media time for the content. Always returns + * media time even if in clock time (conversion done when displaying). + */ + playerTarget.getCurrentMediaTime = function () { + if (this.isLiveContent && this.mediaInfo.metadata && + this.mediaInfo.metadata.sectionStartTimeInMedia) { + return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia; + } + else { + // VOD and live scenerios where live metadata is not provided. + return this.remotePlayer.currentTime; + } + }.bind(this); + /** + * @return {number?} media time duration for the content. Always returns + * media time even if in clock time (conversion done when displaying). + */ + playerTarget.getMediaDuration = function () { + if (this.isLiveContent) { + // Scenerios when live metadata is not provided. + if (this.mediaInfo.metadata == undefined || + this.mediaInfo.metadata.sectionDuration == undefined || + this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) { + return null; + } + return this.mediaInfo.metadata.sectionDuration; + } + else { + return this.remotePlayer.duration; + } + }.bind(this); + playerTarget.updateDisplay = function () { + var castSession = cast.framework.CastContext.getInstance().getCurrentSession(); + if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) { + var media = castSession.getMediaSession(); + var mediaInfo = media.media; + // image placeholder for video view + var vi = document.getElementById('video_image'); + if (mediaInfo.metadata && mediaInfo.metadata.images && + mediaInfo.metadata.images.length > 0) { + vi.src = mediaInfo.metadata.images[0].url; + } + // playerstate view + document.getElementById('playerstate').style.display = 'block'; + document.getElementById('playerstatebg').style.display = 'block'; + document.getElementById('video_image_overlay').style.display = 'block'; + var mediaTitle = ''; + var mediaEpisodeTitle = ''; + var mediaSubtitle = ''; + if (mediaInfo.metadata) { + mediaTitle = mediaInfo.metadata.title; + mediaEpisodeTitle = mediaInfo.metadata.episodeTitle; + // Append episode title if present + mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle; + // Do not display mediaTitle if not defined. + mediaTitle = (mediaTitle) ? mediaTitle + ' ' : ''; + mediaSubtitle = mediaInfo.metadata.subtitle; + mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : ''; + } + if (DEMO_MODE) { + document.getElementById('playerstate').innerHTML = + (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast'; + // media_info view + document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video'); + document.getElementById('media_subtitle').innerHTML = ''; + } + else { + document.getElementById('playerstate').innerHTML = + mediaTitle + media.playerState + ' on ' + + castSession.getCastDevice().friendlyName; + // media_info view + document.getElementById('media_title').innerHTML = mediaTitle; + document.getElementById('media_subtitle').innerHTML = mediaSubtitle; + } + // live information + if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) { + this.liveSeekableRange = media.liveSeekableRange; + var live_indicator = document.getElementById('live_indicator'); + live_indicator.style.display = 'block'; + // Display indicator if current time is close to the end of + // the seekable range. + if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) { + live_indicator.src = "imagefiles/live_indicator_active.png"; + } + else { + live_indicator.src = "imagefiles/live_indicator_inactive.png"; + } + } + else { + document.getElementById('live_indicator').style.display = 'none'; + } + } + else { + // playerstate view + document.getElementById('playerstate').style.display = 'none'; + document.getElementById('playerstatebg').style.display = 'none'; + document.getElementById('video_image_overlay').style.display = 'none'; + // media_info view + document.getElementById('media_title').innerHTML = ""; + document.getElementById('media_subtitle').innerHTML = ""; + } + }.bind(this); + playerTarget.updateCurrentTimeDisplay = function () { + this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime()); + }.bind(this); + playerTarget.updateDurationDisplay = function () { + this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration()); + }.bind(this); + playerTarget.setTimeString = function (element, time) { + var currentTimeString = this.getMediaTimeString(time); + if (this.isLiveContent) { + if (currentTimeString == null) { + element.style.display = 'none'; + return; + } + // clock time + if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) { + element.style.display = 'flex'; + element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime); + } + else { + // media time + element.style.display = 'flex'; + element.innerHTML = currentTimeString; + } + } + else { + if (currentTimeString !== null) { + element.style.display = 'flex'; + element.innerHTML = currentTimeString; + } + else { + element.style.display = 'none'; + } + } + }.bind(this); + playerTarget.setVolume = function (volumeSliderPosition) { + var currentVolume = this.remotePlayer.volumeLevel; + var p = document.getElementById('audio_bg_level'); + if (volumeSliderPosition < FULL_VOLUME_HEIGHT) { + p.style.height = volumeSliderPosition + 'px'; + p.style.marginTop = -volumeSliderPosition + 'px'; + currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT; + } + else { + currentVolume = 1; + } + this.remotePlayer.volumeLevel = currentVolume; + this.remotePlayerController.setVolumeLevel(); + }.bind(this); + playerTarget.mute = function () { + if (!this.remotePlayer.isMuted) { + this.remotePlayerController.muteOrUnmute(); + } + }.bind(this); + playerTarget.unMute = function () { + if (this.remotePlayer.isMuted) { + this.remotePlayerController.muteOrUnmute(); + } + }.bind(this); + playerTarget.isMuted = function () { + return this.remotePlayer.isMuted; + }.bind(this); + playerTarget.seekTo = function (time) { + this.remotePlayer.currentTime = time; + this.remotePlayerController.seek(); + }.bind(this); + this.playerHandler.setTarget(playerTarget); + // Setup remote player properties on setup + if (this.remotePlayer.isMuted) { + this.playerHandler.mute(); + } + this.enableProgressBar(this.remotePlayer.canSeek); + // The remote player may have had a volume set from previous playback + var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; + var p = document.getElementById('audio_bg_level'); + p.style.height = currentVolume + 'px'; + p.style.marginTop = -currentVolume + 'px'; + // Show media_control + document.getElementById('media_control').style.opacity = 0.7; + this.hideFullscreenButton(); + // If resuming a session, take the remote properties and continue the existing + // playback. Otherwise, load local content. + if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() == + cast.framework.SessionState.SESSION_RESUMED) { + console.log('Resuming session'); + this.playerHandler.prepareToPlay(); + // New media has been loaded so the previous ad markers should + // be removed. + this.removeAdMarkers(); + this.updateAdMarkers(); + } + else { + this.playerHandler.load(); + } + }; + /** + * Callback when media is loaded in local player + */ + CastPlayer.prototype.onMediaLoadedLocally = function () { + var localPlayer = document.getElementById('video_element'); + localPlayer.currentTime = this.currentMediaTime; + this.playerHandler.prepareToPlay(); + }; + /** + * Select a media content + * @param {number} mediaIndex A number for media index + */ + CastPlayer.prototype.selectMedia = function (mediaIndex) { + console.log('Media index selected: ' + mediaIndex); + this.currentMediaIndex = mediaIndex; + // Clear currentMediaInfo when playing content from the sender. + this.playerHandler.currentMediaInfo = undefined; + // Set video image + var vi = document.getElementById('video_image'); + vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']; + // Reset progress bar + var pi = document.getElementById('progress_indicator'); + pi.style.marginLeft = '0px'; + var progress = document.getElementById('progress'); + progress.style.width = '0px'; + var seekable_window = document.getElementById('seekable_window'); + var unseekable_overlay = document.getElementById('unseekable_overlay'); + seekable_window.style.width = PROGRESS_BAR_WIDTH; + unseekable_overlay.style.width = '0px'; + // Stop timer and reset time displays + this.stopProgressTimer(); + this.currentMediaTime = 0; + this.playerHandler.setTimeString(document.getElementById('currentTime'), 0); + this.playerHandler.setTimeString(document.getElementById('duration'), 0); + this.playerState = PLAYER_STATE.IDLE; + this.playerHandler.play(); + }; + /** + * Media seek function + * @param {Event} event An event object from seek + */ + CastPlayer.prototype.seekMedia = function (event) { + if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) { + console.log('Error - Not seekable'); + return; + } + if (this.isLiveContent && !this.liveSeekableRange) { + console.log('Live content has no seekable range.'); + return; + } + var position = parseInt(event.offsetX, 10); + var pi = document.getElementById('progress_indicator'); + var progress = document.getElementById('progress'); + var seekTime = 0; + var pp = 0; + var pw = 0; + if (event.currentTarget.id == 'progress_indicator') { + seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position / + PROGRESS_BAR_WIDTH, 10); + pp = parseInt(pi.style.marginLeft, 10) + position; + pw = parseInt(progress.style.width, 10) + position; + } + else { + seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10); + pp = position; + pw = position; + } + if (this.playerState === PLAYER_STATE.PLAYING || + this.playerState === PLAYER_STATE.PAUSED) { + this.currentMediaTime = seekTime; + progress.style.width = pw + 'px'; + pi.style.marginLeft = pp + 'px'; + } + if (this.isLiveContent) { + seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia; + } + this.playerHandler.seekTo(seekTime); + }; + /** + * Set current player volume + * @param {Event} mouseEvent + */ + CastPlayer.prototype.setVolume = function (mouseEvent) { + var p = document.getElementById('audio_bg_level'); + var pos = 0; + if (mouseEvent.currentTarget.id === 'audio_bg_track') { + pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10); + } + else { + pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10); + } + this.playerHandler.setVolume(pos); + }; + /** + * Starts the timer to increment the media progress bar + */ + CastPlayer.prototype.startProgressTimer = function () { + this.stopProgressTimer(); + // Start progress timer + this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP); + }; + /** + * Stops the timer to increment the media progress bar + */ + CastPlayer.prototype.stopProgressTimer = function () { + if (this.timer) { + clearInterval(this.timer); + this.timer = null; + } + }; + /** + * Increment media current time depending on remote or local playback + */ + CastPlayer.prototype.incrementMediaTime = function () { + // First sync with the current player's time + this.currentMediaTime = this.playerHandler.getCurrentMediaTime(); + this.mediaDuration = this.playerHandler.getMediaDuration(); + this.playerHandler.updateDurationDisplay(); + if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) { + this.playerHandler.updateCurrentTimeDisplay(); + this.updateProgressBarByTimer(); + } + else if (this.mediaDuration > 0) { + this.endPlayback(); + } + }; + /** + * Update progress bar and currentTime based on timer + */ + CastPlayer.prototype.updateProgressBarByTimer = function () { + var progressBar = document.getElementById('progress'); + var pi = document.getElementById('progress_indicator'); + // Live situation where the progress and duration is unknown. + if (this.mediaDuration == null) { + if (!this.isLiveContent) { + console.log('Error - Duration is not defined for a VOD stream.'); + } + progressBar.style.width = '0px'; + var skip = document.getElementById('skip'); + if (skip && skip.style && skip.style.display) { + skip.style.display = 'none'; + } + pi.style.display = 'none'; + var seekable_window_1 = document.getElementById('seekable_window'); + if (seekable_window_1 && seekable_window_1.style && seekable_window_1.style.width) + seekable_window_1.style.width = '0px'; + var unseekable_overlay_1 = document.getElementById('unseekable_overlay'); + if (unseekable_overlay_1 && unseekable_overlay_1.style && unseekable_overlay_1.style.width) + unseekable_overlay_1.style.width = '0px'; + return; + } + else { + pi.style.display = ''; + } + if (isNaN(parseInt(progressBar.style.width, 10))) { + progressBar.style.width = '0px'; + } + // Prevent indicator from exceeding the max width. Happens during + // short media when each progress step is large + var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration); + if (pp > PROGRESS_BAR_WIDTH) { + pp = PROGRESS_BAR_WIDTH; + } + else if (pp < 0) { + pp = 0; + } + progressBar.style.width = pp + 'px'; + pi.style.marginLeft = pp + 'px'; + var seekable_window = document.getElementById('seekable_window'); + var unseekable_overlay = document.getElementById('unseekable_overlay'); + if (this.isLiveContent) { + if (this.liveSeekableRange) { + // Use the liveSeekableRange to draw the seekable and unseekable windows + var seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) - + this.mediaInfo.metadata.sectionStartTimeInMedia; + var seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration); + if (seekableWidth > PROGRESS_BAR_WIDTH) { + seekableWidth = PROGRESS_BAR_WIDTH; + } + else if (seekableWidth < 0) { + seekableWidth = 0; + } + seekable_window.style.width = seekableWidth + 'px'; + var unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) - + this.mediaInfo.metadata.sectionStartTimeInMedia; + var unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration); + if (unseekableWidth > PROGRESS_BAR_WIDTH) { + unseekableWidth = PROGRESS_BAR_WIDTH; + } + else if (unseekableWidth < 0) { + unseekableWidth = 0; + } + unseekable_overlay.style.width = unseekableWidth + 'px'; + } + else { + // Nothing is seekable if no liveSeekableRange + seekable_window.style.width = '0px'; + unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px'; + } + } + else { + // Default to everything seekable + seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px'; + unseekable_overlay.style.width = '0px'; + } + if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) { + this.endPlayback(); + } + }; + /** + * End playback. Called when media ends. + */ + CastPlayer.prototype.endPlayback = function () { + this.currentMediaTime = 0; + this.stopProgressTimer(); + this.playerState = PLAYER_STATE.IDLE; + this.playerHandler.updateDisplay(); + var play = document.getElementById('play'); + if (play && play.style && play.display) + play.style.display = 'block'; + var pause = document.getElementById('pause'); + if (pause && pause.style && pause.style.display) + pause.style.display = 'none'; + }; + /** + * @param {?number} timestamp Linux timestamp + * @return {?string} media time string. Null if time is invalid. + */ + CastPlayer.prototype.getMediaTimeString = function (timestamp) { + if (timestamp == undefined || timestamp == null) { + return null; + } + var isNegative = false; + if (timestamp < 0) { + isNegative = true; + timestamp *= -1; + } + var hours = Math.floor(timestamp / 3600); + var minutes = Math.floor((timestamp - (hours * 3600)) / 60); + var seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60)); + if (hours < 10) + hours = '0' + hours; + if (minutes < 10) + minutes = '0' + minutes; + if (seconds < 10) + seconds = '0' + seconds; + return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds; + }; + /** + * @param {number} timestamp Linux timestamp + * @return {?string} ClockTime string. Null if time is invalid. + */ + CastPlayer.prototype.getClockTimeString = function (timestamp) { + if (!timestamp) + return "0:00:00"; + var date = new Date(timestamp * 1000); + var hours = date.getHours(); + var minutes = date.getMinutes(); + var seconds = date.getSeconds(); + var ampm = hours >= 12 ? 'PM' : 'AM'; + hours = hours % 12; + // Hour '0' should be '12' + hours = hours ? hours : 12; + minutes = ('0' + minutes).slice(-2); + seconds = ('0' + seconds).slice(-2); + var clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm; + return clockTime; + }; + /** + * Updates Ad markers in UI + */ + CastPlayer.prototype.updateAdMarkers = function () { + var castSession = cast.framework.CastContext.getInstance().getCurrentSession(); + if (!castSession) + return; + var media = castSession.getMediaSession(); + if (!media) + return; + var mediaInfo = media.media; + if (!mediaInfo) + return; + var breaks = mediaInfo.breaks; + var contentDuration = mediaInfo.duration; + if (!breaks) { + return; + } + for (var i = 0; i < breaks.length; i++) { + var adBreak = breaks[i]; + // Server-side stitched Ads (embedded) are skipped when the position is beyond + // the duration, so they shouldn't be shown with an ad marker on the UI. + if (adBreak.position > contentDuration && adBreak.isEmbedded) { + continue; + } + // Place marker if not already set in position + if (!document.getElementById('ad' + adBreak.position)) { + var div = document.getElementById('progress'); + div.innerHTML += '
'; + } + } + }; + /** + * Remove Ad markers in UI + */ + CastPlayer.prototype.removeAdMarkers = function () { + document.querySelectorAll('.adMarker').forEach(function (adMarker) { + adMarker.remove(); + }); + }; + /** + * Position of the ad marker from the margin + */ + CastPlayer.prototype.adPositionToMargin = function (position, contentDuration) { + // Post-roll + if (position == -1) { + return PROGRESS_BAR_WIDTH; + } + // Client stitched Ads (not embedded) beyond the duration, will play at the + // end of the content. + if (position > contentDuration) { + return PROGRESS_BAR_WIDTH; + } + // Convert Ad position to margin + return (PROGRESS_BAR_WIDTH * position) / contentDuration; + }; + /** + * Handle BREAK_CLIP_ID_CHANGED event + */ + CastPlayer.prototype.onBreakClipIdChanged = function () { + // Hide skip button when switching to a new breakClip + var skip = document.getElementById('skip'); + if (skip && skip.style && skip.style.display) + skip.style.display = 'none'; + }; + /** + * Disable progress bar if playing a break. + */ + CastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) { + this.enableProgressBar(!isPlayingBreak); + }; + /** + * Handle WHEN_SKIPPABLE_CHANGED event + */ + CastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) { + this.whenSkippable = whenSkippable; + }; + /** + * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event + */ + CastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) { + var skip = document.getElementById('skip'); + // Unskippable + if (this.whenSkippable == undefined || this.whenSkippable < 0) { + // Hide skip button + if (skip && skip.style && skip.style.display) + skip.style.display = 'none'; + } + // Skippable + else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) { + // Show skip button + if (skip && skip.style && skip.style.display) + skip.style.display = 'block'; + } + // Not ready to be skipped + else { + // Hide skip button + if (skip && skip.style && skip.style.display) + skip.style.display = 'none'; + } + }; + /** + * Skip the current Ad + */ + CastPlayer.prototype.skipAd = function () { + this.remotePlayerController.skipAd(); + }; + /** + * Enable/disable progress bar + */ + CastPlayer.prototype.enableProgressBar = function (enable) { + var progress = document.getElementById('progress'); + var progress_indicator = document.getElementById('progress_indicator'); + var seekable_window = document.getElementById('seekable_window'); + if (enable) { + // Enable UI + progress.style.backgroundImage = "url('./assets/imagefiles/timeline_bg_progress.png')"; + progress.style.cursor = "pointer"; + seekable_window.style.cursor = "pointer"; + progress_indicator.style.cursor = "pointer"; + progress_indicator.draggable = true; + // Add listeners + progress.addEventListener('click', this.seekMediaListener); + seekable_window.addEventListener('click', this.seekMediaListener); + progress_indicator.addEventListener('dragend', this.seekMediaListener); + } + else { + // Disable UI + progress.style.backgroundImage = "url('./assets/imagefiles/timeline_bg_buffer.png')"; + progress.style.cursor = "default"; + seekable_window.style.cursor = "default"; + progress_indicator.style.cursor = "default"; + progress_indicator.draggable = false; + // Remove listeners + progress.removeEventListener('click', this.seekMediaListener); + seekable_window.removeEventListener('click', this.seekMediaListener); + progress_indicator.removeEventListener('dragend', this.seekMediaListener); + } + }; + /** + * Request full screen mode + */ + CastPlayer.prototype.requestFullScreen = function () { + // Supports most browsers and their versions + var element = document.getElementById('video_element'); + var requestMethod = element['requestFullScreen'] || element['webkitRequestFullScreen']; + if (requestMethod) { + // Native full screen. + requestMethod.call(element); + console.log('Requested fullscreen'); + } + }; + /** + * Exit full screen mode + */ + CastPlayer.prototype.cancelFullScreen = function () { + // Supports most browsers and their versions. + var requestMethod = document['cancelFullScreen'] || document['webkitCancelFullScreen']; + if (requestMethod) { + requestMethod.call(document); + } + }; + /** + * Exit fullscreen mode by escape + */ + CastPlayer.prototype.fullscreenChangeHandler = function () { + this.fullscreen = !this.fullscreen; + }; + /** + * Show expand/collapse fullscreen button + */ + CastPlayer.prototype.showFullscreenButton = function () { + var fullscreen_expand = document.getElementById('fullscreen_expand'); + var fullscreen_collapse = document.getElementById('fullscreen_collapse'); + if (this.fullscreen) { + if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) + fullscreen_expand.style.display = 'none'; + if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display) + fullscreen_collapse.style.display = 'block'; + } + else { + if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) + fullscreen_expand.style.display = 'block'; + if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display) + fullscreen_collapse.style.display = 'none'; + } + }; + /** + * Hide expand/collapse fullscreen button + */ + CastPlayer.prototype.hideFullscreenButton = function () { + var fullscreen_expand = document.getElementById('fullscreen_expand'); + var fullscreen_collapse = document.getElementById('fullscreen_collapse'); + if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) + fullscreen_expand.style.display = 'none'; + if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display) + fullscreen_collapse.style.display = 'none'; + }; + /** + * Show the media control + */ + CastPlayer.prototype.showMediaControl = function () { + var media_control = document.getElementById('media_control'); + if (media_control && media_control.style && media_control.opacity) + media_control.style.opacity = 0.7; + }; + /** + * Hide the media control + */ + CastPlayer.prototype.hideMediaControl = function () { + if (typeof cast !== 'undefined') { + var context = cast.framework.CastContext.getInstance(); + if (context && context.getCurrentSession()) { + // Do not hide controls during an active cast session. + document.getElementById('media_control').style.opacity = 0.7; + } + else { + document.getElementById('media_control').style.opacity = 0; + } + } + }; + /** + * Show the volume slider + */ + CastPlayer.prototype.showVolumeSlider = function () { + if (!this.playerHandler.isMuted()) { + document.getElementById('audio_bg').style.opacity = 1; + document.getElementById('audio_bg_track').style.opacity = 1; + document.getElementById('audio_bg_level').style.opacity = 1; + document.getElementById('audio_indicator').style.opacity = 1; + } + }; + /** + * Hide the volume slider + */ + CastPlayer.prototype.hideVolumeSlider = function () { + document.getElementById('audio_bg').style.opacity = 0; + document.getElementById('audio_bg_track').style.opacity = 0; + document.getElementById('audio_bg_level').style.opacity = 0; + document.getElementById('audio_indicator').style.opacity = 0; + }; + /** + * Reset the volume slider + */ + CastPlayer.prototype.resetVolumeSlider = function () { + var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight; + var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight; + document.getElementById('audio_bg_level').style.height = + defaultVolumeSliderHeight + 'px'; + document.getElementById('audio_on').style.display = 'block'; + document.getElementById('audio_off').style.display = 'none'; + }; + /** + * Initialize UI components and add event listeners + */ + CastPlayer.prototype.initializeUI = function () { + // Set initial values for title, subtitle, and description + document.getElementById('media_title').innerHTML = + this.mediaContents[0]['title']; + document.getElementById('media_subtitle').innerHTML = + this.mediaContents[this.currentMediaIndex]['subtitle']; + document.getElementById('media_desc').innerHTML = + this.mediaContents[this.currentMediaIndex]['description']; + // Add event handlers to UI components + document.getElementById('progress_bg').addEventListener('click', this.seekMedia.bind(this)); + document.getElementById('progress').addEventListener('click', this.seekMedia.bind(this)); + document.getElementById('progress_indicator').addEventListener('dragend', this.seekMedia.bind(this)); + document.getElementById('audio_on').addEventListener('click', this.playerHandler.mute.bind(this.playerHandler)); + document.getElementById('audio_off').addEventListener('click', this.playerHandler.unMute.bind(this.playerHandler)); + document.getElementById('audio_bg').addEventListener('mouseover', this.showVolumeSlider.bind(this)); + document.getElementById('audio_on').addEventListener('mouseover', this.showVolumeSlider.bind(this)); + document.getElementById('audio_bg_level').addEventListener('mouseover', this.showVolumeSlider.bind(this)); + document.getElementById('audio_bg_track').addEventListener('mouseover', this.showVolumeSlider.bind(this)); + document.getElementById('audio_bg_level').addEventListener('click', this.setVolume.bind(this)); + document.getElementById('audio_bg_track').addEventListener('click', this.setVolume.bind(this)); + document.getElementById('audio_bg').addEventListener('mouseout', this.hideVolumeSlider.bind(this)); + document.getElementById('audio_on').addEventListener('mouseout', this.hideVolumeSlider.bind(this)); + document.getElementById('main_video').addEventListener('mouseover', this.showMediaControl.bind(this)); + document.getElementById('main_video').addEventListener('mouseout', this.hideMediaControl.bind(this)); + document.getElementById('media_control').addEventListener('mouseover', this.showMediaControl.bind(this)); + document.getElementById('media_control').addEventListener('mouseout', this.hideMediaControl.bind(this)); + document.getElementById('fullscreen_expand').addEventListener('click', this.requestFullScreen.bind(this)); + document.getElementById('fullscreen_collapse').addEventListener('click', this.cancelFullScreen.bind(this)); + document.addEventListener('fullscreenchange', this.fullscreenChangeHandler.bind(this), false); + document.addEventListener('webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false); + // Enable play/pause buttons + document.getElementById('play').addEventListener('click', this.playerHandler.play.bind(this.playerHandler)); + document.getElementById('pause').addEventListener('click', this.playerHandler.pause.bind(this.playerHandler)); + document.getElementById('progress_indicator').draggable = true; + }; + /** + * Add video thumbnails div's to UI for media JSON contents + */ + CastPlayer.prototype.addVideoThumbs = function () { + if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) { + this.mediaContents = this.mediaJSON['categories'][0]['videos']; + var ni = document.getElementById('carousel'); + var newdiv = null; + var divIdName = null; + for (var i = 0; i < this.mediaContents.length; i++) { + newdiv = document.createElement('div'); + divIdName = 'thumb' + i + 'Div'; + newdiv.setAttribute('id', divIdName); + newdiv.setAttribute('class', 'thumb'); + newdiv.innerHTML = + ''; + newdiv.addEventListener('click', this.selectMedia.bind(this, i)); + ni.appendChild(newdiv); + } + } + }; + CastPlayer.prototype.addMediaContents = function () { + if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) { + this.mediaContents = this.mediaJSON['categories'][0]['videos']; + } + }; + /** + * Makes human-readable message from chrome.cast.Error + * @param {chrome.cast.Error} error + * @return {string} error message + */ + CastPlayer.getErrorMessage = function (error) { + switch (error.code) { + case chrome.cast.ErrorCode.API_NOT_INITIALIZED: + return 'The API is not initialized.' + + (error.description ? ' :' + error.description : ''); + case chrome.cast.ErrorCode.CANCEL: + return 'The operation was canceled by the user' + + (error.description ? ' :' + error.description : ''); + case chrome.cast.ErrorCode.CHANNEL_ERROR: + return 'A channel to the receiver is not available.' + + (error.description ? ' :' + error.description : ''); + case chrome.cast.ErrorCode.EXTENSION_MISSING: + return 'The Cast extension is not available.' + + (error.description ? ' :' + error.description : ''); + case chrome.cast.ErrorCode.INVALID_PARAMETER: + return 'The parameters to the operation were not valid.' + + (error.description ? ' :' + error.description : ''); + case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE: + return 'No receiver was compatible with the session request.' + + (error.description ? ' :' + error.description : ''); + case chrome.cast.ErrorCode.SESSION_ERROR: + return 'A session could not be created, or a session was invalid.' + + (error.description ? ' :' + error.description : ''); + case chrome.cast.ErrorCode.TIMEOUT: + return 'The operation timed out.' + + (error.description ? ' :' + error.description : ''); + default: + return error; + } + }; + var castPlayer = new CastPlayer(); + window['__onGCastApiAvailable'] = function (isAvailable) { + if (isAvailable) { + castPlayer.initializeCastPlayer(); + } + }; + window.CastPlayer = castPlayer; - // ------ project path -------- | --- lib --- + /** + * Generated bundle index. Do not edit. + */ - /** - * Generated bundle index. Do not edit. - */ - - Object.defineProperty(exports, '__esModule', { value: true }); + Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=thinkam.net-ng-cast.umd.js.map diff --git a/dist/bundles/thinkam.net-ng-cast.umd.js.map b/dist/bundles/thinkam.net-ng-cast.umd.js.map index cca924a..e2f8ac2 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.js.map +++ b/dist/bundles/thinkam.net-ng-cast.umd.js.map @@ -1 +1 @@ -{"version":3,"file":"thinkam.net-ng-cast.umd.js","sources":["../../CastVideos.js","../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../index.ts","../../thinkam.net-ng-cast.ts"],"sourcesContent":["'use strict';\n\n/** Cleaner UI for demo purposes. */\nconst DEMO_MODE = false;\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/';\n\n/**\n * Controls if Ads are enabled. Controlled by radio button.\n * @type {boolean}\n */\nlet ENABLE_ADS = false;\n\n/**\n * Controls if Live stream is played. Controlled by radio button.\n * @type {boolean}\n */\nlet ENABLE_LIVE = false;\n\n/**\n * Buffer to decide if the live indicator should be displayed to show that\n * playback is at the playback head.\n * @const {number}\n */\nconst LIVE_INDICATOR_BUFFER = 50;\n\n/**\n * Width of progress bar in pixels.\n * @const {number}\n */\nconst PROGRESS_BAR_WIDTH = 700;\n\n/**\n * Time in milliseconds for minimal progress update.\n * @const {number}\n */\nconst TIMER_STEP = 1000;\n\n/**\n * Cast volume upon initial connection.\n * @const {number}\n */\nconst DEFAULT_VOLUME = 0.5;\n\n/**\n * Height, in pixels, of volume bar.\n * @const {number}\n */\nconst FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.setupLocalPlayer();\n this.addVideoThumbs();\n this.initializeUI();\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = function () {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = 'C0868879';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n this.remotePlayer = new cast.framework.RemotePlayer();\n this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer);\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n function (e) {\n this.switchPlayer(e.value);\n }.bind(this)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = function () {\n this.playerStateBeforeSwitch = this.playerState;\n\n this.stopProgressTimer();\n this.resetVolumeSlider();\n\n // Session is active\n if (cast && cast.framework && this.remotePlayer.isConnected) {\n // Pause local playback\n this.playerHandler.pause();\n this.setupRemotePlayer();\n } else {\n this.setupLocalPlayer();\n }\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n this.updateDurationDisplay = function () {\n this.target.updateDurationDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = function () {\n // Cleanup remote player UI\n let live_indicator = document.getElementById('live_indicator');\n if (live_indicator && live_indicator.style && live_indicator.style.display) {\n live_indicator.style.display = 'none';\n }\n\n this.removeAdMarkers();\n document.getElementById('skip').style.display = 'none';\n\n var localPlayer = document.getElementById('video_element');\n if (typeof localPlayer !== 'undefined' && localPlayer)\n localPlayer.addEventListener(\n 'loadeddata', this.onMediaLoadedLocally.bind(this));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src = this.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n if (!mediaIndex) {\n return (localPlayer.src !== null && localPlayer.src !== \"\");\n } else {\n return (localPlayer.src == this.mediaContents[mediaIndex]['sources'][0]);\n }\n }.bind(this);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplay = function () {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n };\n\n playerTarget.updateCurrentTimeDisplay = function () {\n // Increment for local playback\n this.currentMediaTime += 1;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.currentMediaTime);\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.mediaDuration);\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n if (currentTimeString !== null) {\n element.style.display = '';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n if (localPlayer) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n }\n\n var p = document.getElementById('audio_bg_level');\n if (typeof p !== 'undefined' && p) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n }\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n if (localPlayer)\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n this.playerHandler.setTarget(playerTarget);\n\n this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n this.showFullscreenButton();\n\n this.enableProgressBar(true);\n\n if (this.currentMediaTime > 0) {\n this.playerHandler.load();\n this.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n this.mediaInfo = media.media;\n\n if (this.mediaInfo) {\n this.isLiveContent = (this.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n this.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) {\n this.playerHandler.prepareToPlay();\n }\n\n this.removeAdMarkers();\n this.updateAdMarkers();\n\n this.playerHandler.updateDisplay();\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n this.enableProgressBar(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (this.remotePlayer.isPaused) {\n this.playerHandler.pause();\n } else if (this.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n this.playerHandler.play();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n } else {\n this.playerHandler.unMute();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n this.isPlayingBreak(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n this.onWhenSkippableChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n this.onCurrentBreakClipTimeChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n this.onBreakClipIdChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n this.liveSeekableRange = event.value;\n }.bind(this)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(this);\n\n playerTarget.pause = function () {\n if (!this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n }.bind(this);\n\n playerTarget.stop = function () {\n this.remotePlayerController.stop();\n }.bind(this);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n\n let mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;\n mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata();\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle'];\n mediaInfo.metadata.images = [{\n 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']\n }];\n\n let request = new chrome.cast.media.LoadRequest(mediaInfo);\n request.currentTime = this.currentMediaTime;\n\n if (ENABLE_ADS) {\n // Add sample breaks and breakClips.\n mediaInfo.breakClips = breakClipsJSON;\n mediaInfo.breaks = breaksJSON;\n } else if (ENABLE_LIVE) {\n // Change the streamType and add live specific metadata.\n mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;\n // TODO: Set the metadata on the receiver side in your implementation.\n // startAbsoluteTime and sectionStartTimeInMedia will be set for you.\n // See https://developers.google.com/cast/docs/caf_receiver/live.\n\n // TODO: Start time, is a fake timestamp. Use correct values for your implementation.\n let currentTime = new Date();\n // Convert from milliseconds to seconds.\n currentTime = currentTime / 1000;\n let sectionStartAbsoluteTime = currentTime;\n\n // Duration should be -1 for live streams.\n mediaInfo.duration = -1;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.startAbsoluteTime = currentTime;\n mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.metadata.sectionStartTimeInMedia = 0;\n mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration'];\n\n let item = new chrome.cast.media.QueueItem(mediaInfo);\n request.queueData = new chrome.cast.media.QueueData();\n request.queueData.items = [item];\n request.queueData.name = \"Sample Queue for Live\";\n }\n\n // Do not immediately start playing if the player was previously PAUSED.\n if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) {\n request.autoplay = false;\n } else {\n request.autoplay = true;\n }\n\n cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(\n function () {\n console.log('Remote media loaded');\n }.bind(this),\n function (errorCode) {\n this.playerState = PLAYER_STATE.IDLE;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n this.playerHandler.updateDisplay();\n }.bind(this));\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(this);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (this.isLiveContent && this.mediaInfo.metadata &&\n this.mediaInfo.metadata.sectionStartTimeInMedia) {\n return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return this.remotePlayer.currentTime;\n }\n }.bind(this);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (this.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (this.mediaInfo.metadata == undefined ||\n this.mediaInfo.metadata.sectionDuration == undefined ||\n this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return this.mediaInfo.metadata.sectionDuration;\n } else {\n return this.remotePlayer.duration;\n }\n }.bind(this);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n this.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(this);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime());\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration());\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n\n if (this.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = this.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n this.remotePlayer.volumeLevel = currentVolume;\n this.remotePlayerController.setVolumeLevel();\n }.bind(this);\n\n playerTarget.mute = function () {\n if (!this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.unMute = function () {\n if (this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.isMuted = function () {\n return this.remotePlayer.isMuted;\n }.bind(this);\n\n playerTarget.seekTo = function (time) {\n this.remotePlayer.currentTime = time;\n this.remotePlayerController.seek();\n }.bind(this);\n\n this.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n }\n this.enableProgressBar(this.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n this.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n this.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n this.removeAdMarkers();\n this.updateAdMarkers();\n } else {\n this.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = this.currentMediaTime;\n\n this.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n this.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n this.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n this.stopProgressTimer();\n this.currentMediaTime = 0;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n this.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (this.isLiveContent && !this.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (this.playerState === PLAYER_STATE.PLAYING ||\n this.playerState === PLAYER_STATE.PAUSED) {\n this.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (this.isLiveContent) {\n seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n this.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n this.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n this.stopProgressTimer();\n\n // Start progress timer\n this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n this.currentMediaTime = this.playerHandler.getCurrentMediaTime();\n this.mediaDuration = this.playerHandler.getMediaDuration();\n\n this.playerHandler.updateDurationDisplay();\n\n if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) {\n this.playerHandler.updateCurrentTimeDisplay();\n this.updateProgressBarByTimer();\n } else if (this.mediaDuration > 0) {\n this.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (this.mediaDuration == null) {\n if (!this.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n \n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n \n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (this.isLiveContent) {\n if (this.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) {\n this.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n this.currentMediaTime = 0;\n this.stopProgressTimer();\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n this.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n this.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (this.whenSkippable == undefined || this.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n this.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', this.seekMediaListener);\n seekable_window.addEventListener('click', this.seekMediaListener);\n progress_indicator.addEventListener('dragend', this.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', this.seekMediaListener);\n seekable_window.removeEventListener('click', this.seekMediaListener);\n progress_indicator.removeEventListener('dragend', this.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n this.fullscreen = !this.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (this.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block'; \n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!this.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = function () {\n // Set initial values for title and subtitle.\n if (this.mediaContents && this.mediaContents.length > 0) {\n document.getElementById('media_title').innerHTML =\n this.mediaContents[0]['title'];\n\n document.getElementById('media_subtitle').innerHTML =\n this.mediaContents[this.currentMediaIndex]['subtitle'];\n }\n\n document.getElementById('seekable_window').addEventListener(\n 'click', this.seekMediaListener);\n document.getElementById('progress').addEventListener(\n 'click', this.seekMediaListener);\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', this.seekMediaListener);\n document.getElementById('skip').addEventListener(\n 'click', this.skipAd.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'click', this.playerHandler.mute.bind(this.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', this.playerHandler.unMute.bind(this.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n\n let main_video = document.getElementById('main_video');\n if (typeof main_video !== 'undefined' && main_video) {\n main_video.addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n main_video.addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n }\n \n document.getElementById('media_control').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', this.requestFullScreen.bind(this));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', this.cancelFullScreen.bind(this));\n document.addEventListener(\n 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n document.addEventListener(\n 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', this.playerHandler.play.bind(this.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', this.playerHandler.pause.bind(this.playerHandler));\n\n document.getElementById('progress_indicator').draggable = true;\n\n // Set up feature radio buttons\n let noneRadio = document.getElementById('none');\n noneRadio.onclick = function () {\n ENABLE_LIVE = false;\n ENABLE_ADS = false;\n console.log(\"Features have been removed\");\n }\n let adsRadio = document.getElementById('ads');\n adsRadio.onclick = function () {\n ENABLE_LIVE = false;\n ENABLE_ADS = true;\n console.log(\"Ads have been enabled\");\n }\n let liveRadio = document.getElementById('live');\n liveRadio.onclick = function () {\n ENABLE_LIVE = true;\n ENABLE_ADS = false;\n console.log(\"Live has been enabled\");\n }\n\n if (ENABLE_ADS) {\n if (ENABLE_LIVE) {\n console.error('Only one feature can be enabled at a time. Enabling ads.');\n }\n adsRadio.checked = true;\n console.log(\"Ads are enabled\");\n } else if (ENABLE_LIVE) {\n liveRadio.checked = true;\n console.log(\"Live is enabled\");\n } else {\n noneRadio.checked = true;\n console.log(\"No features are enabled\");\n }\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) {\n this.mediaContents = this.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < this.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', this.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID);\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n };\n\n play = () => { \n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n globalThis.CastPlayer.addVideoThumbs();\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n"," // ------ project path -------- | --- lib ---\nimport \"/home/thinker/dev/thinkam/ngCast/CastVideos.js\";\n\nexport * from './ng.cast.module';\nexport * from './shared/ng-cast.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["NgCastComponent","Component","NgCastService","Subject","Injectable","NgCastModule","NgModule","CUSTOM_ELEMENTS_SCHEMA","CommonModule"],"mappings":";;;;;;EAAA,YAAY,CAAC;EAEb;EACA,IAAM,SAAS,GAAG,KAAK,CAAC;EAExB;EACA,IAAM,iBAAiB,GAAG,mEAAmE,CAAC;EAE9F;;;;EAIA,IAAI,UAAU,GAAG,KAAK,CAAC;EAEvB;;;;EAIA,IAAI,WAAW,GAAG,KAAK,CAAC;EAExB;;;;;EAKA,IAAM,qBAAqB,GAAG,EAAE,CAAC;EAEjC;;;;EAIA,IAAM,kBAAkB,GAAG,GAAG,CAAC;EAE/B;;;;EAIA,IAAM,UAAU,GAAG,IAAI,CAAC;EAExB;;;;EAIA,IAAM,cAAc,GAAG,GAAG,CAAC;EAE3B;;;;EAIA,IAAM,kBAAkB,GAAG,GAAG,CAAC;EAE/B;EACA,IAAM,YAAY,GAAG;;;MAGnB,IAAI,EAAE,MAAM;;;MAGZ,SAAS,EAAE,WAAW;;MAEtB,MAAM,EAAE,QAAQ;;MAEhB,OAAO,EAAE,SAAS;;MAElB,MAAM,EAAE,QAAQ;GACjB,CAAC;EAEF;;;;;;;;;;EAUA,IAAI,UAAU,GAAG;;MAEf,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;;MAG7C,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;;;;;MAMrC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;;;MAIpC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;;MAEzB,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;;;MAInC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;;;;;MAK1B,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;;MAGxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;;MAElB,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;MAEpE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;;MAInD,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;;MAE3B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;;MAE1B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;;;MAIxB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;;;;;;;MAOtB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;;;MAI1B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;;MAE9B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;MAE3B,IAAI,CAAC,gBAAgB,EAAE,CAAC;MACxB,IAAI,CAAC,cAAc,EAAE,CAAC;MACtB,IAAI,CAAC,YAAY,EAAE,CAAC;MAEpB,IAAI,CAAC,SAAS,GAAG;UACf,YAAY,EAAE,EAAE;OACjB,CAAC;EACJ,CAAC,CAAC;EAEF,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG;MAC1C,IAAI,OAAO,GAAG,EAAE,CAAC;;;;MAKjB,OAAO,CAAC,qBAAqB,GAAG,UAAU,CAAC;;;;;MAM3C,OAAO,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;MAElE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;MAE7D,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;MACtD,IAAI,CAAC,sBAAsB,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;MAC3F,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAC1C,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,oBAAoB,EACzD,UAAU,CAAC;UACT,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;OAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;EACJ,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,YAAY,GAAG;MAClC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,WAAW,CAAC;MAEhD,IAAI,CAAC,iBAAiB,EAAE,CAAC;MACzB,IAAI,CAAC,iBAAiB,EAAE,CAAC;;MAGzB,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;;UAE3D,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;UAC3B,IAAI,CAAC,iBAAiB,EAAE,CAAC;OAC1B;WAAM;UACL,IAAI,CAAC,gBAAgB,EAAE,CAAC;OACzB;EACH,CAAC,CAAC;EAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCA,IAAI,aAAa,GAAG,UAAU,UAAU;MACtC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;MAEjB,IAAI,CAAC,SAAS,GAAG,UAAU,MAAM;UAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;OACtB,CAAC;MAEF,IAAI,CAAC,IAAI,GAAG;UACV,IAAI,UAAU,CAAC,WAAW,IAAI,YAAY,CAAC,IAAI;cAC7C,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE;cAC1D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;cACxC,OAAO;WACR;UAED,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC;UAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;UAEnB,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;UACvD,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;OAC1D,CAAC;MAEF,IAAI,CAAC,KAAK,GAAG;UACX,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;UACpB,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;UAC7C,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;UACxD,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;OACzD,CAAC;MAEF,IAAI,CAAC,IAAI,GAAG;UACV,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;UAC3C,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;OACpB,CAAC;MAEF,IAAI,CAAC,IAAI,GAAG,UAAU,UAAiB;UAAjB,2BAAA,EAAA,iBAAiB;UACrC,IAAI,CAAC,UAAU,EAAE;cACf,UAAU,GAAG,UAAU,CAAC,iBAAiB,CAAC;WAC3C;UACD,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC;UAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;OAC9B,CAAC;;;;;;MAOF,IAAI,CAAC,aAAa,GAAG,UAAU,UAAU;UACvC,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;OAC9C,CAAC;;;;;;;MAQF,IAAI,CAAC,aAAa,GAAG;UACnB,UAAU,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;UACnD,UAAU,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;UACjD,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;UAE7C,IAAI,CAAC,IAAI,EAAE,CAAC;UACZ,UAAU,CAAC,kBAAkB,EAAE,CAAC;UAChC,IAAI,CAAC,aAAa,EAAE,CAAC;OACtB,CAAC;MAEF,IAAI,CAAC,mBAAmB,GAAG;UACzB,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;OAC1C,CAAC;MAEF,IAAI,CAAC,gBAAgB,GAAG;UACtB,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;OACvC,CAAC;MAEF,IAAI,CAAC,aAAa,GAAG;;UAEnB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;UAC1D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;UAEpD,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;OAC7B,CAAC;MAEF,IAAI,CAAC,wBAAwB,GAAG;UAC9B,IAAI,CAAC,MAAM,CAAC,wBAAwB,EAAE,CAAC;OACxC,CAAC;MAEF,IAAI,CAAC,qBAAqB,GAAG;UAC3B,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;OACrC,CAAC;;;;MAKF,IAAI,CAAC,aAAa,GAAG,UAAU,OAAO,EAAE,IAAI;UAC1C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;OAC1C,CAAC;MAEF,IAAI,CAAC,SAAS,GAAG,UAAU,oBAAoB;UAC7C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;OAC7C,CAAC;MAEF,IAAI,CAAC,IAAI,GAAG;UACV,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;UACnB,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;UAC3D,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;OAC9D,CAAC;MAEF,IAAI,CAAC,MAAM,GAAG;UACZ,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;UACrB,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;UAC5D,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;OAC7D,CAAC;MAEF,IAAI,CAAC,OAAO,GAAG;UACb,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;OAC9B,CAAC;MAEF,IAAI,CAAC,MAAM,GAAG,UAAU,IAAI;UAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;OAC1B,CAAC;EACJ,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG;;MAEtC,IAAI,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;MAC/D,IAAI,cAAc,IAAI,cAAc,CAAC,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE;UAC1E,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;OACvC;MAED,IAAI,CAAC,eAAe,EAAE,CAAC;MACvB,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;MAEvD,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;MAC3D,IAAI,OAAO,WAAW,KAAK,WAAW,IAAI,WAAW;UACnD,WAAW,CAAC,gBAAgB,CAC1B,YAAY,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;;MAGxD,IAAI,YAAY,GAAG,EAAE,CAAC;MAEtB,YAAY,CAAC,IAAI,GAAG;UAClB,WAAW,CAAC,IAAI,EAAE,CAAC;UAEnB,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;UAChD,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;UAC1B,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;OACrC,CAAC;MAEF,YAAY,CAAC,KAAK,GAAG;UACnB,WAAW,CAAC,KAAK,EAAE,CAAC;OACrB,CAAC;MAEF,YAAY,CAAC,IAAI,GAAG;UAClB,WAAW,CAAC,IAAI,EAAE,CAAC;OACpB,CAAC;MAEF,YAAY,CAAC,IAAI,GAAG,UAAU,UAAU;UACtC,WAAW,CAAC,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;UAC/D,WAAW,CAAC,IAAI,EAAE,CAAC;OACpB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAEb,YAAY,CAAC,aAAa,GAAG,UAAU,UAAU;UAC/C,IAAI,CAAC,UAAU,EAAE;cACf,QAAQ,WAAW,CAAC,GAAG,KAAK,IAAI,IAAI,WAAW,CAAC,GAAG,KAAK,EAAE,EAAE;WAC7D;eAAM;cACL,QAAQ,WAAW,CAAC,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;WAC1E;OACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAEb,YAAY,CAAC,mBAAmB,GAAG;UACjC,OAAO,WAAW,CAAC,WAAW,CAAC;OAChC,CAAC;MAEF,YAAY,CAAC,gBAAgB,GAAG;UAC9B,OAAO,WAAW,CAAC,QAAQ,CAAC;OAC7B,CAAC;MAEF,YAAY,CAAC,aAAa,GAAG;;UAE3B,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;UAC9D,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;UAChE,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;;UAGtE,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;cAC9C,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC;UAClE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS;cACjD,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,UAAU,CAAC,CAAC;OACtE,CAAC;MAEF,YAAY,CAAC,wBAAwB,GAAG;;UAEtC,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;UAC3B,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;OACjG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAEb,YAAY,CAAC,qBAAqB,GAAG;UACnC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;OAC3F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAEb,YAAY,CAAC,aAAa,GAAG,UAAU,OAAO,EAAE,IAAI;UAClD,IAAI,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;UACtD,IAAI,iBAAiB,KAAK,IAAI,EAAE;cAC9B,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;cAC3B,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAC;WACvC;eAAM;cACL,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;WAChC;OACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAEb,YAAY,CAAC,SAAS,GAAG,UAAU,oBAAoB;UACrD,IAAI,WAAW,EAAE;cACf,WAAW,CAAC,MAAM,GAAG,oBAAoB,GAAG,kBAAkB;kBAC5D,oBAAoB,GAAG,kBAAkB,GAAG,CAAC,CAAC;WACjD;UAED,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;UAClD,IAAI,OAAO,CAAC,KAAK,WAAW,IAAI,CAAC,EAAE;cACjC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAC;cAC7C,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,oBAAoB,GAAG,IAAI,CAAC;WAClD;OACF,CAAC;MAEF,YAAY,CAAC,IAAI,GAAG;UAClB,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;OAC1B,CAAC;MAEF,YAAY,CAAC,MAAM,GAAG;UACpB,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC;OAC3B,CAAC;MAEF,YAAY,CAAC,OAAO,GAAG;UACrB,IAAI,WAAW;cACb,OAAO,WAAW,CAAC,KAAK,CAAC;OAC5B,CAAC;MAEF,YAAY,CAAC,MAAM,GAAG,UAAU,IAAI;UAClC,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC;OAChC,CAAC;MAEF,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;MAE3C,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,GAAG,kBAAkB,CAAC,CAAC;MAElE,IAAI,CAAC,oBAAoB,EAAE,CAAC;MAE5B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;MAE7B,IAAI,IAAI,CAAC,gBAAgB,GAAG,CAAC,EAAE;UAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;UAC1B,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;OAC3B;EACH,CAAC,CAAC;EAEF;;;;EAIA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG;;MAEvC,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAC1C,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,kBAAkB,EACvD,UAAU,KAAK;UACb,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;UAC3E,IAAI,CAAC,OAAO,EAAE;cACZ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;cACtB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;cAC3B,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;cACnC,OAAO;WACR;UAED,IAAI,KAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;UACtC,IAAI,CAAC,KAAK,EAAE;cACV,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;cACtB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;cAC3B,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;cACnC,OAAO;WACR;UAED,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;UAE7B,IAAI,IAAI,CAAC,SAAS,EAAE;cAClB,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU;kBAC7C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;WACtC;eAAM;cACL,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;WAC5B;UAED,IAAI,KAAK,CAAC,WAAW,IAAI,YAAY,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO,EAAE;cAC1F,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;WACpC;UAED,IAAI,CAAC,eAAe,EAAE,CAAC;UACvB,IAAI,CAAC,eAAe,EAAE,CAAC;UAEvB,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;OACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;MAEF,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAC1C,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,gBAAgB,EACrD,UAAU,KAAK;UACb,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;OACrC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;MAEF,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAC1C,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,iBAAiB,EACtD;UACE,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;cAC9B,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;WAC5B;eAAM,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO,EAAE;;;;cAIpD,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;WAC3B;OACF,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;MAEF,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAC1C,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,gBAAgB,EACrD;UACE,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;cAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;WAC3B;eAAM;cACL,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;WAC7B;OACF,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;MAEF,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAC1C,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,oBAAoB,EACzD;UACE,IAAI,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,kBAAkB,CAAC;UACnE,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;UAClD,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;UAClC,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;OACvC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;MAEF,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAC1C,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,wBAAwB,EAC7D,UAAU,KAAK;UACb,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;OAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;MAEF,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAC1C,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,sBAAsB,EAC3D,UAAU,KAAK;UACb,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;OAC1C,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;MAEF,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAC1C,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,+BAA+B,EACpE,UAAU,KAAK;UACb,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;OACjD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;MAEF,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAC1C,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,qBAAqB,EAC1D,UAAU,KAAK;UACb,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;OACxC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;MAEF,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAC1C,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,2BAA2B,EAChE,UAAU,KAAK;UACb,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;UAC3C,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC;OACtC,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;;;;MAKF,IAAI,YAAY,GAAG,EAAE,CAAC;MAEtB,YAAY,CAAC,IAAI,GAAG;UAClB,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;cAC9B,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC;WAC3C;UAED,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;UAChD,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;UACtB,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;UAC3D,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;OACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAEb,YAAY,CAAC,KAAK,GAAG;UACnB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;cAC/B,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC;WAC3C;OACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAEb,YAAY,CAAC,IAAI,GAAG;UAClB,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;OACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;MAGb,YAAY,CAAC,IAAI,GAAG,UAAU,UAAU;UACtC,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;UAEpE,IAAI,SAAS,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;UAC3G,SAAS,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;UAC7D,SAAS,CAAC,QAAQ,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;UACjE,SAAS,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;UACnE,SAAS,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC;UACzE,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;kBAC3B,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC;eACnE,CAAC,CAAC;UAEH,IAAI,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;UAC3D,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC;UAE5C,IAAI,UAAU,EAAE;;cAEd,SAAS,CAAC,UAAU,GAAG,cAAc,CAAC;cACtC,SAAS,CAAC,MAAM,GAAG,UAAU,CAAC;WAC/B;eAAM,IAAI,WAAW,EAAE;;cAEtB,SAAS,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;;;;;cAMzD,IAAI,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;;cAE7B,WAAW,GAAG,WAAW,GAAG,IAAI,CAAC;cACjC,IAAI,wBAAwB,GAAG,WAAW,CAAC;;cAG3C,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;;cAExB,SAAS,CAAC,iBAAiB,GAAG,WAAW,CAAC;cAC1C,SAAS,CAAC,QAAQ,CAAC,wBAAwB,GAAG,wBAAwB,CAAC;;cAEvE,SAAS,CAAC,QAAQ,CAAC,uBAAuB,GAAG,CAAC,CAAC;cAC/C,SAAS,CAAC,QAAQ,CAAC,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC;cAEhF,IAAI,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;cACtD,OAAO,CAAC,SAAS,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;cACtD,OAAO,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;cACjC,OAAO,CAAC,SAAS,CAAC,IAAI,GAAG,uBAAuB,CAAC;WAClD;;UAGD,IAAI,CAAC,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,uBAAuB,IAAI,YAAY,CAAC,MAAM,EAAE;cACxF,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC;WAC1B;eAAM;cACL,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;WACzB;UAED,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAClF;cACE,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;WACpC,CAAC,IAAI,CAAC,IAAI,CAAC,EACZ,UAAU,SAAS;cACjB,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;cACrC,OAAO,CAAC,GAAG,CAAC,2BAA2B;kBACrC,UAAU,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;cACzC,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;WACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;OACjB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAEb,YAAY,CAAC,aAAa,GAAG,UAAU,UAAU;UAC/C,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;UAC3E,IAAI,CAAC,OAAO;cAAE,OAAO,KAAK,CAAC;UAE3B,IAAI,KAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;UACtC,IAAI,CAAC,KAAK;cAAE,OAAO,KAAK,CAAC;UAEzB,IAAI,KAAK,CAAC,WAAW,IAAI,YAAY,CAAC,IAAI,EAAE;cAC1C,OAAO,KAAK,CAAC;WACd;;UAGD,OAAO,IAAI,CAAC;OACb,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;;;;MAMb,YAAY,CAAC,mBAAmB,GAAG;UACjC,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ;cAC/C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,EAAE;cACjD,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;WACxF;eAAM;;cAEL,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;WACtC;OACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;;;;MAMb,YAAY,CAAC,gBAAgB,GAAG;UAC9B,IAAI,IAAI,CAAC,aAAa,EAAE;;cAEtB,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,SAAS;kBACtC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,IAAI,SAAS;kBACpD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,IAAI,SAAS,EAAE;kBAC9D,OAAO,IAAI,CAAC;eACb;cAED,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC;WAChD;eAAM;cACL,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;WACnC;OACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAEb,YAAY,CAAC,aAAa,GAAG;UAC3B,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;UAC/E,IAAI,WAAW,IAAI,WAAW,CAAC,eAAe,EAAE,IAAI,WAAW,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE;cACvF,IAAI,KAAK,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;cAC1C,IAAI,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;;cAG5B,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;cAChD,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM;kBACjD,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;kBACtC,EAAE,CAAC,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;eAC3C;;cAGD,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;cAC/D,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;cACjE,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;cAEvE,IAAI,UAAU,GAAG,EAAE,CAAC;cACpB,IAAI,iBAAiB,GAAG,EAAE,CAAC;cAC3B,IAAI,aAAa,GAAG,EAAE,CAAC;cAEvB,IAAI,SAAS,CAAC,QAAQ,EAAE;kBACtB,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;kBACtC,iBAAiB,GAAG,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC;;kBAEpD,UAAU,GAAG,iBAAiB,GAAG,UAAU,GAAG,IAAI,GAAG,iBAAiB,GAAG,UAAU,CAAC;;kBAEpF,UAAU,GAAG,CAAC,UAAU,IAAI,UAAU,GAAG,GAAG,GAAG,EAAE,CAAC;kBAClD,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;kBAC5C,aAAa,GAAG,CAAC,aAAa,IAAI,aAAa,GAAG,GAAG,GAAG,EAAE,CAAC;eAC5D;cAED,IAAI,SAAS,EAAE;kBACb,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;sBAC9C,CAAC,WAAW,GAAG,eAAe,GAAG,eAAe,IAAI,KAAK,CAAC,WAAW,GAAG,gBAAgB,CAAC;;kBAG3F,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS,IAAI,WAAW,GAAG,cAAc,GAAG,cAAc,CAAC,CAAC;kBACnG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC;eAC1D;mBAAM;kBACL,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;sBAC9C,UAAU,GAAG,KAAK,CAAC,WAAW,GAAG,MAAM;0BACvC,WAAW,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC;;kBAG3C,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC;kBAC9D,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS,GAAG,aAAa,CAAC;eACrE;;cAGD,IAAI,SAAS,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE;kBAC7D,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;kBAEjD,IAAI,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;kBAC/D,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;;;kBAIvC,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,qBAAqB,CAAC,EAAE;sBACvH,cAAc,CAAC,GAAG,GAAG,sCAAsC,CAAC;mBAC7D;uBAAM;sBACL,cAAc,CAAC,GAAG,GAAG,wCAAwC,CAAC;mBAC/D;eACF;mBAAM;kBACL,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;eAClE;WACF;eAAM;;cAEL,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;cAC9D,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;cAChE,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;;cAGtE,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC;cACtD,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC;WAC1D;OACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAEb,YAAY,CAAC,wBAAwB,GAAG;UACtC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC,CAAC;OACpH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAEb,YAAY,CAAC,qBAAqB,GAAG;UACnC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC,CAAC;OAC9G,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAEb,YAAY,CAAC,aAAa,GAAG,UAAU,OAAO,EAAE,IAAI;UAClD,IAAI,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;UAEtD,IAAI,IAAI,CAAC,aAAa,EAAE;cACtB,IAAI,iBAAiB,IAAI,IAAI,EAAE;kBAC7B,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;kBAC/B,OAAO;eACR;;cAGD,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,wBAAwB,KAAK,SAAS,EAAE;kBAC7F,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;kBAC/B,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;eACtG;mBAAM;;kBAEL,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;kBAC/B,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAC;eACvC;WACF;eAAM;cACL,IAAI,iBAAiB,KAAK,IAAI,EAAE;kBAC9B,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;kBAC/B,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAC;eACvC;mBAAM;kBACL,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;eAChC;WACF;OACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAEb,YAAY,CAAC,SAAS,GAAG,UAAU,oBAAoB;UACrD,IAAI,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;UAClD,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;UAClD,IAAI,oBAAoB,GAAG,kBAAkB,EAAE;cAC7C,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAC;cAC7C,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,oBAAoB,GAAG,IAAI,CAAC;cACjD,aAAa,GAAG,oBAAoB,GAAG,kBAAkB,CAAC;WAC3D;eAAM;cACL,aAAa,GAAG,CAAC,CAAC;WACnB;UACD,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,aAAa,CAAC;UAC9C,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,CAAC;OAC9C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAEb,YAAY,CAAC,IAAI,GAAG;UAClB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;cAC9B,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,CAAC;WAC5C;OACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAEb,YAAY,CAAC,MAAM,GAAG;UACpB,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;cAC7B,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,CAAC;WAC5C;OACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAEb,YAAY,CAAC,OAAO,GAAG;UACrB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;OAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAEb,YAAY,CAAC,MAAM,GAAG,UAAU,IAAI;UAClC,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC;UACrC,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;OACpC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;MAEb,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;;MAG3C,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;UAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;OAC3B;MACD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;;MAElD,IAAI,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,kBAAkB,CAAC;MACvE,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;MAClD,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,aAAa,GAAG,IAAI,CAAC;MACtC,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC;;MAG1C,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;MAE7D,IAAI,CAAC,oBAAoB,EAAE,CAAC;;;MAI5B,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC,eAAe,EAAE;UAChF,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,eAAe,EAAE;UAC7C,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;UAChC,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;;;UAInC,IAAI,CAAC,eAAe,EAAE,CAAC;UACvB,IAAI,CAAC,eAAe,EAAE,CAAC;OACxB;WAAM;UACL,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;OAC3B;EACH,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG;MAC1C,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;MAC3D,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC;MAEhD,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;EACrC,CAAC,CAAC;EAEF;;;;EAIA,UAAU,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,UAAU;MACrD,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,UAAU,CAAC,CAAC;MAEnD,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC;;MAEpC,IAAI,CAAC,aAAa,CAAC,gBAAgB,GAAG,SAAS,CAAC;;MAGhD,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;MAChD,EAAE,CAAC,GAAG,GAAG,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;;MAGrE,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;MACvD,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;MAC5B,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;MACnD,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;MAE7B,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;MACjE,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;MACvE,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,kBAAkB,CAAC;MACjD,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;;MAGvC,IAAI,CAAC,iBAAiB,EAAE,CAAC;MACzB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;MAC1B,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;MAC5E,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;MAEzE,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;MACrC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;EAC5B,CAAC,CAAC;EAEF;;;;EAIA,UAAU,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,KAAK;MAC9C,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;UAC9H,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;UACpC,OAAO;OACR;MAED,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;UACjD,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAA;UAClD,OAAO;OACR;MAED,IAAI,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;MAC3C,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;MACvD,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;MACnD,IAAI,QAAQ,GAAG,CAAC,CAAC;MACjB,IAAI,EAAE,GAAG,CAAC,CAAC;MACX,IAAI,EAAE,GAAG,CAAC,CAAC;MACX,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,IAAI,oBAAoB,EAAE;UAClD,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,GAAG,QAAQ;cACvE,kBAAkB,EAAE,EAAE,CAAC,CAAC;UAC1B,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC;UAClD,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC;OACpD;WAAM;UACL,QAAQ,GAAG,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,GAAG,kBAAkB,EAAE,EAAE,CAAC,CAAC;UAC5E,EAAE,GAAG,QAAQ,CAAC;UACd,EAAE,GAAG,QAAQ,CAAC;OACf;MAED,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO;UAC3C,IAAI,CAAC,WAAW,KAAK,YAAY,CAAC,MAAM,EAAE;UAC1C,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;UACjC,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC;UACjC,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC;OACjC;MAED,IAAI,IAAI,CAAC,aAAa,EAAE;UACtB,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;OAC7D;MAED,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;EACtC,CAAC,CAAC;EAEF;;;;EAIA,UAAU,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,UAAU;MACnD,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;MAClD,IAAI,GAAG,GAAG,CAAC,CAAC;MACZ,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,KAAK,gBAAgB,EAAE;UACpD,GAAG,GAAG,kBAAkB,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;OAC7D;WAAM;UACL,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;OACvE;MACD,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;EACpC,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG;MACxC,IAAI,CAAC,iBAAiB,EAAE,CAAC;;MAGzB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,yBAAyB,EAAE,UAAU,CAAC,CAAC;EACvE,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG;MACvC,IAAI,IAAI,CAAC,KAAK,EAAE;UACd,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;UAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;OACnB;EACH,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG;;MAExC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC;MACjE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;MAE3D,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;MAE3C,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,IAAI,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE;UAClG,IAAI,CAAC,aAAa,CAAC,wBAAwB,EAAE,CAAC;UAC9C,IAAI,CAAC,wBAAwB,EAAE,CAAC;OACjC;WAAM,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE;UACjC,IAAI,CAAC,WAAW,EAAE,CAAC;OACpB;EACH,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,wBAAwB,GAAG;MAC9C,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;MACtD,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;;MAGvD,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;UAC9B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;cACvB,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;WAClE;UAED,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;UAEhC,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;UAC3C,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;cAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;WAC7B;UAED,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;UAE1B,IAAI,iBAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;UACjE,IAAI,iBAAe,IAAI,iBAAe,CAAC,KAAK,IAAI,iBAAe,CAAC,KAAK,CAAC,KAAK;cACzE,iBAAe,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;UAEtC,IAAI,oBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;UACvE,IAAI,oBAAkB,IAAI,oBAAkB,CAAC,KAAK,IAAI,oBAAkB,CAAC,KAAK,CAAC,KAAK;cAClF,oBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;UAEzC,OAAO;OACR;WAAM;UACL,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;OACvB;MAED,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE;UAChD,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;OACjC;;;MAID,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;MACrF,IAAI,EAAE,GAAG,kBAAkB,EAAE;UAC3B,EAAE,GAAG,kBAAkB,CAAC;OACzB;WAAM,IAAI,EAAE,GAAG,CAAC,EAAE;UACjB,EAAE,GAAG,CAAC,CAAC;OACR;MAED,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC;MACpC,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC;MAEhC,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;MACjE,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;MACvE,IAAI,IAAI,CAAC,aAAa,EAAE;UACtB,IAAI,IAAI,CAAC,iBAAiB,EAAE;;cAE1B,IAAI,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;kBAC/G,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;cAClD,IAAI,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,qBAAqB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;cAChG,IAAI,aAAa,GAAG,kBAAkB,EAAE;kBACtC,aAAa,GAAG,kBAAkB,CAAC;eACpC;mBAAM,IAAI,aAAa,GAAG,CAAC,EAAE;kBAC5B,aAAa,GAAG,CAAC,CAAC;eACnB;cACD,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,aAAa,GAAG,IAAI,CAAC;cAEnD,IAAI,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;kBACnH,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;cAClD,IAAI,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,uBAAuB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;cACpG,IAAI,eAAe,GAAG,kBAAkB,EAAE;kBACxC,eAAe,GAAG,kBAAkB,CAAC;eACtC;mBAAM,IAAI,eAAe,GAAG,CAAC,EAAE;kBAC9B,eAAe,GAAG,CAAC,CAAC;eACrB;cACD,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,eAAe,GAAG,IAAI,CAAC;WACzD;eAAM;;cAEL,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;cACpC,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,kBAAkB,GAAG,IAAI,CAAC;WAC5D;OACF;WAAM;;UAEL,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,kBAAkB,GAAG,IAAI,CAAC;UACxD,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;OACxC;MAED,IAAI,EAAE,IAAI,kBAAkB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;UACnD,IAAI,CAAC,WAAW,EAAE,CAAC;OACpB;EACH,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,WAAW,GAAG;MACjC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;MAC1B,IAAI,CAAC,iBAAiB,EAAE,CAAC;MACzB,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;MACrC,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;MAEnC,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;MAC3C,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO;UACpC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;MAE/B,IAAI,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;MAC7C,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO;UAC7C,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;EACjC,CAAC,CAAC;EAEF;;;;EAIA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,SAAS;MAC3D,IAAI,SAAS,IAAI,SAAS,IAAI,SAAS,IAAI,IAAI,EAAE;UAC/C,OAAO,IAAI,CAAC;OACb;MAED,IAAI,UAAU,GAAG,KAAK,CAAC;MACvB,IAAI,SAAS,GAAG,CAAC,EAAE;UACjB,UAAU,GAAG,IAAI,CAAC;UAClB,SAAS,IAAI,CAAC,CAAC,CAAC;OACjB;MAED,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;MACzC,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;MAC5D,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;MAEtE,IAAI,KAAK,GAAG,EAAE;UAAE,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC;MACpC,IAAI,OAAO,GAAG,EAAE;UAAE,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;MAC1C,IAAI,OAAO,GAAG,EAAE;UAAE,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;MAE1C,OAAO,CAAC,UAAU,GAAG,GAAG,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;EACzE,CAAC,CAAC;EAEF;;;;EAIA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,SAAS;MAC3D,IAAI,CAAC,SAAS;UAAE,OAAO,SAAS,CAAC;MAEjC,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;MACtC,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;MAC5B,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;MAChC,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;MAChC,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;MACrC,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;;MAEnB,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;MAC3B,OAAO,GAAG,CAAC,GAAG,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;MACpC,OAAO,GAAG,CAAC,GAAG,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;MACpC,IAAI,SAAS,GAAG,KAAK,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC;MACnE,OAAO,SAAS,CAAC;EACnB,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,eAAe,GAAG;MACrC,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;MAC/E,IAAI,CAAC,WAAW;UAAE,OAAO;MAEzB,IAAI,KAAK,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;MAC1C,IAAI,CAAC,KAAK;UAAE,OAAO;MAEnB,IAAI,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;MAC5B,IAAI,CAAC,SAAS;UAAE,OAAO;MAEvB,IAAI,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;MAC9B,IAAI,eAAe,GAAG,SAAS,CAAC,QAAQ,CAAC;MAEzC,IAAI,CAAC,MAAM,EAAE;UACX,OAAO;OACR;MAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;UACtC,IAAI,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;;;UAIxB,IAAI,OAAO,CAAC,QAAQ,GAAG,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE;cAC5D,SAAS;WACV;;UAGD,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE;cACrD,IAAI,GAAG,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAA;cAC7C,GAAG,CAAC,SAAS,IAAI,8BAA8B,GAAG,OAAO,CAAC,QAAQ;kBAChE,wBAAwB;kBACxB,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,GAAG,YAAY,CAAC;WAC7E;OACF;EACH,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,eAAe,GAAG;MACrC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,UAAU,QAAQ;UAC/D,QAAQ,CAAC,MAAM,EAAE,CAAC;OACnB,CAAC,CAAC;EACL,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,QAAQ,EAAE,eAAe;;MAE3E,IAAI,QAAQ,IAAI,CAAC,CAAC,EAAE;UAClB,OAAO,kBAAkB,CAAC;OAC3B;;;MAID,IAAI,QAAQ,GAAG,eAAe,EAAE;UAC9B,OAAO,kBAAkB,CAAC;OAC3B;;MAGD,OAAO,CAAC,kBAAkB,GAAG,QAAQ,IAAI,eAAe,CAAC;EAC3D,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG;;MAE1C,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;MAC3C,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;UAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;EAChC,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,cAAc,GAAG,UAAU,cAAc;MAC5D,IAAI,CAAC,iBAAiB,CAAC,CAAC,cAAc,CAAC,CAAC;EAC1C,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,sBAAsB,GAAG,UAAU,aAAa;MACnE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;EACrC,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,6BAA6B,GAAG,UAAU,oBAAoB;MACjF,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;;MAG3C,IAAI,IAAI,CAAC,aAAa,IAAI,SAAS,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE;;UAE7D,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;cAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;OAC/B;;WAEI,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,oBAAoB,IAAI,IAAI,CAAC,aAAa,EAAE;;UAEvF,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;cAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;OAChC;;WAEI;;UAEH,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;cAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;OAC/B;EACH,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG;MAC5B,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,CAAC;EACvC,CAAC,CAAA;EAED;;;EAGA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,UAAU,MAAM;MACvD,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;MACnD,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;MACvE,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;MAEjE,IAAI,MAAM,EAAE;;UAEV,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,qDAAqD,CAAC;UACvF,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;UAClC,eAAe,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;UACzC,kBAAkB,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;UAC5C,kBAAkB,CAAC,SAAS,GAAG,IAAI,CAAC;;UAGpC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;UAC3D,eAAe,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;UAClE,kBAAkB,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;OACxE;WAAM;;UAEL,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,mDAAmD,CAAC;UACrF,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;UAClC,eAAe,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;UACzC,kBAAkB,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;UAC5C,kBAAkB,CAAC,SAAS,GAAG,KAAK,CAAC;;UAGrC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;UAC9D,eAAe,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;UACrE,kBAAkB,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;OAC3E;EACH,CAAC,CAAA;EAED;;;EAGA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG;;MAEvC,IAAI,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;MACvD,IAAI,aAAa,GACf,OAAO,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAAC;MAErE,IAAI,aAAa,EAAE;;UAEjB,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;UAC5B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;OACrC;EACH,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG;;MAEtC,IAAI,aAAa,GACf,QAAQ,CAAC,kBAAkB,CAAC,IAAI,QAAQ,CAAC,wBAAwB,CAAC,CAAC;MAErE,IAAI,aAAa,EAAE;UACjB,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;OAC9B;EACH,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,uBAAuB,GAAG;MAC7C,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;EACrC,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG;MAC1C,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;MACrE,IAAI,mBAAmB,GAAG,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;MAEzE,IAAI,IAAI,CAAC,UAAU,EAAE;UACnB,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO;cACjF,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;UAE3C,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO;cACvF,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;OAC/C;WAAM;UACL,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO;cACjF,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;UAE5C,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO;cACvF,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;OAC9C;EACH,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG;MAC1C,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;MACrE,IAAI,mBAAmB,GAAG,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;MAEzE,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO;UAC/E,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;MAE7C,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO;UACrF,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;EACjD,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG;MACtC,IAAI,aAAa,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;MAC7D,IAAI,aAAa,IAAI,aAAa,CAAC,KAAK,IAAI,aAAa,CAAC,OAAO;UAC/D,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;EACtC,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG;MACtC,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE;UAC/B,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;UACvD,IAAI,OAAO,IAAI,OAAO,CAAC,iBAAiB,EAAE,EAAE;;cAE1C,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;WAC9D;eAAM;cACL,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;WAC5D;OACF;EACH,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG;MACtC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE;UACjC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;UACtD,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;UAC5D,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;UAC5D,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;OAC9D;EACH,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG;MACtC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;MACtD,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;MAC5D,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;MAC5D,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;EAC/D,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG;MACvC,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC;MAC/E,IAAI,yBAAyB,GAAG,cAAc,GAAG,iBAAiB,CAAC;MACnE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,MAAM;UACpD,yBAAyB,GAAG,IAAI,CAAC;MACnC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;MAC5D,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;EAC9D,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,YAAY,GAAG;;MAElC,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;UACvD,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;cAC9C,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;UAEjC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS;cACjD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,UAAU,CAAC,CAAC;OAC1D;MAED,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,gBAAgB,CACzD,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;MACnC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB,CAClD,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;MACnC,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,gBAAgB,CAC5D,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;MACrC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAC9C,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;MACnC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB,CAClD,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;MAC7D,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,gBAAgB,CACnD,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;MAC/D,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB,CAClD,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;MACjD,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB,CAClD,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;MACjD,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB,CACxD,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;MACjD,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB,CACxD,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;MACjD,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB,CACxD,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;MACtC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB,CACxD,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;MACtC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB,CAClD,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;MAChD,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB,CAClD,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;MAEhD,IAAI,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;MACvD,IAAI,OAAO,UAAU,KAAK,WAAW,IAAI,UAAU,EAAE;UACnD,UAAU,CAAC,gBAAgB,CACzB,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;UACjD,UAAU,CAAC,gBAAgB,CACzB,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;OACjD;MAED,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,gBAAgB,CACvD,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;MACjD,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,gBAAgB,CACvD,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;MAChD,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,gBAAgB,CAC3D,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;MAC9C,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,gBAAgB,CAC7D,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;MAC7C,QAAQ,CAAC,gBAAgB,CACvB,kBAAkB,EAAE,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;MACtE,QAAQ,CAAC,gBAAgB,CACvB,wBAAwB,EAAE,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;;MAG5E,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAC9C,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;MAC7D,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,gBAAgB,CAC/C,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;MAE9D,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;;MAG/D,IAAI,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;MAChD,SAAS,CAAC,OAAO,GAAG;UAClB,WAAW,GAAG,KAAK,CAAC;UACpB,UAAU,GAAG,KAAK,CAAC;UACnB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;OAC3C,CAAA;MACD,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;MAC9C,QAAQ,CAAC,OAAO,GAAG;UACjB,WAAW,GAAG,KAAK,CAAC;UACpB,UAAU,GAAG,IAAI,CAAC;UAClB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;OACtC,CAAA;MACD,IAAI,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;MAChD,SAAS,CAAC,OAAO,GAAG;UAClB,WAAW,GAAG,IAAI,CAAC;UACnB,UAAU,GAAG,KAAK,CAAC;UACnB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;OACtC,CAAA;MAED,IAAI,UAAU,EAAE;UACd,IAAI,WAAW,EAAE;cACf,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;WAC3E;UACD,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;UACxB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;OAChC;WAAM,IAAI,WAAW,EAAE;UACtB,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;UACzB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;OAChC;WAAM;UACL,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;UACzB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;OACxC;EACH,CAAC,CAAC;EAEF;;;EAGA,UAAU,CAAC,SAAS,CAAC,cAAc,GAAG;MACpC,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;UACpH,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;UAC/D,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;UAC7C,IAAI,MAAM,GAAG,IAAI,CAAC;UAClB,IAAI,SAAS,GAAG,IAAI,CAAC;UACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;cAClD,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;cACvC,SAAS,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC;cAChC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;cACrC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;cACtC,MAAM,CAAC,SAAS;kBACd,YAAY,GAAG,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;sBACjE,sBAAsB,CAAC;cACzB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;cACjE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;WACxB;OACF;EACH,CAAC,CAAC;EAEF;;;;;EAKA,UAAU,CAAC,eAAe,GAAG,UAAU,KAAK;MAC1C,QAAQ,KAAK,CAAC,IAAI;UAChB,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB;cAC5C,OAAO,6BAA6B;mBACjC,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;UACxD,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM;cAC/B,OAAO,wCAAwC;mBAC5C,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;UACxD,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa;cACtC,OAAO,6CAA6C;mBACjD,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;UACxD,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB;cAC1C,OAAO,sCAAsC;mBAC1C,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;UACxD,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB;cAC1C,OAAO,iDAAiD;mBACrD,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;UACxD,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB;cAC7C,OAAO,sDAAsD;mBAC1D,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;UACxD,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa;cACtC,OAAO,2DAA2D;mBAC/D,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;UACxD,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO;cAChC,OAAO,0BAA0B;mBAC9B,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;UACxD;cACE,OAAO,KAAK,CAAC;OAChB;EACH,CAAC,CAAC;EAEF,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;EAClC,MAAM,CAAC,uBAAuB,CAAC,GAAG,UAAU,WAAW;MACrD,IAAI,WAAW,EAAE;UACf,UAAU,CAAC,oBAAoB,EAAE,CAAC;OACnC;EACH,CAAC,CAAC;EAEF,MAAM,CAAC,UAAU,GAAG,UAAU;;EC1pD9B;;;;;;;;;;;;;;EAcA;EAEA,IAAI,aAAa,GAAG,UAAS,CAAC,EAAE,CAAC;MAC7B,aAAa,GAAG,MAAM,CAAC,cAAc;WAChC,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,KAAK,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;UAC5E,UAAU,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;cAAE,IAAI,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;kBAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;MAC/E,OAAO,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;EAC/B,CAAC,CAAC;WAEc,SAAS,CAAC,CAAC,EAAE,CAAC;MAC1B,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;MACpB,SAAS,EAAE,KAAK,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE;MACvC,CAAC,CAAC,SAAS,GAAG,CAAC,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;EACzF,CAAC;EAEM,IAAI,QAAQ,GAAG;MAClB,QAAQ,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,QAAQ,CAAC,CAAC;UAC3C,KAAK,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;cACjD,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;cACjB,KAAK,IAAI,CAAC,IAAI,CAAC;kBAAE,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;sBAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;WAChF;UACD,OAAO,CAAC,CAAC;OACZ,CAAA;MACD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;EAC3C,CAAC,CAAA;WAEe,MAAM,CAAC,CAAC,EAAE,CAAC;MACvB,IAAI,CAAC,GAAG,EAAE,CAAC;MACX,KAAK,IAAI,CAAC,IAAI,CAAC;UAAE,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;cAC/E,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;MAChB,IAAI,CAAC,IAAI,IAAI,IAAI,OAAO,MAAM,CAAC,qBAAqB,KAAK,UAAU;UAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;cACpE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;kBAC1E,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;WACzB;MACL,OAAO,CAAC,CAAC;EACb,CAAC;WAEe,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI;MACpD,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;MAC7H,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU;UAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;;UAC1H,KAAK,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;cAAE,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;kBAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;MAClJ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;EAClE,CAAC;WAEe,OAAO,CAAC,UAAU,EAAE,SAAS;MACzC,OAAO,UAAU,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,EAAE,CAAA;EACzE,CAAC;WAEe,UAAU,CAAC,WAAW,EAAE,aAAa;MACjD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU;UAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;EACnI,CAAC;WAEe,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS;MACvD,SAAS,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,YAAY,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,UAAU,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;MAC5G,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,EAAE,UAAU,OAAO,EAAE,MAAM;UACrD,SAAS,SAAS,CAAC,KAAK,IAAI,IAAI;cAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;WAAE;UAAC,OAAO,CAAC,EAAE;cAAE,MAAM,CAAC,CAAC,CAAC,CAAC;WAAE,EAAE;UAC3F,SAAS,QAAQ,CAAC,KAAK,IAAI,IAAI;cAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;WAAE;UAAC,OAAO,CAAC,EAAE;cAAE,MAAM,CAAC,CAAC,CAAC,CAAC;WAAE,EAAE;UAC9F,SAAS,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE;UAC9G,IAAI,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;OACzE,CAAC,CAAC;EACP,CAAC;WAEe,WAAW,CAAC,OAAO,EAAE,IAAI;MACrC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,cAAa,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;cAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;MACjH,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,MAAM,KAAK,UAAU,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,cAAa,OAAO,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;MACzJ,SAAS,IAAI,CAAC,CAAC,IAAI,OAAO,UAAU,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;MAClE,SAAS,IAAI,CAAC,EAAE;UACZ,IAAI,CAAC;cAAE,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC;UAC9D,OAAO,CAAC;cAAE,IAAI;kBACV,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI;sBAAE,OAAO,CAAC,CAAC;kBAC7J,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;sBAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;kBACxC,QAAQ,EAAE,CAAC,CAAC,CAAC;sBACT,KAAK,CAAC,CAAC;sBAAC,KAAK,CAAC;0BAAE,CAAC,GAAG,EAAE,CAAC;0BAAC,MAAM;sBAC9B,KAAK,CAAC;0BAAE,CAAC,CAAC,KAAK,EAAE,CAAC;0BAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;sBACxD,KAAK,CAAC;0BAAE,CAAC,CAAC,KAAK,EAAE,CAAC;0BAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;0BAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;0BAAC,SAAS;sBACjD,KAAK,CAAC;0BAAE,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;0BAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;0BAAC,SAAS;sBACjD;0BACI,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;8BAAE,CAAC,GAAG,CAAC,CAAC;8BAAC,SAAS;2BAAE;0BAC5G,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;8BAAE,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;8BAAC,MAAM;2BAAE;0BACtF,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;8BAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;8BAAC,CAAC,GAAG,EAAE,CAAC;8BAAC,MAAM;2BAAE;0BACrE,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;8BAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;8BAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;8BAAC,MAAM;2BAAE;0BACnE,IAAI,CAAC,CAAC,CAAC,CAAC;8BAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;0BACtB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;0BAAC,SAAS;mBAC9B;kBACD,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;eAC9B;cAAC,OAAO,CAAC,EAAE;kBAAE,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;kBAAC,CAAC,GAAG,CAAC,CAAC;eAAE;sBAAS;kBAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;eAAE;UAC1D,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;cAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;UAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;OACpF;EACL,CAAC;WAEe,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;MACvC,IAAI,EAAE,KAAK,SAAS;UAAE,EAAE,GAAG,CAAC,CAAC;MAC7B,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;EACjB,CAAC;WAEe,YAAY,CAAC,CAAC,EAAE,OAAO;MACnC,KAAK,IAAI,CAAC,IAAI,CAAC;UAAE,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;cAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;EAC1F,CAAC;WAEe,QAAQ,CAAC,CAAC;MACtB,IAAI,CAAC,GAAG,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;MAC9E,IAAI,CAAC;UAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;MACxB,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;UAAE,OAAO;cAC1C,IAAI,EAAE;kBACF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM;sBAAE,CAAC,GAAG,KAAK,CAAC,CAAC;kBACnC,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;eAC3C;WACJ,CAAC;MACF,MAAM,IAAI,SAAS,CAAC,CAAC,GAAG,yBAAyB,GAAG,iCAAiC,CAAC,CAAC;EAC3F,CAAC;WAEe,MAAM,CAAC,CAAC,EAAE,CAAC;MACvB,IAAI,CAAC,GAAG,OAAO,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;MAC3D,IAAI,CAAC,CAAC;UAAE,OAAO,CAAC,CAAC;MACjB,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;MACjC,IAAI;UACA,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI;cAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;OAC9E;MACD,OAAO,KAAK,EAAE;UAAE,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;OAAE;cAC/B;UACJ,IAAI;cACA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;kBAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;WACpD;kBACO;cAAE,IAAI,CAAC;kBAAE,MAAM,CAAC,CAAC,KAAK,CAAC;WAAE;OACpC;MACD,OAAO,EAAE,CAAC;EACd,CAAC;WAEe,QAAQ;MACpB,KAAK,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE;UAC9C,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;MACzC,OAAO,EAAE,CAAC;EACd,CAAC;WAEe,cAAc;MAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;UAAE,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;MACpF,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;UAC5C,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE;cAC7D,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;MACpB,OAAO,CAAC,CAAC;EACb,CAAC;EAAA,CAAC;WAEc,OAAO,CAAC,CAAC;MACrB,OAAO,IAAI,YAAY,OAAO,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;EACzE,CAAC;WAEe,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS;MAC3D,IAAI,CAAC,MAAM,CAAC,aAAa;UAAE,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;MACvF,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;MAC9D,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,cAAc,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;MACtH,SAAS,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;UAAE,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE;MAC1I,SAAS,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI;UAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;OAAE;MAAC,OAAO,CAAC,EAAE;UAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;OAAE,EAAE;MAClF,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,YAAY,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;MACxH,SAAS,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE;MAClD,SAAS,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE;MAClD,SAAS,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM;UAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;EACtF,CAAC;WAEe,gBAAgB,CAAC,CAAC;MAC9B,IAAI,CAAC,EAAE,CAAC,CAAC;MACT,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,cAAc,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;MAC5I,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;EACnJ,CAAC;WAEe,aAAa,CAAC,CAAC;MAC3B,IAAI,CAAC,MAAM,CAAC,aAAa;UAAE,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;MACvF,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;MACnC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,QAAQ,KAAK,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,cAAc,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;MACjN,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,OAAO,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE;MAChK,SAAS,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAS,CAAC,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE;EAChI,CAAC;WAEe,oBAAoB,CAAC,MAAM,EAAE,GAAG;MAC5C,IAAI,MAAM,CAAC,cAAc,EAAE;UAAE,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;OAAE;WAAM;UAAE,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;OAAE;MAC/G,OAAO,MAAM,CAAC;EAClB,CAAC;EAAA,CAAC;WAEc,YAAY,CAAC,GAAG;MAC5B,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU;UAAE,OAAO,GAAG,CAAC;MACtC,IAAI,MAAM,GAAG,EAAE,CAAC;MAChB,IAAI,GAAG,IAAI,IAAI;UAAE,KAAK,IAAI,CAAC,IAAI,GAAG;cAAE,IAAI,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;kBAAE,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;MAC/F,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC;MACrB,OAAO,MAAM,CAAC;EAClB,CAAC;WAEe,eAAe,CAAC,GAAG;MAC/B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;EAC5D,CAAC;WAEe,sBAAsB,CAAC,QAAQ,EAAE,UAAU;MACvD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;UAC3B,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;OACzE;MACD,OAAO,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;EACpC,CAAC;WAEe,sBAAsB,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK;MAC9D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;UAC3B,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;OACzE;MACD,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;MAChC,OAAO,KAAK,CAAC;EACjB;;AC9MaA,YAAe;MAI1B,yBACU,aAA4B;UAA5B,kBAAa,GAAb,aAAa,CAAe;OACjC;MAEL,kCAAQ,GAAR;UACE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;UAErB,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;UACvC,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,GAAG,UAAU,WAAoB;cACnE,IAAI,WAAW,EAAE;kBACf,aAAa,CAAC,iBAAiB,EAAE,CAAC;eACnC;WACF,CAAC;UAEF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;OACrD;MAED,qCAAW,GAAX;UACE,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;OACtC;MAED,sCAAY,GAAZ;UACE,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;OACtC;4BAEF;GA7BD,IA6BC;AA7BYA,YAAe;MAP3BC,cAAS,CAAC;UACT,QAAQ,EAAE,SAAS;UACnB,sNAAuC;;OAIxC,CAAC;KACWD,UAAe,CA6B3B;;AC/BYE,uBAAa;MASxB;UAAA,iBAIC;UAVO,WAAM,GAAQ,MAAM,CAAC;UAEtB,WAAM,GAAG;cACd,OAAO,EAAE,KAAK;WACf,CAAC;UAkBF,kBAAa,GAAG;cACd,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;WAC7C,CAAC;UAEF,YAAO,GAAG,UAAU,GAAQ;cAC1B,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;WACjD,CAAC;UAEF,oBAAe,GAAG;cAChB,IAAI,IAAI,GAAQ,KAAI,CAAC;cACrB,IAAI,IAAI,GAAG,IAAIC,YAAO,EAAE,CAAC;cACzB,KAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAC,CAAM;kBAC9B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;kBACjB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;kBACtB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;eACxB,EAAE,UAAU,GAAQ;kBACnB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;kBACvB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;sBACzB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;sBACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;mBACrB;uBAAM;sBACL,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;mBACrD;eACF,CAAC,CAAC;cACH,OAAO,IAAI,CAAC;WACb,CAAC;UAEF,sBAAiB,GAAG,UAAC,UAAiB;cACpC,IAAI,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;cACxD,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;cAC/C,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,4EAA4E,CAAC,CAAC;cACzG,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;cAE5C,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,UAAU,CAAC;WACzD,CAAC;UAEF,SAAI,GAAG;cACL,KAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;WAC9B,CAAC;UAEF,UAAK,GAAG;cACN,KAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;WAC/B,CAAC;UAEF,SAAI,GAAG;cACL,KAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;WAC9B,CAAC;UAEF,iBAAY,GAAG,UAAC,GAAQ;cACtB,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;WAC7C,CAAC;UAjEA,UAAU,CAAC,UAAU,CAAC,SAAS,GAAG;cAChC,UAAU,EAAE,EAAE;WACf,CAAC;OACH;MAED,yCAAiB,GAAjB;UAAA,iBAQC;UAPC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;UACvC,IAAI,cAAc,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;UACjG,IAAI,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EACpD,eAAS,EACT,UAAC,MAAW,IAAO,IAAI,MAAM,KAAK,KAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,CAClF,CAAC;UACF,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;OAC3E;MAAA,CAAC;MAsDF,kCAAU,GAAV,UAAW,KAAU;UACnB,UAAU,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;UACvC,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;OAC7B;MAED,iCAAS,GAAT;UACE,OAAO,IAAI,CAAC,MAAM,CAAA;OACnB;0BACF;GArFD,IAqFC;AArFYD,uBAAa;MADzBE,eAAU,EAAE;KACAF,qBAAa,CAqFzB;;AC/EYG,sBAAY;MAAzB;OAA6B;yBAAA;GAA7B,IAA6B;AAAhBA,sBAAY;MATxBC,aAAQ,CAAC;UACR,OAAO,EAAE,CAAEC,2BAAsB,CAAE;UACnC,OAAO,EAAE;cACPC,mBAAY;WACb;UACD,OAAO,EAAE,CAACR,UAAe,CAAC;UAC1B,SAAS,EAAE,CAACE,qBAAa,CAAC;UAC1B,YAAY,EAAE,CAACF,UAAe,CAAC;OAChC,CAAC;KACWK,oBAAY,CAAI;;ECfrB;;ECAR;;;;;;;;;;"} \ No newline at end of file +{"version":3,"file":"thinkam.net-ng-cast.umd.js","sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../CastVideos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n globalThis.CastPlayer.addMediaContents();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeUI();\n };\n\n play = () => { \n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n globalThis.CastPlayer.addMediaContents();\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = function () {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n this.remotePlayer = new cast.framework.RemotePlayer();\n this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer);\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n function (e) {\n this.switchPlayer(e.value);\n }.bind(this)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = function () {\n this.playerStateBeforeSwitch = this.playerState;\n\n this.stopProgressTimer();\n this.resetVolumeSlider();\n\n // Session is active\n if (cast && cast.framework && this.remotePlayer.isConnected) {\n // Pause local playback\n this.playerHandler.pause();\n this.setupRemotePlayer();\n } else {\n this.setupLocalPlayer();\n }\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n this.updateDurationDisplay = function () {\n this.target.updateDurationDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', this.onMediaLoadedLocally.bind(this));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function() {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function(mediaIndex) {\n localPlayer.src =\n this.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(this);\n\n playerTarget.getCurrentMediaTime = function() {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function() {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function(volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function() {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function() {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function() {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function(time) {\n localPlayer.currentTime = time;\n };\n\n this.playerHandler.setTarget(playerTarget);\n\n this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n this.showFullscreenButton();\n\n if (this.currentMediaTime > 0) {\n this.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n this.mediaInfo = media.media;\n\n if (this.mediaInfo) {\n this.isLiveContent = (this.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n this.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) {\n this.playerHandler.prepareToPlay();\n }\n\n this.removeAdMarkers();\n this.updateAdMarkers();\n\n this.playerHandler.updateDisplay();\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n this.enableProgressBar(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (this.remotePlayer.isPaused) {\n this.playerHandler.pause();\n } else if (this.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n this.playerHandler.play();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n } else {\n this.playerHandler.unMute();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n this.isPlayingBreak(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n this.onWhenSkippableChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n this.onCurrentBreakClipTimeChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n this.onBreakClipIdChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n this.liveSeekableRange = event.value;\n }.bind(this)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(this);\n\n playerTarget.pause = function () {\n if (!this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n }.bind(this);\n\n playerTarget.stop = function () {\n this.remotePlayerController.stop();\n }.bind(this);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n\n let mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;\n mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata();\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle'];\n mediaInfo.metadata.images = [{\n 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']\n }];\n\n let request = new chrome.cast.media.LoadRequest(mediaInfo);\n request.currentTime = this.currentMediaTime;\n\n if (ENABLE_ADS) {\n // Add sample breaks and breakClips.\n mediaInfo.breakClips = breakClipsJSON;\n mediaInfo.breaks = breaksJSON;\n } else if (ENABLE_LIVE) {\n // Change the streamType and add live specific metadata.\n mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;\n // TODO: Set the metadata on the receiver side in your implementation.\n // startAbsoluteTime and sectionStartTimeInMedia will be set for you.\n // See https://developers.google.com/cast/docs/caf_receiver/live.\n\n // TODO: Start time, is a fake timestamp. Use correct values for your implementation.\n let currentTime = new Date();\n // Convert from milliseconds to seconds.\n currentTime = currentTime / 1000;\n let sectionStartAbsoluteTime = currentTime;\n\n // Duration should be -1 for live streams.\n mediaInfo.duration = -1;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.startAbsoluteTime = currentTime;\n mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.metadata.sectionStartTimeInMedia = 0;\n mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration'];\n\n let item = new chrome.cast.media.QueueItem(mediaInfo);\n request.queueData = new chrome.cast.media.QueueData();\n request.queueData.items = [item];\n request.queueData.name = \"Sample Queue for Live\";\n }\n\n // Do not immediately start playing if the player was previously PAUSED.\n if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) {\n request.autoplay = false;\n } else {\n request.autoplay = true;\n }\n\n cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(\n function () {\n console.log('Remote media loaded');\n }.bind(this),\n function (errorCode) {\n this.playerState = PLAYER_STATE.IDLE;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n this.playerHandler.updateDisplay();\n }.bind(this));\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(this);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (this.isLiveContent && this.mediaInfo.metadata &&\n this.mediaInfo.metadata.sectionStartTimeInMedia) {\n return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return this.remotePlayer.currentTime;\n }\n }.bind(this);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (this.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (this.mediaInfo.metadata == undefined ||\n this.mediaInfo.metadata.sectionDuration == undefined ||\n this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return this.mediaInfo.metadata.sectionDuration;\n } else {\n return this.remotePlayer.duration;\n }\n }.bind(this);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n this.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(this);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime());\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration());\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n\n if (this.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = this.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n this.remotePlayer.volumeLevel = currentVolume;\n this.remotePlayerController.setVolumeLevel();\n }.bind(this);\n\n playerTarget.mute = function () {\n if (!this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.unMute = function () {\n if (this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.isMuted = function () {\n return this.remotePlayer.isMuted;\n }.bind(this);\n\n playerTarget.seekTo = function (time) {\n this.remotePlayer.currentTime = time;\n this.remotePlayerController.seek();\n }.bind(this);\n\n this.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n }\n this.enableProgressBar(this.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n this.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n this.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n this.removeAdMarkers();\n this.updateAdMarkers();\n } else {\n this.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = this.currentMediaTime;\n\n this.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n this.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n this.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n this.stopProgressTimer();\n this.currentMediaTime = 0;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n this.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (this.isLiveContent && !this.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (this.playerState === PLAYER_STATE.PLAYING ||\n this.playerState === PLAYER_STATE.PAUSED) {\n this.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (this.isLiveContent) {\n seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n this.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n this.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n this.stopProgressTimer();\n\n // Start progress timer\n this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n this.currentMediaTime = this.playerHandler.getCurrentMediaTime();\n this.mediaDuration = this.playerHandler.getMediaDuration();\n\n this.playerHandler.updateDurationDisplay();\n\n if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) {\n this.playerHandler.updateCurrentTimeDisplay();\n this.updateProgressBarByTimer();\n } else if (this.mediaDuration > 0) {\n this.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (this.mediaDuration == null) {\n if (!this.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n \n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n \n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (this.isLiveContent) {\n if (this.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) {\n this.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n this.currentMediaTime = 0;\n this.stopProgressTimer();\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n this.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n this.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (this.whenSkippable == undefined || this.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n this.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', this.seekMediaListener);\n seekable_window.addEventListener('click', this.seekMediaListener);\n progress_indicator.addEventListener('dragend', this.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', this.seekMediaListener);\n seekable_window.removeEventListener('click', this.seekMediaListener);\n progress_indicator.removeEventListener('dragend', this.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n this.fullscreen = !this.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (this.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block'; \n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!this.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = function () {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n this.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n this.mediaContents[this.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n this.mediaContents[this.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', this.seekMedia.bind(this));\n document.getElementById('progress').addEventListener(\n 'click', this.seekMedia.bind(this));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', this.seekMedia.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'click', this.playerHandler.mute.bind(this.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', this.playerHandler.unMute.bind(this.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('main_video').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('main_video').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', this.requestFullScreen.bind(this));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', this.cancelFullScreen.bind(this));\n document.addEventListener(\n 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n document.addEventListener(\n 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', this.playerHandler.play.bind(this.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', this.playerHandler.pause.bind(this.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) {\n this.mediaContents = this.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < this.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', this.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = function () {\n if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) {\n this.mediaContents = this.mediaJSON['categories'][0]['videos']; \n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["NgCastComponent","tslib_1.__decorate","Input","Component","NgCastService","Subject","Injectable","NgCastModule","NgModule","CUSTOM_ELEMENTS_SCHEMA","CommonModule"],"mappings":"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"} \ No newline at end of file diff --git a/dist/bundles/thinkam.net-ng-cast.umd.min.js b/dist/bundles/thinkam.net-ng-cast.umd.min.js index 0f2afb3..0b2d3ba 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.min.js +++ b/dist/bundles/thinkam.net-ng-cast.umd.min.js @@ -1,2 +1,16 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("@angular/common"),require("rxjs")):"function"==typeof define&&define.amd?define("@thinkam.net/ng-cast",["exports","@angular/core","@angular/common","rxjs"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).thinkam=e.thinkam||{},e.thinkam.net=e.thinkam.net||{},e.thinkam.net["ng-cast"]={}),e.ng.core,e.ng.common,e.rxjs)}(this,(function(e,t,i,n){"use strict";var a="http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/",s=!1,r=!1,o=700,l=100,d="IDLE",c="BUFFERING",u="LOADED",m="PLAYING",y="PAUSED",h=function(){this.playerHandler=new p(this),this.playerState=d,this.playerStateBeforeSwitch=null,this.remotePlayer=null,this.remotePlayerController=null,this.currentMediaTime=0,this.mediaDuration=-1,this.timer=null,this.incrementMediaTimeHandler=this.incrementMediaTime.bind(this),this.seekMediaListener=this.seekMedia.bind(this),this.currentMediaIndex=0,this.mediaContents=null,this.fullscreen=!1,this.mediaInfo=null,this.whenSkippable=null,this.liveSeekableRange=null,this.isLiveContent=!1,this.setupLocalPlayer(),this.addVideoThumbs(),this.initializeUI(),this.mediaJSON={categories:[]}};h.prototype.initializeCastPlayer=function(){var e={receiverApplicationId:"C0868879"};e.autoJoinPolicy=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,cast.framework.CastContext.getInstance().setOptions(e),this.remotePlayer=new cast.framework.RemotePlayer,this.remotePlayerController=new cast.framework.RemotePlayerController(this.remotePlayer),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,function(e){this.switchPlayer(e.value)}.bind(this))},h.prototype.switchPlayer=function(){this.playerStateBeforeSwitch=this.playerState,this.stopProgressTimer(),this.resetVolumeSlider(),cast&&cast.framework&&this.remotePlayer.isConnected?(this.playerHandler.pause(),this.setupRemotePlayer()):this.setupLocalPlayer()};var p=function(e){this.target={},this.setTarget=function(e){this.target=e},this.play=function(){e.playerState!=d&&this.target.isMediaLoaded(e.currentMediaIndex)?(e.playerState=m,this.target.play(),document.getElementById("play").style.display="none",document.getElementById("pause").style.display="block"):this.load(e.currentMediaIndex)},this.pause=function(){this.target.pause(),e.playerState=y,document.getElementById("play").style.display="block",document.getElementById("pause").style.display="none"},this.stop=function(){e.playerState=d,this.target.stop()},this.load=function(t){void 0===t&&(t=null),t||(t=e.currentMediaIndex),e.playerState=c,this.target.load(t)},this.isMediaLoaded=function(e){return this.target.isMediaLoaded(e)},this.prepareToPlay=function(){e.mediaDuration=this.getMediaDuration(),e.playerHandler.updateDurationDisplay(),e.playerState=u,this.play(),e.startProgressTimer(),this.updateDisplay()},this.getCurrentMediaTime=function(){return this.target.getCurrentMediaTime()},this.getMediaDuration=function(){return this.target.getMediaDuration()},this.updateDisplay=function(){this.currentMediaTime=this.target.getCurrentMediaTime(),this.mediaDuration=this.target.getMediaDuration(),this.target.updateDisplay()},this.updateCurrentTimeDisplay=function(){this.target.updateCurrentTimeDisplay()},this.updateDurationDisplay=function(){this.target.updateDurationDisplay()},this.setTimeString=function(e,t){this.target.setTimeString(e,t)},this.setVolume=function(e){this.target.setVolume(e)},this.mute=function(){this.target.mute(),document.getElementById("audio_on").style.display="none",document.getElementById("audio_off").style.display="block"},this.unMute=function(){this.target.unMute(),document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},this.isMuted=function(){return this.target.isMuted()},this.seekTo=function(e){this.target.seekTo(e)}};h.prototype.setupLocalPlayer=function(){var e=document.getElementById("live_indicator");e&&e.style&&e.style.display&&(e.style.display="none"),this.removeAdMarkers(),document.getElementById("skip").style.display="none";var t=document.getElementById("video_element");void 0!==t&&t&&t.addEventListener("loadeddata",this.onMediaLoadedLocally.bind(this));var i={play:function(){t.play(),document.getElementById("video_image").style.display="none",t.style.display="block"},pause:function(){t.pause()},stop:function(){t.stop()}};i.load=function(e){t.src=this.mediaContents[e].sources[0],t.load()}.bind(this),i.isMediaLoaded=function(e){return e?t.src==this.mediaContents[e].sources[0]:null!==t.src&&""!==t.src}.bind(this),i.getCurrentMediaTime=function(){return t.currentTime},i.getMediaDuration=function(){return t.duration},i.updateDisplay=function(){document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none",document.getElementById("media_title").innerHTML=g.mediaContents[g.currentMediaIndex].title,document.getElementById("media_subtitle").innerHTML=g.mediaContents[g.currentMediaIndex].subtitle},i.updateCurrentTimeDisplay=function(){this.currentMediaTime+=1,this.playerHandler.setTimeString(document.getElementById("currentTime"),this.currentMediaTime)}.bind(this),i.updateDurationDisplay=function(){this.playerHandler.setTimeString(document.getElementById("duration"),this.mediaDuration)}.bind(this),i.setTimeString=function(e,t){var i=this.getMediaTimeString(t);null!==i?(e.style.display="",e.innerHTML=i):e.style.display="none"}.bind(this),i.setVolume=function(e){t&&(t.volume=e0&&(this.playerHandler.load(),this.playerHandler.play())},h.prototype.setupRemotePlayer=function(){this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,function(e){var t=cast.framework.CastContext.getInstance().getCurrentSession();if(!t)return this.mediaInfo=null,this.isLiveContent=!1,void this.playerHandler.updateDisplay();var i=t.getMediaSession();if(!i)return this.mediaInfo=null,this.isLiveContent=!1,void this.playerHandler.updateDisplay();this.mediaInfo=i.media,this.mediaInfo?this.isLiveContent=this.mediaInfo.streamType==chrome.cast.media.StreamType.LIVE:this.isLiveContent=!1,i.playerState==m&&this.playerState!==m&&this.playerHandler.prepareToPlay(),this.removeAdMarkers(),this.updateAdMarkers(),this.playerHandler.updateDisplay()}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,function(e){this.enableProgressBar(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,function(){this.remotePlayer.isPaused?this.playerHandler.pause():this.playerState!==m&&this.playerHandler.play()}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,function(){this.remotePlayer.isMuted?this.playerHandler.mute():this.playerHandler.unMute()}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,function(){var e=this.remotePlayer.volumeLevel*l,t=document.getElementById("audio_bg_level");t.style.height=e+"px",t.style.marginTop=-e+"px"}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,function(e){this.isPlayingBreak(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,function(e){this.onWhenSkippableChanged(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,function(e){this.onCurrentBreakClipTimeChanged(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,function(e){this.onBreakClipIdChanged(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,function(e){console.log("LIVE_SEEKABLE_RANGE_CHANGED"),this.liveSeekableRange=e.value}.bind(this));var e={};e.play=function(){this.remotePlayer.isPaused&&this.remotePlayerController.playOrPause(),document.getElementById("video_image").style.display="",document.getElementById("video_element").style.display="none"}.bind(this),e.pause=function(){this.remotePlayer.isPaused||this.remotePlayerController.playOrPause()}.bind(this),e.stop=function(){this.remotePlayerController.stop()}.bind(this),e.load=function(e){console.log("Loading..."+this.mediaContents[e].title);var t=new chrome.cast.media.MediaInfo(this.mediaContents[e].sources[0],"video/mp4");t.streamType=chrome.cast.media.StreamType.BUFFERED,t.metadata=new chrome.cast.media.TvShowMediaMetadata,t.metadata.title=this.mediaContents[e].title,t.metadata.subtitle=this.mediaContents[e].subtitle,t.metadata.images=[{url:a+this.mediaContents[e].thumb}];var i=new chrome.cast.media.LoadRequest(t);if(i.currentTime=this.currentMediaTime,s)t.breakClips=breakClipsJSON,t.breaks=breaksJSON;else if(r){t.streamType=chrome.cast.media.StreamType.LIVE;var n=new Date,o=n/=1e3;t.duration=-1,t.startAbsoluteTime=n,t.metadata.sectionStartAbsoluteTime=o,t.metadata.sectionStartTimeInMedia=0,t.metadata.sectionDuration=this.mediaContents[e].duration;var l=new chrome.cast.media.QueueItem(t);i.queueData=new chrome.cast.media.QueueData,i.queueData.items=[l],i.queueData.name="Sample Queue for Live"}this.playerStateBeforeSwitch&&this.playerStateBeforeSwitch!=y?i.autoplay=!0:i.autoplay=!1,cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(i).then(function(){console.log("Remote media loaded")}.bind(this),function(e){this.playerState=d,console.log("Remote media load error: "+h.getErrorMessage(e)),this.playerHandler.updateDisplay()}.bind(this))}.bind(this),e.isMediaLoaded=function(e){var t=cast.framework.CastContext.getInstance().getCurrentSession();if(!t)return!1;var i=t.getMediaSession();return!!i&&i.playerState!=d}.bind(this),e.getCurrentMediaTime=function(){return this.isLiveContent&&this.mediaInfo.metadata&&this.mediaInfo.metadata.sectionStartTimeInMedia?this.remotePlayer.currentTime-this.mediaInfo.metadata.sectionStartTimeInMedia:this.remotePlayer.currentTime}.bind(this),e.getMediaDuration=function(){return this.isLiveContent?null==this.mediaInfo.metadata||null==this.mediaInfo.metadata.sectionDuration||null==this.mediaInfo.metadata.sectionStartTimeInMedia?null:this.mediaInfo.metadata.sectionDuration:this.remotePlayer.duration}.bind(this),e.updateDisplay=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e&&e.getMediaSession()&&e.getMediaSession().media){var t=e.getMediaSession(),i=t.media,n=document.getElementById("video_image");i.metadata&&i.metadata.images&&i.metadata.images.length>0&&(n.src=i.metadata.images[0].url),document.getElementById("playerstate").style.display="block",document.getElementById("playerstatebg").style.display="block",document.getElementById("video_image_overlay").style.display="block";var a="",s="",r="";if(i.metadata&&(a=i.metadata.title,a=(a=(s=i.metadata.episodeTitle)?a+": "+s:a)?a+" ":"",r=(r=i.metadata.subtitle)?r+" ":""),document.getElementById("playerstate").innerHTML=a+t.playerState+" on "+e.getCastDevice().friendlyName,document.getElementById("media_title").innerHTML=a,document.getElementById("media_subtitle").innerHTML=r,i.streamType==chrome.cast.media.StreamType.LIVE){this.liveSeekableRange=t.liveSeekableRange;var o=document.getElementById("live_indicator");o.style.display="block",this.liveSeekableRange&&Math.abs(t.getEstimatedTime()-this.liveSeekableRange.end)<50?o.src="imagefiles/live_indicator_active.png":o.src="imagefiles/live_indicator_inactive.png"}else document.getElementById("live_indicator").style.display="none"}else document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none",document.getElementById("media_title").innerHTML="",document.getElementById("media_subtitle").innerHTML=""}.bind(this),e.updateCurrentTimeDisplay=function(){this.playerHandler.setTimeString(document.getElementById("currentTime"),this.playerHandler.getCurrentMediaTime())}.bind(this),e.updateDurationDisplay=function(){this.playerHandler.setTimeString(document.getElementById("duration"),this.playerHandler.getMediaDuration())}.bind(this),e.setTimeString=function(e,t){var i=this.getMediaTimeString(t);if(this.isLiveContent){if(null==i)return void(e.style.display="none");this.mediaInfo.metadata&&void 0!==this.mediaInfo.metadata.sectionStartAbsoluteTime?(e.style.display="flex",e.innerHTML=this.getClockTimeString(t+this.mediaInfo.metadata.sectionStartAbsoluteTime)):(e.style.display="flex",e.innerHTML=i)}else null!==i?(e.style.display="flex",e.innerHTML=i):e.style.display="none"}.bind(this),e.setVolume=function(e){var t=this.remotePlayer.volumeLevel,i=document.getElementById("audio_bg_level");e0&&this.endPlayback()},h.prototype.updateProgressBarByTimer=function(){var e=document.getElementById("progress"),t=document.getElementById("progress_indicator");if(null!=this.mediaDuration){t.style.display="",isNaN(parseInt(e.style.width,10))&&(e.style.width="0px");var i=Math.floor(o*this.currentMediaTime/this.mediaDuration);i>o?i=o:i<0&&(i=0),e.style.width=i+"px",t.style.marginLeft=i+"px";var n=document.getElementById("seekable_window"),a=document.getElementById("unseekable_overlay");if(this.isLiveContent)if(this.liveSeekableRange){var s=Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia,this.liveSeekableRange.end)-this.mediaInfo.metadata.sectionStartTimeInMedia,r=Math.floor(o*s/this.mediaDuration);r>o?r=o:r<0&&(r=0),n.style.width=r+"px";var l=Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia,this.liveSeekableRange.start)-this.mediaInfo.metadata.sectionStartTimeInMedia,d=Math.floor(o*l/this.mediaDuration);d>o?d=o:d<0&&(d=0),a.style.width=d+"px"}else n.style.width="0px",a.style.width="700px";else n.style.width="700px",a.style.width="0px";i>=o&&!this.isLiveContent&&this.endPlayback()}else{this.isLiveContent||console.log("Error - Duration is not defined for a VOD stream."),e.style.width="0px";var c=document.getElementById("skip");c&&c.style&&c.style.display&&(c.style.display="none"),t.style.display="none";var u=document.getElementById("seekable_window");u&&u.style&&u.style.width&&(u.style.width="0px");var m=document.getElementById("unseekable_overlay");m&&m.style&&m.style.width&&(m.style.width="0px")}},h.prototype.endPlayback=function(){this.currentMediaTime=0,this.stopProgressTimer(),this.playerState=d,this.playerHandler.updateDisplay();var e=document.getElementById("play");e&&e.style&&e.display&&(e.style.display="block");var t=document.getElementById("pause");t&&t.style&&t.style.display&&(t.style.display="none")},h.prototype.getMediaTimeString=function(e){if(null==e||null==e)return null;var t=!1;e<0&&(t=!0,e*=-1);var i=Math.floor(e/3600),n=Math.floor((e-3600*i)/60),a=Math.floor(e-3600*i-60*n);return i<10&&(i="0"+i),n<10&&(n="0"+n),a<10&&(a="0"+a),(t?"-":"")+i+":"+n+":"+a},h.prototype.getClockTimeString=function(e){if(!e)return"0:00:00";var t=new Date(1e3*e),i=t.getHours(),n=t.getMinutes(),a=t.getSeconds(),s=i>=12?"PM":"AM";return(i=(i%=12)||12)+":"+(n=("0"+n).slice(-2))+":"+(a=("0"+a).slice(-2))+" "+s},h.prototype.updateAdMarkers=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e){var t=e.getMediaSession();if(t){var i=t.media;if(i){var n=i.breaks,a=i.duration;if(n)for(var s=0;sa&&r.isEmbedded))if(!document.getElementById("ad"+r.position))document.getElementById("progress").innerHTML+='
'}}}}},h.prototype.removeAdMarkers=function(){document.querySelectorAll(".adMarker").forEach((function(e){e.remove()}))},h.prototype.adPositionToMargin=function(e,t){return-1==e||e>t?o:o*e/t},h.prototype.onBreakClipIdChanged=function(){var e=document.getElementById("skip");e&&e.style&&e.style.display&&(e.style.display="none")},h.prototype.isPlayingBreak=function(e){this.enableProgressBar(!e)},h.prototype.onWhenSkippableChanged=function(e){this.whenSkippable=e},h.prototype.onCurrentBreakClipTimeChanged=function(e){var t=document.getElementById("skip");null==this.whenSkippable||this.whenSkippable<0?t&&t.style&&t.style.display&&(t.style.display="none"):void 0!==this.whenSkippable||e>=this.whenSkippable?t&&t.style&&t.style.display&&(t.style.display="block"):t&&t.style&&t.style.display&&(t.style.display="none")},h.prototype.skipAd=function(){this.remotePlayerController.skipAd()},h.prototype.enableProgressBar=function(e){var t=document.getElementById("progress"),i=document.getElementById("progress_indicator"),n=document.getElementById("seekable_window");e?(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_progress.png')",t.style.cursor="pointer",n.style.cursor="pointer",i.style.cursor="pointer",i.draggable=!0,t.addEventListener("click",this.seekMediaListener),n.addEventListener("click",this.seekMediaListener),i.addEventListener("dragend",this.seekMediaListener)):(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_buffer.png')",t.style.cursor="default",n.style.cursor="default",i.style.cursor="default",i.draggable=!1,t.removeEventListener("click",this.seekMediaListener),n.removeEventListener("click",this.seekMediaListener),i.removeEventListener("dragend",this.seekMediaListener))},h.prototype.requestFullScreen=function(){var e=document.getElementById("video_element"),t=e.requestFullScreen||e.webkitRequestFullScreen;t&&(t.call(e),console.log("Requested fullscreen"))},h.prototype.cancelFullScreen=function(){var e=document.cancelFullScreen||document.webkitCancelFullScreen;e&&e.call(document)},h.prototype.fullscreenChangeHandler=function(){this.fullscreen=!this.fullscreen},h.prototype.showFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");this.fullscreen?(e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="block")):(e&&e.style&&e.style.display&&(e.style.display="block"),t&&t.style&&t.style.display&&(t.style.display="none"))},h.prototype.hideFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="none")},h.prototype.showMediaControl=function(){var e=document.getElementById("media_control");e&&e.style&&e.opacity&&(e.style.opacity=.7)},h.prototype.hideMediaControl=function(){if("undefined"!=typeof cast){var e=cast.framework.CastContext.getInstance();e&&e.getCurrentSession()?document.getElementById("media_control").style.opacity=.7:document.getElementById("media_control").style.opacity=0}},h.prototype.showVolumeSlider=function(){this.playerHandler.isMuted()||(document.getElementById("audio_bg").style.opacity=1,document.getElementById("audio_bg_track").style.opacity=1,document.getElementById("audio_bg_level").style.opacity=1,document.getElementById("audio_indicator").style.opacity=1)},h.prototype.hideVolumeSlider=function(){document.getElementById("audio_bg").style.opacity=0,document.getElementById("audio_bg_track").style.opacity=0,document.getElementById("audio_bg_level").style.opacity=0,document.getElementById("audio_indicator").style.opacity=0},h.prototype.resetVolumeSlider=function(){var e=.5*document.getElementById("audio_bg_track").clientHeight;document.getElementById("audio_bg_level").style.height=e+"px",document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},h.prototype.initializeUI=function(){this.mediaContents&&this.mediaContents.length>0&&(document.getElementById("media_title").innerHTML=this.mediaContents[0].title,document.getElementById("media_subtitle").innerHTML=this.mediaContents[this.currentMediaIndex].subtitle),document.getElementById("seekable_window").addEventListener("click",this.seekMediaListener),document.getElementById("progress").addEventListener("click",this.seekMediaListener),document.getElementById("progress_indicator").addEventListener("dragend",this.seekMediaListener),document.getElementById("skip").addEventListener("click",this.skipAd.bind(this)),document.getElementById("audio_on").addEventListener("click",this.playerHandler.mute.bind(this.playerHandler)),document.getElementById("audio_off").addEventListener("click",this.playerHandler.unMute.bind(this.playerHandler)),document.getElementById("audio_bg").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_on").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_bg_level").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_bg_track").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_bg_level").addEventListener("click",this.setVolume.bind(this)),document.getElementById("audio_bg_track").addEventListener("click",this.setVolume.bind(this)),document.getElementById("audio_bg").addEventListener("mouseout",this.hideVolumeSlider.bind(this)),document.getElementById("audio_on").addEventListener("mouseout",this.hideVolumeSlider.bind(this));var e=document.getElementById("main_video");void 0!==e&&e&&(e.addEventListener("mouseover",this.showMediaControl.bind(this)),e.addEventListener("mouseout",this.hideMediaControl.bind(this))),document.getElementById("media_control").addEventListener("mouseover",this.showMediaControl.bind(this)),document.getElementById("media_control").addEventListener("mouseout",this.hideMediaControl.bind(this)),document.getElementById("fullscreen_expand").addEventListener("click",this.requestFullScreen.bind(this)),document.getElementById("fullscreen_collapse").addEventListener("click",this.cancelFullScreen.bind(this)),document.addEventListener("fullscreenchange",this.fullscreenChangeHandler.bind(this),!1),document.addEventListener("webkitfullscreenchange",this.fullscreenChangeHandler.bind(this),!1),document.getElementById("play").addEventListener("click",this.playerHandler.play.bind(this.playerHandler)),document.getElementById("pause").addEventListener("click",this.playerHandler.pause.bind(this.playerHandler)),document.getElementById("progress_indicator").draggable=!0;var t=document.getElementById("none");t.onclick=function(){r=!1,s=!1,console.log("Features have been removed")};var i=document.getElementById("ads");i.onclick=function(){r=!1,s=!0,console.log("Ads have been enabled")};var n=document.getElementById("live");n.onclick=function(){r=!0,s=!1,console.log("Live has been enabled")},s?(r&&console.error("Only one feature can be enabled at a time. Enabling ads."),i.checked=!0,console.log("Ads are enabled")):r?(n.checked=!0,console.log("Live is enabled")):(t.checked=!0,console.log("No features are enabled"))},h.prototype.addVideoThumbs=function(){if(void 0!==this.mediaJSON&&this.mediaJSON.categories&&this.mediaJSON.categories.length>0){this.mediaContents=this.mediaJSON.categories[0].videos;for(var e=document.getElementById("carousel"),t=null,i=null,n=0;n',t.addEventListener("click",this.selectMedia.bind(this,n)),e.appendChild(t)}},h.getErrorMessage=function(e){switch(e.code){case chrome.cast.ErrorCode.API_NOT_INITIALIZED:return"The API is not initialized."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CANCEL:return"The operation was canceled by the user"+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CHANNEL_ERROR:return"A channel to the receiver is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.EXTENSION_MISSING:return"The Cast extension is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.INVALID_PARAMETER:return"The parameters to the operation were not valid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:return"No receiver was compatible with the session request."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.SESSION_ERROR:return"A session could not be created, or a session was invalid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.TIMEOUT:return"The operation timed out."+(e.description?" :"+e.description:"");default:return e}};var g=new h;window.__onGCastApiAvailable=function(e){e&&g.initializeCastPlayer()},window.CastPlayer=g;function f(e,t,i,n){var a,s=arguments.length,r=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,i,n);else for(var o=e.length-1;o>=0;o--)(a=e[o])&&(r=(s<3?a(r):s>3?a(t,i,r):a(t,i))||r);return s>3&&r&&Object.defineProperty(t,i,r),r}e.ɵa=function(){function e(e){this.ngCastService=e}return e.prototype.ngOnInit=function(){this.window=window;var e=this.ngCastService;this.window.__onGCastApiAvailable=function(t){t&&e.initializeCastApi()},this.castingStatus=this.ngCastService.getStatus()},e.prototype.openSession=function(){this.ngCastService.discoverDevices()},e.prototype.closeSession=function(){this.ngCastService.discoverDevices()},e}(),e.ɵa=f([t.Component({selector:"ng-cast",template:'cast\ncast_connected',styles:[""]})],e.ɵa),e.NgCastService=function(){function e(){var e=this;this.window=window,this.status={casting:!1},this.onInitSuccess=function(){console.log("GCast initialization success")},this.onError=function(e){console.log("GCast initialization failed",e)},this.discoverDevices=function(){var t=e,i=new n.Subject;return e.cast.requestSession((function(e){t.session=e,t.setCasting(!0),i.next("CONNECTED")}),(function(e){t.setCasting(!1),"cancel"===e.code?(t.session=void 0,i.next("CANCEL")):console.error("Error selecting a cast device",e)})),i},this.onMediaDiscovered=function(e){var t=window.document.createElement("script");t.setAttribute("type","text/javascript"),t.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"),window.document.body.appendChild(t),globalThis.CastPlayer.mediaJSON.categories=e},this.play=function(){e.currentMedia.play(null)},this.pause=function(){e.currentMedia.pause(null)},this.stop=function(){e.currentMedia.stop(null)},this.onMediaError=function(e){console.error("Error launching media",e)},globalThis.CastPlayer.mediaJSON={categories:[]}}return e.prototype.initializeCastApi=function(){var e=this;this.cast=this.window.chrome.cast;var t=new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID),i=new this.cast.ApiConfig(t,(function(){}),(function(t){e.cast.ReceiverAvailability.AVAILABLE}));this.cast.initialize(i,this.onInitSuccess,this.onError)},e.prototype.setCasting=function(e){globalThis.CastPlayer.addVideoThumbs(),this.status.casting=e},e.prototype.getStatus=function(){return this.status},e}(),e.NgCastService=f([t.Injectable()],e.NgCastService),e.NgCastModule=function(){},e.NgCastModule=f([t.NgModule({schemas:[t.CUSTOM_ELEMENTS_SCHEMA],imports:[i.CommonModule],exports:[e.ɵa],providers:[e.NgCastService],declarations:[e.ɵa]})],e.NgCastModule),Object.defineProperty(e,"__esModule",{value:!0})})); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("@angular/common"),require("rxjs")):"function"==typeof define&&define.amd?define("@thinkam.net/ng-cast",["exports","@angular/core","@angular/common","rxjs"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).thinkam=e.thinkam||{},e.thinkam.net=e.thinkam.net||{},e.thinkam.net["ng-cast"]={}),e.ng.core,e.ng.common,e.rxjs)}(this,(function(e,t,i,n){"use strict"; +/*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */function a(e,t,i,n){var a,s=arguments.length,r=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,i,n);else for(var o=e.length-1;o>=0;o--)(a=e[o])&&(r=(s<3?a(r):s>3?a(t,i,r):a(t,i))||r);return s>3&&r&&Object.defineProperty(t,i,r),r}e.ɵa=function(){function e(e){this.ngCastService=e,this.videoImage="",this.imageOffline=!1,this.srcImageOffline=""}return e.prototype.ngOnInit=function(){this.window=window;var e=this.ngCastService;this.window.__onGCastApiAvailable=function(t){t&&e.initializeCastApi()},this.castingStatus=this.ngCastService.getStatus()},e.prototype.openSession=function(){this.ngCastService.discoverDevices()},e.prototype.closeSession=function(){this.ngCastService.discoverDevices()},e}(),a([t.Input()],e.ɵa.prototype,"videoImage",void 0),a([t.Input()],e.ɵa.prototype,"imageOffline",void 0),a([t.Input()],e.ɵa.prototype,"srcImageOffline",void 0),e.ɵa=a([t.Component({selector:"ng-cast",template:'
\n
\x3c!-- Put Your Image Width --\x3e\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\nTV Offline\n',styles:[""]})],e.ɵa),e.NgCastService=function(){function e(){var e=this;this.window=window,this.status={casting:!1},this.onInitSuccess=function(){console.log("GCast initialization success")},this.onError=function(e){console.log("GCast initialization failed",e)},this.discoverDevices=function(){var t=e,i=new n.Subject;return e.cast.requestSession((function(e){t.session=e,t.setCasting(!0),i.next("CONNECTED")}),(function(e){t.setCasting(!1),"cancel"===e.code?(t.session=void 0,i.next("CANCEL")):console.error("Error selecting a cast device",e)})),i},this.onMediaDiscovered=function(e){var t=window.document.createElement("script");t.setAttribute("type","text/javascript"),t.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"),window.document.body.appendChild(t),globalThis.CastPlayer.mediaJSON.categories=e,globalThis.CastPlayer.addMediaContents(),globalThis.CastPlayer.setupLocalPlayer(),globalThis.CastPlayer.initializeUI()},this.play=function(){e.currentMedia.play(null)},this.pause=function(){e.currentMedia.pause(null)},this.stop=function(){e.currentMedia.stop(null)},this.onMediaError=function(e){console.error("Error launching media",e)},globalThis.CastPlayer.mediaJSON={categories:[]}}return e.prototype.initializeCastApi=function(){var e=this;this.cast=this.window.chrome.cast;var t=new this.cast.SessionRequest("4F8B3483"),i=new this.cast.ApiConfig(t,(function(){}),(function(t){e.cast.ReceiverAvailability.AVAILABLE}));this.cast.initialize(i,this.onInitSuccess,this.onError)},e.prototype.setCasting=function(e){globalThis.CastPlayer.addMediaContents(),this.status.casting=e},e.prototype.getStatus=function(){return this.status},e}(),e.NgCastService=a([t.Injectable()],e.NgCastService),e.NgCastModule=function(){},e.NgCastModule=a([t.NgModule({schemas:[t.CUSTOM_ELEMENTS_SCHEMA],imports:[i.CommonModule],exports:[e.ɵa],providers:[e.NgCastService],declarations:[e.ɵa]})],e.NgCastModule);var s=600,r=100,o="IDLE",d="BUFFERING",l="LOADED",u="PLAYING",c="PAUSED",m=function(){this.playerHandler=new y(this),this.playerState=o,this.playerStateBeforeSwitch=null,this.remotePlayer=null,this.remotePlayerController=null,this.currentMediaTime=0,this.mediaDuration=-1,this.timer=null,this.incrementMediaTimeHandler=this.incrementMediaTime.bind(this),this.seekMediaListener=this.seekMedia.bind(this),this.currentMediaIndex=0,this.mediaContents=null,this.fullscreen=!1,this.mediaInfo=null,this.whenSkippable=null,this.liveSeekableRange=null,this.isLiveContent=!1,this.mediaJSON={categories:[]}};m.prototype.initializeCastPlayer=function(){var e={receiverApplicationId:"4F8B3483"};e.autoJoinPolicy=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,cast.framework.CastContext.getInstance().setOptions(e),this.remotePlayer=new cast.framework.RemotePlayer,this.remotePlayerController=new cast.framework.RemotePlayerController(this.remotePlayer),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,function(e){this.switchPlayer(e.value)}.bind(this))},m.prototype.switchPlayer=function(){this.playerStateBeforeSwitch=this.playerState,this.stopProgressTimer(),this.resetVolumeSlider(),cast&&cast.framework&&this.remotePlayer.isConnected?(this.playerHandler.pause(),this.setupRemotePlayer()):this.setupLocalPlayer()};var y=function(e){this.target={},this.setTarget=function(e){this.target=e},this.play=function(){e.playerState!=o&&this.target.isMediaLoaded(e.currentMediaIndex)?(e.playerState=u,this.target.play(),document.getElementById("play").style.display="none",document.getElementById("pause").style.display="block"):this.load(e.currentMediaIndex)},this.pause=function(){this.target.pause(),e.playerState=c,document.getElementById("play").style.display="block",document.getElementById("pause").style.display="none"},this.stop=function(){e.playerState=o,this.target.stop()},this.load=function(t){void 0===t&&(t=null),t||(t=e.currentMediaIndex),e.playerState=d,this.target.load(t)},this.isMediaLoaded=function(e){return this.target.isMediaLoaded(e)},this.prepareToPlay=function(){e.mediaDuration=this.getMediaDuration(),e.playerHandler.updateDurationDisplay(),e.playerState=l,this.play(),e.startProgressTimer(),this.updateDisplay()},this.getCurrentMediaTime=function(){return this.target.getCurrentMediaTime()},this.getMediaDuration=function(){return this.target.getMediaDuration()},this.updateDisplay=function(){this.currentMediaTime=this.target.getCurrentMediaTime(),this.mediaDuration=this.target.getMediaDuration(),this.target.updateDisplay()},this.updateCurrentTimeDisplay=function(){this.target.updateCurrentTimeDisplay()},this.updateDurationDisplay=function(){this.target.updateDurationDisplay()},this.setTimeString=function(e,t){this.target.setTimeString(e,t)},this.setVolume=function(e){this.target.setVolume(e)},this.mute=function(){this.target.mute(),document.getElementById("audio_on").style.display="none",document.getElementById("audio_off").style.display="block"},this.unMute=function(){this.target.unMute(),document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},this.isMuted=function(){return this.target.isMuted()},this.seekTo=function(e){this.target.seekTo(e)}};m.prototype.setupLocalPlayer=function(){var e=document.getElementById("video_element");e.addEventListener("loadeddata",this.onMediaLoadedLocally.bind(this));var t={play:function(){e.play(),document.getElementById("video_image").style.display="none",e.style.display="block"},pause:function(){e.pause()},stop:function(){e.stop()}};t.load=function(t){e.src=this.mediaContents[t].sources[0],e.load()}.bind(this),t.getCurrentMediaTime=function(){return e.currentTime},t.getMediaDuration=function(){return e.duration},t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none"},t.setVolume=function(t){e.volume=t0&&this.playerHandler.play()},m.prototype.setupRemotePlayer=function(){this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,function(e){var t=cast.framework.CastContext.getInstance().getCurrentSession();if(!t)return this.mediaInfo=null,this.isLiveContent=!1,void this.playerHandler.updateDisplay();var i=t.getMediaSession();if(!i)return this.mediaInfo=null,this.isLiveContent=!1,void this.playerHandler.updateDisplay();this.mediaInfo=i.media,this.mediaInfo?this.isLiveContent=this.mediaInfo.streamType==chrome.cast.media.StreamType.LIVE:this.isLiveContent=!1,i.playerState==u&&this.playerState!==u&&this.playerHandler.prepareToPlay(),this.removeAdMarkers(),this.updateAdMarkers(),this.playerHandler.updateDisplay()}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,function(e){this.enableProgressBar(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,function(){this.remotePlayer.isPaused?this.playerHandler.pause():this.playerState!==u&&this.playerHandler.play()}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,function(){this.remotePlayer.isMuted?this.playerHandler.mute():this.playerHandler.unMute()}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,function(){var e=this.remotePlayer.volumeLevel*r,t=document.getElementById("audio_bg_level");t.style.height=e+"px",t.style.marginTop=-e+"px"}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,function(e){this.isPlayingBreak(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,function(e){this.onWhenSkippableChanged(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,function(e){this.onCurrentBreakClipTimeChanged(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,function(e){this.onBreakClipIdChanged(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,function(e){console.log("LIVE_SEEKABLE_RANGE_CHANGED"),this.liveSeekableRange=e.value}.bind(this));var e={};e.play=function(){this.remotePlayer.isPaused&&this.remotePlayerController.playOrPause(),document.getElementById("video_image").style.display="",document.getElementById("video_element").style.display="none"}.bind(this),e.pause=function(){this.remotePlayer.isPaused||this.remotePlayerController.playOrPause()}.bind(this),e.stop=function(){this.remotePlayerController.stop()}.bind(this),e.load=function(e){console.log("Loading..."+this.mediaContents[e].title);var t=new chrome.cast.media.MediaInfo(this.mediaContents[e].sources[0],"video/mp4");t.streamType=chrome.cast.media.StreamType.BUFFERED,t.metadata=new chrome.cast.media.TvShowMediaMetadata,t.metadata.title=this.mediaContents[e].title,t.metadata.subtitle=this.mediaContents[e].subtitle,t.metadata.images=[{url:""+this.mediaContents[e].thumb}];var i=new chrome.cast.media.LoadRequest(t);if(i.currentTime=this.currentMediaTime,ENABLE_ADS)t.breakClips=breakClipsJSON,t.breaks=breaksJSON;else if(ENABLE_LIVE){t.streamType=chrome.cast.media.StreamType.LIVE;var n=new Date,a=n/=1e3;t.duration=-1,t.startAbsoluteTime=n,t.metadata.sectionStartAbsoluteTime=a,t.metadata.sectionStartTimeInMedia=0,t.metadata.sectionDuration=this.mediaContents[e].duration;var s=new chrome.cast.media.QueueItem(t);i.queueData=new chrome.cast.media.QueueData,i.queueData.items=[s],i.queueData.name="Sample Queue for Live"}this.playerStateBeforeSwitch&&this.playerStateBeforeSwitch!=c?i.autoplay=!0:i.autoplay=!1,cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(i).then(function(){console.log("Remote media loaded")}.bind(this),function(e){this.playerState=o,console.log("Remote media load error: "+m.getErrorMessage(e)),this.playerHandler.updateDisplay()}.bind(this))}.bind(this),e.isMediaLoaded=function(e){var t=cast.framework.CastContext.getInstance().getCurrentSession();if(!t)return!1;var i=t.getMediaSession();return!!i&&i.playerState!=o}.bind(this),e.getCurrentMediaTime=function(){return this.isLiveContent&&this.mediaInfo.metadata&&this.mediaInfo.metadata.sectionStartTimeInMedia?this.remotePlayer.currentTime-this.mediaInfo.metadata.sectionStartTimeInMedia:this.remotePlayer.currentTime}.bind(this),e.getMediaDuration=function(){return this.isLiveContent?null==this.mediaInfo.metadata||null==this.mediaInfo.metadata.sectionDuration||null==this.mediaInfo.metadata.sectionStartTimeInMedia?null:this.mediaInfo.metadata.sectionDuration:this.remotePlayer.duration}.bind(this),e.updateDisplay=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e&&e.getMediaSession()&&e.getMediaSession().media){var t=e.getMediaSession(),i=t.media,n=document.getElementById("video_image");i.metadata&&i.metadata.images&&i.metadata.images.length>0&&(n.src=i.metadata.images[0].url),document.getElementById("playerstate").style.display="block",document.getElementById("playerstatebg").style.display="block",document.getElementById("video_image_overlay").style.display="block";var a="",s="",r="";if(i.metadata&&(a=i.metadata.title,a=(a=(s=i.metadata.episodeTitle)?a+": "+s:a)?a+" ":"",r=(r=i.metadata.subtitle)?r+" ":""),DEMO_MODE?(document.getElementById("playerstate").innerHTML=(ENABLE_LIVE?"Live Content ":"Sample Video ")+t.playerState+" on Chromecast",document.getElementById("media_title").innerHTML=ENABLE_LIVE?"Live Content":"Sample Video",document.getElementById("media_subtitle").innerHTML=""):(document.getElementById("playerstate").innerHTML=a+t.playerState+" on "+e.getCastDevice().friendlyName,document.getElementById("media_title").innerHTML=a,document.getElementById("media_subtitle").innerHTML=r),i.streamType==chrome.cast.media.StreamType.LIVE){this.liveSeekableRange=t.liveSeekableRange;var o=document.getElementById("live_indicator");o.style.display="block",this.liveSeekableRange&&Math.abs(t.getEstimatedTime()-this.liveSeekableRange.end)0&&this.endPlayback()},m.prototype.updateProgressBarByTimer=function(){var e=document.getElementById("progress"),t=document.getElementById("progress_indicator");if(null!=this.mediaDuration){t.style.display="",isNaN(parseInt(e.style.width,10))&&(e.style.width="0px");var i=Math.floor(s*this.currentMediaTime/this.mediaDuration);i>s?i=s:i<0&&(i=0),e.style.width=i+"px",t.style.marginLeft=i+"px";var n=document.getElementById("seekable_window"),a=document.getElementById("unseekable_overlay");if(this.isLiveContent)if(this.liveSeekableRange){var r=Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia,this.liveSeekableRange.end)-this.mediaInfo.metadata.sectionStartTimeInMedia,o=Math.floor(s*r/this.mediaDuration);o>s?o=s:o<0&&(o=0),n.style.width=o+"px";var d=Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia,this.liveSeekableRange.start)-this.mediaInfo.metadata.sectionStartTimeInMedia,l=Math.floor(s*d/this.mediaDuration);l>s?l=s:l<0&&(l=0),a.style.width=l+"px"}else n.style.width="0px",a.style.width="600px";else n.style.width="600px",a.style.width="0px";i>=s&&!this.isLiveContent&&this.endPlayback()}else{this.isLiveContent||console.log("Error - Duration is not defined for a VOD stream."),e.style.width="0px";var u=document.getElementById("skip");u&&u.style&&u.style.display&&(u.style.display="none"),t.style.display="none";var c=document.getElementById("seekable_window");c&&c.style&&c.style.width&&(c.style.width="0px");var m=document.getElementById("unseekable_overlay");m&&m.style&&m.style.width&&(m.style.width="0px")}},m.prototype.endPlayback=function(){this.currentMediaTime=0,this.stopProgressTimer(),this.playerState=o,this.playerHandler.updateDisplay();var e=document.getElementById("play");e&&e.style&&e.display&&(e.style.display="block");var t=document.getElementById("pause");t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.getMediaTimeString=function(e){if(null==e||null==e)return null;var t=!1;e<0&&(t=!0,e*=-1);var i=Math.floor(e/3600),n=Math.floor((e-3600*i)/60),a=Math.floor(e-3600*i-60*n);return i<10&&(i="0"+i),n<10&&(n="0"+n),a<10&&(a="0"+a),(t?"-":"")+i+":"+n+":"+a},m.prototype.getClockTimeString=function(e){if(!e)return"0:00:00";var t=new Date(1e3*e),i=t.getHours(),n=t.getMinutes(),a=t.getSeconds(),s=i>=12?"PM":"AM";return(i=(i%=12)||12)+":"+(n=("0"+n).slice(-2))+":"+(a=("0"+a).slice(-2))+" "+s},m.prototype.updateAdMarkers=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e){var t=e.getMediaSession();if(t){var i=t.media;if(i){var n=i.breaks,a=i.duration;if(n)for(var s=0;sa&&r.isEmbedded))if(!document.getElementById("ad"+r.position))document.getElementById("progress").innerHTML+='
'}}}}},m.prototype.removeAdMarkers=function(){document.querySelectorAll(".adMarker").forEach((function(e){e.remove()}))},m.prototype.adPositionToMargin=function(e,t){return-1==e||e>t?s:s*e/t},m.prototype.onBreakClipIdChanged=function(){var e=document.getElementById("skip");e&&e.style&&e.style.display&&(e.style.display="none")},m.prototype.isPlayingBreak=function(e){this.enableProgressBar(!e)},m.prototype.onWhenSkippableChanged=function(e){this.whenSkippable=e},m.prototype.onCurrentBreakClipTimeChanged=function(e){var t=document.getElementById("skip");null==this.whenSkippable||this.whenSkippable<0?t&&t.style&&t.style.display&&(t.style.display="none"):void 0!==this.whenSkippable||e>=this.whenSkippable?t&&t.style&&t.style.display&&(t.style.display="block"):t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.skipAd=function(){this.remotePlayerController.skipAd()},m.prototype.enableProgressBar=function(e){var t=document.getElementById("progress"),i=document.getElementById("progress_indicator"),n=document.getElementById("seekable_window");e?(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_progress.png')",t.style.cursor="pointer",n.style.cursor="pointer",i.style.cursor="pointer",i.draggable=!0,t.addEventListener("click",this.seekMediaListener),n.addEventListener("click",this.seekMediaListener),i.addEventListener("dragend",this.seekMediaListener)):(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_buffer.png')",t.style.cursor="default",n.style.cursor="default",i.style.cursor="default",i.draggable=!1,t.removeEventListener("click",this.seekMediaListener),n.removeEventListener("click",this.seekMediaListener),i.removeEventListener("dragend",this.seekMediaListener))},m.prototype.requestFullScreen=function(){var e=document.getElementById("video_element"),t=e.requestFullScreen||e.webkitRequestFullScreen;t&&(t.call(e),console.log("Requested fullscreen"))},m.prototype.cancelFullScreen=function(){var e=document.cancelFullScreen||document.webkitCancelFullScreen;e&&e.call(document)},m.prototype.fullscreenChangeHandler=function(){this.fullscreen=!this.fullscreen},m.prototype.showFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");this.fullscreen?(e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="block")):(e&&e.style&&e.style.display&&(e.style.display="block"),t&&t.style&&t.style.display&&(t.style.display="none"))},m.prototype.hideFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.showMediaControl=function(){var e=document.getElementById("media_control");e&&e.style&&e.opacity&&(e.style.opacity=.7)},m.prototype.hideMediaControl=function(){if("undefined"!=typeof cast){var e=cast.framework.CastContext.getInstance();e&&e.getCurrentSession()?document.getElementById("media_control").style.opacity=.7:document.getElementById("media_control").style.opacity=0}},m.prototype.showVolumeSlider=function(){this.playerHandler.isMuted()||(document.getElementById("audio_bg").style.opacity=1,document.getElementById("audio_bg_track").style.opacity=1,document.getElementById("audio_bg_level").style.opacity=1,document.getElementById("audio_indicator").style.opacity=1)},m.prototype.hideVolumeSlider=function(){document.getElementById("audio_bg").style.opacity=0,document.getElementById("audio_bg_track").style.opacity=0,document.getElementById("audio_bg_level").style.opacity=0,document.getElementById("audio_indicator").style.opacity=0},m.prototype.resetVolumeSlider=function(){var e=.5*document.getElementById("audio_bg_track").clientHeight;document.getElementById("audio_bg_level").style.height=e+"px",document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},m.prototype.initializeUI=function(){document.getElementById("media_title").innerHTML=this.mediaContents[0].title,document.getElementById("media_subtitle").innerHTML=this.mediaContents[this.currentMediaIndex].subtitle,document.getElementById("media_desc").innerHTML=this.mediaContents[this.currentMediaIndex].description,document.getElementById("progress_bg").addEventListener("click",this.seekMedia.bind(this)),document.getElementById("progress").addEventListener("click",this.seekMedia.bind(this)),document.getElementById("progress_indicator").addEventListener("dragend",this.seekMedia.bind(this)),document.getElementById("audio_on").addEventListener("click",this.playerHandler.mute.bind(this.playerHandler)),document.getElementById("audio_off").addEventListener("click",this.playerHandler.unMute.bind(this.playerHandler)),document.getElementById("audio_bg").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_on").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_bg_level").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_bg_track").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_bg_level").addEventListener("click",this.setVolume.bind(this)),document.getElementById("audio_bg_track").addEventListener("click",this.setVolume.bind(this)),document.getElementById("audio_bg").addEventListener("mouseout",this.hideVolumeSlider.bind(this)),document.getElementById("audio_on").addEventListener("mouseout",this.hideVolumeSlider.bind(this)),document.getElementById("main_video").addEventListener("mouseover",this.showMediaControl.bind(this)),document.getElementById("main_video").addEventListener("mouseout",this.hideMediaControl.bind(this)),document.getElementById("media_control").addEventListener("mouseover",this.showMediaControl.bind(this)),document.getElementById("media_control").addEventListener("mouseout",this.hideMediaControl.bind(this)),document.getElementById("fullscreen_expand").addEventListener("click",this.requestFullScreen.bind(this)),document.getElementById("fullscreen_collapse").addEventListener("click",this.cancelFullScreen.bind(this)),document.addEventListener("fullscreenchange",this.fullscreenChangeHandler.bind(this),!1),document.addEventListener("webkitfullscreenchange",this.fullscreenChangeHandler.bind(this),!1),document.getElementById("play").addEventListener("click",this.playerHandler.play.bind(this.playerHandler)),document.getElementById("pause").addEventListener("click",this.playerHandler.pause.bind(this.playerHandler)),document.getElementById("progress_indicator").draggable=!0},m.prototype.addVideoThumbs=function(){if(void 0!==this.mediaJSON&&this.mediaJSON.categories&&this.mediaJSON.categories.length>0){this.mediaContents=this.mediaJSON.categories[0].videos;for(var e=document.getElementById("carousel"),t=null,i=null,n=0;n',t.addEventListener("click",this.selectMedia.bind(this,n)),e.appendChild(t)}},m.prototype.addMediaContents=function(){void 0!==this.mediaJSON&&this.mediaJSON.categories&&this.mediaJSON.categories.length>0&&(this.mediaContents=this.mediaJSON.categories[0].videos)},m.getErrorMessage=function(e){switch(e.code){case chrome.cast.ErrorCode.API_NOT_INITIALIZED:return"The API is not initialized."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CANCEL:return"The operation was canceled by the user"+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CHANNEL_ERROR:return"A channel to the receiver is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.EXTENSION_MISSING:return"The Cast extension is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.INVALID_PARAMETER:return"The parameters to the operation were not valid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:return"No receiver was compatible with the session request."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.SESSION_ERROR:return"A session could not be created, or a session was invalid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.TIMEOUT:return"The operation timed out."+(e.description?" :"+e.description:"");default:return e}};var h=new m;window.__onGCastApiAvailable=function(e){e&&h.initializeCastPlayer()},window.CastPlayer=h,Object.defineProperty(e,"__esModule",{value:!0})})); //# sourceMappingURL=thinkam.net-ng-cast.umd.min.js.map \ No newline at end of file diff --git a/dist/bundles/thinkam.net-ng-cast.umd.min.js.map b/dist/bundles/thinkam.net-ng-cast.umd.min.js.map index 0101938..7c078a3 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.min.js.map +++ b/dist/bundles/thinkam.net-ng-cast.umd.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../CastVideos.js","../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts"],"names":["MEDIA_SOURCE_ROOT","ENABLE_ADS","ENABLE_LIVE","PROGRESS_BAR_WIDTH","FULL_VOLUME_HEIGHT","PLAYER_STATE","CastPlayer","this","playerHandler","PlayerHandler","playerState","playerStateBeforeSwitch","remotePlayer","remotePlayerController","currentMediaTime","mediaDuration","timer","incrementMediaTimeHandler","incrementMediaTime","bind","seekMediaListener","seekMedia","currentMediaIndex","mediaContents","fullscreen","mediaInfo","whenSkippable","liveSeekableRange","isLiveContent","setupLocalPlayer","addVideoThumbs","initializeUI","mediaJSON","categories","prototype","initializeCastPlayer","options","receiverApplicationId","autoJoinPolicy","chrome","cast","AutoJoinPolicy","ORIGIN_SCOPED","framework","CastContext","getInstance","setOptions","RemotePlayer","RemotePlayerController","addEventListener","RemotePlayerEventType","IS_CONNECTED_CHANGED","e","switchPlayer","value","stopProgressTimer","resetVolumeSlider","isConnected","pause","setupRemotePlayer","castPlayer","target","setTarget","play","isMediaLoaded","document","getElementById","style","display","load","stop","mediaIndex","prepareToPlay","getMediaDuration","updateDurationDisplay","startProgressTimer","updateDisplay","getCurrentMediaTime","updateCurrentTimeDisplay","setTimeString","element","time","setVolume","volumeSliderPosition","mute","unMute","isMuted","seekTo","live_indicator","removeAdMarkers","localPlayer","onMediaLoadedLocally","playerTarget","src","currentTime","duration","innerHTML","currentTimeString","getMediaTimeString","volume","p","height","marginTop","muted","DEFAULT_VOLUME","showFullscreenButton","enableProgressBar","MEDIA_INFO_CHANGED","event","session","getCurrentSession","media","getMediaSession","streamType","StreamType","LIVE","updateAdMarkers","CAN_SEEK_CHANGED","IS_PAUSED_CHANGED","isPaused","IS_MUTED_CHANGED","VOLUME_LEVEL_CHANGED","newVolume","volumeLevel","IS_PLAYING_BREAK_CHANGED","isPlayingBreak","WHEN_SKIPPABLE_CHANGED","onWhenSkippableChanged","CURRENT_BREAK_CLIP_TIME_CHANGED","onCurrentBreakClipTimeChanged","BREAK_CLIP_ID_CHANGED","onBreakClipIdChanged","LIVE_SEEKABLE_RANGE_CHANGED","console","log","playOrPause","MediaInfo","BUFFERED","metadata","TvShowMediaMetadata","title","subtitle","images","url","request","LoadRequest","breakClips","breakClipsJSON","breaks","breaksJSON","Date","sectionStartAbsoluteTime","startAbsoluteTime","sectionStartTimeInMedia","sectionDuration","item","QueueItem","queueData","QueueData","items","name","autoplay","loadMedia","then","errorCode","getErrorMessage","undefined","castSession","vi","length","mediaTitle","mediaEpisodeTitle","mediaSubtitle","episodeTitle","getCastDevice","friendlyName","Math","abs","getEstimatedTime","end","getClockTimeString","currentVolume","setVolumeLevel","muteOrUnmute","seek","canSeek","opacity","hideFullscreenButton","getSessionState","SessionState","SESSION_RESUMED","selectMedia","currentMediaInfo","marginLeft","width","seekable_window","unseekable_overlay","position","parseInt","offsetX","pi","progress","seekTime","pp","pw","currentTarget","id","mouseEvent","pos","offsetY","clientHeight","setInterval","clearInterval","updateProgressBarByTimer","endPlayback","progressBar","isNaN","floor","seekableMediaPosition","max","seekableWidth","unseekableMediaPosition","start","unseekableWidth","skip","seekable_window_1","unseekable_overlay_1","timestamp","isNegative","hours","minutes","seconds","date","getHours","getMinutes","getSeconds","ampm","slice","contentDuration","i","adBreak","isEmbedded","adPositionToMargin","querySelectorAll","forEach","adMarker","remove","currentBreakClipTime","skipAd","enable","progress_indicator","backgroundImage","cursor","draggable","removeEventListener","requestFullScreen","requestMethod","call","cancelFullScreen","fullscreenChangeHandler","fullscreen_expand","fullscreen_collapse","showMediaControl","media_control","hideMediaControl","context","showVolumeSlider","hideVolumeSlider","defaultVolumeSliderHeight","main_video","noneRadio","onclick","adsRadio","liveRadio","error","checked","ni","newdiv","divIdName","createElement","setAttribute","appendChild","code","ErrorCode","API_NOT_INITIALIZED","description","CANCEL","CHANNEL_ERROR","EXTENSION_MISSING","INVALID_PARAMETER","RECEIVER_UNAVAILABLE","SESSION_ERROR","TIMEOUT","window","isAvailable","__decorate","decorators","key","desc","d","c","arguments","r","Object","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","NgCastComponent","ngCastService","ngOnInit","initializeCastApi","castingStatus","getStatus","openSession","discoverDevices","closeSession","Component","selector","template","NgCastService","_this","status","casting","onInitSuccess","onError","err","self","subj","Subject","requestSession","s","setCasting","next","onMediaDiscovered","script","body","globalThis","currentMedia","onMediaError","sessionRequest","SessionRequest","DEFAULT_MEDIA_RECEIVER_APP_ID","apiConfig","ApiConfig","ReceiverAvailability","AVAILABLE","initialize","Injectable","NgCastModule","NgModule","schemas","CUSTOM_ELEMENTS_SCHEMA","imports","CommonModule","exports","providers","declarations"],"mappings":"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","sourcesContent":["'use strict';\n\n/** Cleaner UI for demo purposes. */\nconst DEMO_MODE = false;\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/';\n\n/**\n * Controls if Ads are enabled. Controlled by radio button.\n * @type {boolean}\n */\nlet ENABLE_ADS = false;\n\n/**\n * Controls if Live stream is played. Controlled by radio button.\n * @type {boolean}\n */\nlet ENABLE_LIVE = false;\n\n/**\n * Buffer to decide if the live indicator should be displayed to show that\n * playback is at the playback head.\n * @const {number}\n */\nconst LIVE_INDICATOR_BUFFER = 50;\n\n/**\n * Width of progress bar in pixels.\n * @const {number}\n */\nconst PROGRESS_BAR_WIDTH = 700;\n\n/**\n * Time in milliseconds for minimal progress update.\n * @const {number}\n */\nconst TIMER_STEP = 1000;\n\n/**\n * Cast volume upon initial connection.\n * @const {number}\n */\nconst DEFAULT_VOLUME = 0.5;\n\n/**\n * Height, in pixels, of volume bar.\n * @const {number}\n */\nconst FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.setupLocalPlayer();\n this.addVideoThumbs();\n this.initializeUI();\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = function () {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = 'C0868879';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n this.remotePlayer = new cast.framework.RemotePlayer();\n this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer);\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n function (e) {\n this.switchPlayer(e.value);\n }.bind(this)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = function () {\n this.playerStateBeforeSwitch = this.playerState;\n\n this.stopProgressTimer();\n this.resetVolumeSlider();\n\n // Session is active\n if (cast && cast.framework && this.remotePlayer.isConnected) {\n // Pause local playback\n this.playerHandler.pause();\n this.setupRemotePlayer();\n } else {\n this.setupLocalPlayer();\n }\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n this.updateDurationDisplay = function () {\n this.target.updateDurationDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = function () {\n // Cleanup remote player UI\n let live_indicator = document.getElementById('live_indicator');\n if (live_indicator && live_indicator.style && live_indicator.style.display) {\n live_indicator.style.display = 'none';\n }\n\n this.removeAdMarkers();\n document.getElementById('skip').style.display = 'none';\n\n var localPlayer = document.getElementById('video_element');\n if (typeof localPlayer !== 'undefined' && localPlayer)\n localPlayer.addEventListener(\n 'loadeddata', this.onMediaLoadedLocally.bind(this));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src = this.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n if (!mediaIndex) {\n return (localPlayer.src !== null && localPlayer.src !== \"\");\n } else {\n return (localPlayer.src == this.mediaContents[mediaIndex]['sources'][0]);\n }\n }.bind(this);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplay = function () {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n };\n\n playerTarget.updateCurrentTimeDisplay = function () {\n // Increment for local playback\n this.currentMediaTime += 1;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.currentMediaTime);\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.mediaDuration);\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n if (currentTimeString !== null) {\n element.style.display = '';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n if (localPlayer) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n }\n\n var p = document.getElementById('audio_bg_level');\n if (typeof p !== 'undefined' && p) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n }\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n if (localPlayer)\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n this.playerHandler.setTarget(playerTarget);\n\n this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n this.showFullscreenButton();\n\n this.enableProgressBar(true);\n\n if (this.currentMediaTime > 0) {\n this.playerHandler.load();\n this.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n this.mediaInfo = media.media;\n\n if (this.mediaInfo) {\n this.isLiveContent = (this.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n this.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) {\n this.playerHandler.prepareToPlay();\n }\n\n this.removeAdMarkers();\n this.updateAdMarkers();\n\n this.playerHandler.updateDisplay();\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n this.enableProgressBar(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (this.remotePlayer.isPaused) {\n this.playerHandler.pause();\n } else if (this.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n this.playerHandler.play();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n } else {\n this.playerHandler.unMute();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n this.isPlayingBreak(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n this.onWhenSkippableChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n this.onCurrentBreakClipTimeChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n this.onBreakClipIdChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n this.liveSeekableRange = event.value;\n }.bind(this)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(this);\n\n playerTarget.pause = function () {\n if (!this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n }.bind(this);\n\n playerTarget.stop = function () {\n this.remotePlayerController.stop();\n }.bind(this);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n\n let mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;\n mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata();\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle'];\n mediaInfo.metadata.images = [{\n 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']\n }];\n\n let request = new chrome.cast.media.LoadRequest(mediaInfo);\n request.currentTime = this.currentMediaTime;\n\n if (ENABLE_ADS) {\n // Add sample breaks and breakClips.\n mediaInfo.breakClips = breakClipsJSON;\n mediaInfo.breaks = breaksJSON;\n } else if (ENABLE_LIVE) {\n // Change the streamType and add live specific metadata.\n mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;\n // TODO: Set the metadata on the receiver side in your implementation.\n // startAbsoluteTime and sectionStartTimeInMedia will be set for you.\n // See https://developers.google.com/cast/docs/caf_receiver/live.\n\n // TODO: Start time, is a fake timestamp. Use correct values for your implementation.\n let currentTime = new Date();\n // Convert from milliseconds to seconds.\n currentTime = currentTime / 1000;\n let sectionStartAbsoluteTime = currentTime;\n\n // Duration should be -1 for live streams.\n mediaInfo.duration = -1;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.startAbsoluteTime = currentTime;\n mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.metadata.sectionStartTimeInMedia = 0;\n mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration'];\n\n let item = new chrome.cast.media.QueueItem(mediaInfo);\n request.queueData = new chrome.cast.media.QueueData();\n request.queueData.items = [item];\n request.queueData.name = \"Sample Queue for Live\";\n }\n\n // Do not immediately start playing if the player was previously PAUSED.\n if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) {\n request.autoplay = false;\n } else {\n request.autoplay = true;\n }\n\n cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(\n function () {\n console.log('Remote media loaded');\n }.bind(this),\n function (errorCode) {\n this.playerState = PLAYER_STATE.IDLE;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n this.playerHandler.updateDisplay();\n }.bind(this));\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(this);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (this.isLiveContent && this.mediaInfo.metadata &&\n this.mediaInfo.metadata.sectionStartTimeInMedia) {\n return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return this.remotePlayer.currentTime;\n }\n }.bind(this);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (this.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (this.mediaInfo.metadata == undefined ||\n this.mediaInfo.metadata.sectionDuration == undefined ||\n this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return this.mediaInfo.metadata.sectionDuration;\n } else {\n return this.remotePlayer.duration;\n }\n }.bind(this);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n this.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(this);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime());\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration());\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n\n if (this.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = this.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n this.remotePlayer.volumeLevel = currentVolume;\n this.remotePlayerController.setVolumeLevel();\n }.bind(this);\n\n playerTarget.mute = function () {\n if (!this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.unMute = function () {\n if (this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.isMuted = function () {\n return this.remotePlayer.isMuted;\n }.bind(this);\n\n playerTarget.seekTo = function (time) {\n this.remotePlayer.currentTime = time;\n this.remotePlayerController.seek();\n }.bind(this);\n\n this.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n }\n this.enableProgressBar(this.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n this.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n this.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n this.removeAdMarkers();\n this.updateAdMarkers();\n } else {\n this.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = this.currentMediaTime;\n\n this.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n this.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n this.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n this.stopProgressTimer();\n this.currentMediaTime = 0;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n this.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (this.isLiveContent && !this.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (this.playerState === PLAYER_STATE.PLAYING ||\n this.playerState === PLAYER_STATE.PAUSED) {\n this.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (this.isLiveContent) {\n seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n this.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n this.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n this.stopProgressTimer();\n\n // Start progress timer\n this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n this.currentMediaTime = this.playerHandler.getCurrentMediaTime();\n this.mediaDuration = this.playerHandler.getMediaDuration();\n\n this.playerHandler.updateDurationDisplay();\n\n if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) {\n this.playerHandler.updateCurrentTimeDisplay();\n this.updateProgressBarByTimer();\n } else if (this.mediaDuration > 0) {\n this.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (this.mediaDuration == null) {\n if (!this.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n \n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n \n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (this.isLiveContent) {\n if (this.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) {\n this.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n this.currentMediaTime = 0;\n this.stopProgressTimer();\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n this.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n this.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (this.whenSkippable == undefined || this.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n this.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', this.seekMediaListener);\n seekable_window.addEventListener('click', this.seekMediaListener);\n progress_indicator.addEventListener('dragend', this.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', this.seekMediaListener);\n seekable_window.removeEventListener('click', this.seekMediaListener);\n progress_indicator.removeEventListener('dragend', this.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n this.fullscreen = !this.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (this.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block'; \n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!this.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = function () {\n // Set initial values for title and subtitle.\n if (this.mediaContents && this.mediaContents.length > 0) {\n document.getElementById('media_title').innerHTML =\n this.mediaContents[0]['title'];\n\n document.getElementById('media_subtitle').innerHTML =\n this.mediaContents[this.currentMediaIndex]['subtitle'];\n }\n\n document.getElementById('seekable_window').addEventListener(\n 'click', this.seekMediaListener);\n document.getElementById('progress').addEventListener(\n 'click', this.seekMediaListener);\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', this.seekMediaListener);\n document.getElementById('skip').addEventListener(\n 'click', this.skipAd.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'click', this.playerHandler.mute.bind(this.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', this.playerHandler.unMute.bind(this.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n\n let main_video = document.getElementById('main_video');\n if (typeof main_video !== 'undefined' && main_video) {\n main_video.addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n main_video.addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n }\n \n document.getElementById('media_control').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', this.requestFullScreen.bind(this));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', this.cancelFullScreen.bind(this));\n document.addEventListener(\n 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n document.addEventListener(\n 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', this.playerHandler.play.bind(this.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', this.playerHandler.pause.bind(this.playerHandler));\n\n document.getElementById('progress_indicator').draggable = true;\n\n // Set up feature radio buttons\n let noneRadio = document.getElementById('none');\n noneRadio.onclick = function () {\n ENABLE_LIVE = false;\n ENABLE_ADS = false;\n console.log(\"Features have been removed\");\n }\n let adsRadio = document.getElementById('ads');\n adsRadio.onclick = function () {\n ENABLE_LIVE = false;\n ENABLE_ADS = true;\n console.log(\"Ads have been enabled\");\n }\n let liveRadio = document.getElementById('live');\n liveRadio.onclick = function () {\n ENABLE_LIVE = true;\n ENABLE_ADS = false;\n console.log(\"Live has been enabled\");\n }\n\n if (ENABLE_ADS) {\n if (ENABLE_LIVE) {\n console.error('Only one feature can be enabled at a time. Enabling ads.');\n }\n adsRadio.checked = true;\n console.log(\"Ads are enabled\");\n } else if (ENABLE_LIVE) {\n liveRadio.checked = true;\n console.log(\"Live is enabled\");\n } else {\n noneRadio.checked = true;\n console.log(\"No features are enabled\");\n }\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) {\n this.mediaContents = this.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < this.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', this.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID);\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n };\n\n play = () => { \n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n globalThis.CastPlayer.addVideoThumbs();\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n"]} \ No newline at end of file +{"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../CastVideos.js"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","NgCastComponent","ngCastService","this","videoImage","imageOffline","srcImageOffline","prototype","ngOnInit","window","isAvailable","initializeCastApi","castingStatus","getStatus","openSession","discoverDevices","closeSession","tslib_1.__decorate","Input","Component","selector","template","NgCastService","_this","status","casting","onInitSuccess","console","log","onError","err","self","subj","Subject","cast","requestSession","s","session","setCasting","next","code","undefined","error","onMediaDiscovered","categories","script","createElement","setAttribute","body","appendChild","globalThis","CastPlayer","mediaJSON","addMediaContents","setupLocalPlayer","initializeUI","play","currentMedia","pause","stop","onMediaError","sessionRequest","SessionRequest","apiConfig","ApiConfig","ReceiverAvailability","AVAILABLE","initialize","value","Injectable","NgCastModule","NgModule","schemas","CUSTOM_ELEMENTS_SCHEMA","imports","CommonModule","exports","providers","declarations","PROGRESS_BAR_WIDTH","FULL_VOLUME_HEIGHT","PLAYER_STATE","playerHandler","PlayerHandler","playerState","playerStateBeforeSwitch","remotePlayer","remotePlayerController","currentMediaTime","mediaDuration","timer","incrementMediaTimeHandler","incrementMediaTime","bind","seekMediaListener","seekMedia","currentMediaIndex","mediaContents","fullscreen","mediaInfo","whenSkippable","liveSeekableRange","isLiveContent","initializeCastPlayer","options","receiverApplicationId","autoJoinPolicy","chrome","AutoJoinPolicy","ORIGIN_SCOPED","framework","CastContext","getInstance","setOptions","RemotePlayer","RemotePlayerController","addEventListener","RemotePlayerEventType","IS_CONNECTED_CHANGED","e","switchPlayer","stopProgressTimer","resetVolumeSlider","isConnected","setupRemotePlayer","castPlayer","setTarget","isMediaLoaded","document","getElementById","style","display","load","mediaIndex","prepareToPlay","getMediaDuration","updateDurationDisplay","startProgressTimer","updateDisplay","getCurrentMediaTime","updateCurrentTimeDisplay","setTimeString","element","time","setVolume","volumeSliderPosition","mute","unMute","isMuted","seekTo","localPlayer","onMediaLoadedLocally","playerTarget","src","currentTime","duration","updateDisplayMessage","volume","p","height","marginTop","muted","DEFAULT_VOLUME","showFullscreenButton","MEDIA_INFO_CHANGED","event","getCurrentSession","media","getMediaSession","streamType","StreamType","LIVE","removeAdMarkers","updateAdMarkers","CAN_SEEK_CHANGED","enableProgressBar","IS_PAUSED_CHANGED","isPaused","IS_MUTED_CHANGED","VOLUME_LEVEL_CHANGED","newVolume","volumeLevel","IS_PLAYING_BREAK_CHANGED","isPlayingBreak","WHEN_SKIPPABLE_CHANGED","onWhenSkippableChanged","CURRENT_BREAK_CLIP_TIME_CHANGED","onCurrentBreakClipTimeChanged","BREAK_CLIP_ID_CHANGED","onBreakClipIdChanged","LIVE_SEEKABLE_RANGE_CHANGED","playOrPause","MediaInfo","BUFFERED","metadata","TvShowMediaMetadata","title","subtitle","images","url","request","LoadRequest","ENABLE_ADS","breakClips","breakClipsJSON","breaks","breaksJSON","ENABLE_LIVE","Date","sectionStartAbsoluteTime","startAbsoluteTime","sectionStartTimeInMedia","sectionDuration","item","QueueItem","queueData","QueueData","items","name","autoplay","loadMedia","then","errorCode","getErrorMessage","castSession","vi","mediaTitle","mediaEpisodeTitle","mediaSubtitle","episodeTitle","DEMO_MODE","innerHTML","getCastDevice","friendlyName","live_indicator","Math","abs","getEstimatedTime","end","LIVE_INDICATOR_BUFFER","currentTimeString","getMediaTimeString","getClockTimeString","currentVolume","setVolumeLevel","muteOrUnmute","seek","canSeek","opacity","hideFullscreenButton","getSessionState","SessionState","SESSION_RESUMED","selectMedia","currentMediaInfo","marginLeft","width","seekable_window","unseekable_overlay","position","parseInt","offsetX","pi","progress","seekTime","pp","pw","currentTarget","id","mouseEvent","pos","offsetY","clientHeight","setInterval","clearInterval","updateProgressBarByTimer","endPlayback","progressBar","isNaN","floor","seekableMediaPosition","max","seekableWidth","unseekableMediaPosition","start","unseekableWidth","skip","seekable_window_1","unseekable_overlay_1","timestamp","isNegative","hours","minutes","seconds","date","getHours","getMinutes","getSeconds","ampm","slice","contentDuration","adBreak","isEmbedded","adPositionToMargin","querySelectorAll","forEach","adMarker","remove","currentBreakClipTime","skipAd","enable","progress_indicator","backgroundImage","cursor","draggable","removeEventListener","requestFullScreen","requestMethod","call","cancelFullScreen","fullscreenChangeHandler","fullscreen_expand","fullscreen_collapse","showMediaControl","media_control","hideMediaControl","context","showVolumeSlider","hideVolumeSlider","defaultVolumeSliderHeight","addVideoThumbs","ni","newdiv","divIdName","ErrorCode","API_NOT_INITIALIZED","description","CANCEL","CHANNEL_ERROR","EXTENSION_MISSING","INVALID_PARAMETER","RECEIVER_UNAVAILABLE","SESSION_ERROR","TIMEOUT"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n globalThis.CastPlayer.addMediaContents();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeUI();\n };\n\n play = () => { \n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n globalThis.CastPlayer.addMediaContents();\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = function () {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n this.remotePlayer = new cast.framework.RemotePlayer();\n this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer);\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n function (e) {\n this.switchPlayer(e.value);\n }.bind(this)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = function () {\n this.playerStateBeforeSwitch = this.playerState;\n\n this.stopProgressTimer();\n this.resetVolumeSlider();\n\n // Session is active\n if (cast && cast.framework && this.remotePlayer.isConnected) {\n // Pause local playback\n this.playerHandler.pause();\n this.setupRemotePlayer();\n } else {\n this.setupLocalPlayer();\n }\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n this.updateDurationDisplay = function () {\n this.target.updateDurationDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', this.onMediaLoadedLocally.bind(this));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function() {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function(mediaIndex) {\n localPlayer.src =\n this.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(this);\n\n playerTarget.getCurrentMediaTime = function() {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function() {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function(volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function() {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function() {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function() {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function(time) {\n localPlayer.currentTime = time;\n };\n\n this.playerHandler.setTarget(playerTarget);\n\n this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n this.showFullscreenButton();\n\n if (this.currentMediaTime > 0) {\n this.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n this.mediaInfo = media.media;\n\n if (this.mediaInfo) {\n this.isLiveContent = (this.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n this.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) {\n this.playerHandler.prepareToPlay();\n }\n\n this.removeAdMarkers();\n this.updateAdMarkers();\n\n this.playerHandler.updateDisplay();\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n this.enableProgressBar(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (this.remotePlayer.isPaused) {\n this.playerHandler.pause();\n } else if (this.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n this.playerHandler.play();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n } else {\n this.playerHandler.unMute();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n this.isPlayingBreak(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n this.onWhenSkippableChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n this.onCurrentBreakClipTimeChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n this.onBreakClipIdChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n this.liveSeekableRange = event.value;\n }.bind(this)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(this);\n\n playerTarget.pause = function () {\n if (!this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n }.bind(this);\n\n playerTarget.stop = function () {\n this.remotePlayerController.stop();\n }.bind(this);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n\n let mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;\n mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata();\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle'];\n mediaInfo.metadata.images = [{\n 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']\n }];\n\n let request = new chrome.cast.media.LoadRequest(mediaInfo);\n request.currentTime = this.currentMediaTime;\n\n if (ENABLE_ADS) {\n // Add sample breaks and breakClips.\n mediaInfo.breakClips = breakClipsJSON;\n mediaInfo.breaks = breaksJSON;\n } else if (ENABLE_LIVE) {\n // Change the streamType and add live specific metadata.\n mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;\n // TODO: Set the metadata on the receiver side in your implementation.\n // startAbsoluteTime and sectionStartTimeInMedia will be set for you.\n // See https://developers.google.com/cast/docs/caf_receiver/live.\n\n // TODO: Start time, is a fake timestamp. Use correct values for your implementation.\n let currentTime = new Date();\n // Convert from milliseconds to seconds.\n currentTime = currentTime / 1000;\n let sectionStartAbsoluteTime = currentTime;\n\n // Duration should be -1 for live streams.\n mediaInfo.duration = -1;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.startAbsoluteTime = currentTime;\n mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.metadata.sectionStartTimeInMedia = 0;\n mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration'];\n\n let item = new chrome.cast.media.QueueItem(mediaInfo);\n request.queueData = new chrome.cast.media.QueueData();\n request.queueData.items = [item];\n request.queueData.name = \"Sample Queue for Live\";\n }\n\n // Do not immediately start playing if the player was previously PAUSED.\n if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) {\n request.autoplay = false;\n } else {\n request.autoplay = true;\n }\n\n cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(\n function () {\n console.log('Remote media loaded');\n }.bind(this),\n function (errorCode) {\n this.playerState = PLAYER_STATE.IDLE;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n this.playerHandler.updateDisplay();\n }.bind(this));\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(this);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (this.isLiveContent && this.mediaInfo.metadata &&\n this.mediaInfo.metadata.sectionStartTimeInMedia) {\n return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return this.remotePlayer.currentTime;\n }\n }.bind(this);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (this.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (this.mediaInfo.metadata == undefined ||\n this.mediaInfo.metadata.sectionDuration == undefined ||\n this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return this.mediaInfo.metadata.sectionDuration;\n } else {\n return this.remotePlayer.duration;\n }\n }.bind(this);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n this.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(this);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime());\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration());\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n\n if (this.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = this.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n this.remotePlayer.volumeLevel = currentVolume;\n this.remotePlayerController.setVolumeLevel();\n }.bind(this);\n\n playerTarget.mute = function () {\n if (!this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.unMute = function () {\n if (this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.isMuted = function () {\n return this.remotePlayer.isMuted;\n }.bind(this);\n\n playerTarget.seekTo = function (time) {\n this.remotePlayer.currentTime = time;\n this.remotePlayerController.seek();\n }.bind(this);\n\n this.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n }\n this.enableProgressBar(this.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n this.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n this.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n this.removeAdMarkers();\n this.updateAdMarkers();\n } else {\n this.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = this.currentMediaTime;\n\n this.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n this.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n this.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n this.stopProgressTimer();\n this.currentMediaTime = 0;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n this.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (this.isLiveContent && !this.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (this.playerState === PLAYER_STATE.PLAYING ||\n this.playerState === PLAYER_STATE.PAUSED) {\n this.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (this.isLiveContent) {\n seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n this.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n this.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n this.stopProgressTimer();\n\n // Start progress timer\n this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n this.currentMediaTime = this.playerHandler.getCurrentMediaTime();\n this.mediaDuration = this.playerHandler.getMediaDuration();\n\n this.playerHandler.updateDurationDisplay();\n\n if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) {\n this.playerHandler.updateCurrentTimeDisplay();\n this.updateProgressBarByTimer();\n } else if (this.mediaDuration > 0) {\n this.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (this.mediaDuration == null) {\n if (!this.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n \n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n \n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (this.isLiveContent) {\n if (this.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) {\n this.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n this.currentMediaTime = 0;\n this.stopProgressTimer();\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n this.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n this.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (this.whenSkippable == undefined || this.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n this.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', this.seekMediaListener);\n seekable_window.addEventListener('click', this.seekMediaListener);\n progress_indicator.addEventListener('dragend', this.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', this.seekMediaListener);\n seekable_window.removeEventListener('click', this.seekMediaListener);\n progress_indicator.removeEventListener('dragend', this.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n this.fullscreen = !this.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (this.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block'; \n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!this.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = function () {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n this.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n this.mediaContents[this.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n this.mediaContents[this.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', this.seekMedia.bind(this));\n document.getElementById('progress').addEventListener(\n 'click', this.seekMedia.bind(this));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', this.seekMedia.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'click', this.playerHandler.mute.bind(this.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', this.playerHandler.unMute.bind(this.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('main_video').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('main_video').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', this.requestFullScreen.bind(this));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', this.cancelFullScreen.bind(this));\n document.addEventListener(\n 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n document.addEventListener(\n 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', this.playerHandler.play.bind(this.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', this.playerHandler.pause.bind(this.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) {\n this.mediaContents = this.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < this.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', this.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = function () {\n if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) {\n this.mediaContents = this.mediaJSON['categories'][0]['videos']; \n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n"]} \ No newline at end of file diff --git a/dist/esm2015/index.js b/dist/esm2015/index.js index e809f24..67e0e97 100644 --- a/dist/esm2015/index.js +++ b/dist/esm2015/index.js @@ -1,5 +1,5 @@ -// ------ project path -------- | --- lib --- -import "/home/thinker/dev/thinkam/ngCast/CastVideos.js"; export * from './ng.cast.module'; export * from './shared/ng-cast.service'; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBUSw2Q0FBNkM7QUFDckQsT0FBTyxnREFBZ0QsQ0FBQztBQUV4RCxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIgICAgICAgIC8vIC0tLS0tLSBwcm9qZWN0IHBhdGggLS0tLS0tLS0gfCAtLS0gbGliIC0tLVxuaW1wb3J0IFwiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvQ2FzdFZpZGVvcy5qc1wiO1xuXG5leHBvcnQgKiBmcm9tICcuL25nLmNhc3QubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vc2hhcmVkL25nLWNhc3Quc2VydmljZSc7XG4iXX0= \ No newline at end of file +// ------ project path -------- | --- lib --- +import "/home/thinker/dev/thinkam/ngCast/CastVideos.js"; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsMEJBQTBCLENBQUM7QUFFekMsNkNBQTZDO0FBQzdDLE9BQU8sZ0RBQWdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL25nLmNhc3QubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vc2hhcmVkL25nLWNhc3Quc2VydmljZSc7XG5cbi8vIC0tLS0tLSBwcm9qZWN0IHBhdGggLS0tLS0tLS0gfCAtLS0gbGliIC0tLVxuaW1wb3J0IFwiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvQ2FzdFZpZGVvcy5qc1wiO1xuIl19 \ No newline at end of file diff --git a/dist/esm2015/ng-cast.component.js b/dist/esm2015/ng-cast.component.js index 30e44b4..43fe3ca 100644 --- a/dist/esm2015/ng-cast.component.js +++ b/dist/esm2015/ng-cast.component.js @@ -1,8 +1,11 @@ import * as tslib_1 from "tslib"; -import { Component } from '@angular/core'; +import { Component, Input } from '@angular/core'; let NgCastComponent = class NgCastComponent { constructor(ngCastService) { this.ngCastService = ngCastService; + this.videoImage = ''; + this.imageOffline = false; + this.srcImageOffline = ''; } ngOnInit() { this.window = window; @@ -21,12 +24,21 @@ let NgCastComponent = class NgCastComponent { this.ngCastService.discoverDevices(); } }; +tslib_1.__decorate([ + Input() +], NgCastComponent.prototype, "videoImage", void 0); +tslib_1.__decorate([ + Input() +], NgCastComponent.prototype, "imageOffline", void 0); +tslib_1.__decorate([ + Input() +], NgCastComponent.prototype, "srcImageOffline", void 0); NgCastComponent = tslib_1.__decorate([ Component({ selector: 'ng-cast', - template: "cast\ncast_connected", + template: "
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", styles: [""] }) ], NgCastComponent); export { NgCastComponent }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJuZy1jYXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQVdsRCxJQUFhLGVBQWUsR0FBNUIsTUFBYSxlQUFlO0lBSTFCLFlBQ1UsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7SUFDbEMsQ0FBQztJQUVMLFFBQVE7UUFDTixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsR0FBRyxVQUFVLFdBQW9CO1lBQ25FLElBQUksV0FBVyxFQUFFO2dCQUNmLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ25DO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkMsQ0FBQztDQUVGLENBQUE7QUE3QlksZUFBZTtJQVAzQixTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsU0FBUztRQUNuQixzTkFBdUM7O0tBSXhDLENBQUM7R0FDVyxlQUFlLENBNkIzQjtTQTdCWSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTmdDYXN0U2VydmljZSB9IGZyb20gJy4vc2hhcmVkL25nLWNhc3Quc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nLWNhc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbmctY2FzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW1xuICAgICcuL25nLWNhc3QuY29tcG9uZW50LnNjc3MnXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTmdDYXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY2FzdGluZ1N0YXR1czogYW55O1xuICB3aW5kb3c6IGFueTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nQ2FzdFNlcnZpY2U6IE5nQ2FzdFNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLndpbmRvdyA9IHdpbmRvdztcblxuICAgIGxldCBuZ0Nhc3RTZXJ2aWNlID0gdGhpcy5uZ0Nhc3RTZXJ2aWNlO1xuICAgIHRoaXMud2luZG93WydfX29uR0Nhc3RBcGlBdmFpbGFibGUnXSA9IGZ1bmN0aW9uIChpc0F2YWlsYWJsZTogYm9vbGVhbikge1xuICAgICAgaWYgKGlzQXZhaWxhYmxlKSB7XG4gICAgICAgIG5nQ2FzdFNlcnZpY2UuaW5pdGlhbGl6ZUNhc3RBcGkoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5jYXN0aW5nU3RhdHVzID0gdGhpcy5uZ0Nhc3RTZXJ2aWNlLmdldFN0YXR1cygpO1xuICB9XG5cbiAgb3BlblNlc3Npb24oKSB7XG4gICAgdGhpcy5uZ0Nhc3RTZXJ2aWNlLmRpc2NvdmVyRGV2aWNlcygpO1xuICB9XG5cbiAgY2xvc2VTZXNzaW9uKCkge1xuICAgIHRoaXMubmdDYXN0U2VydmljZS5kaXNjb3ZlckRldmljZXMoKTtcbiAgfVxuXG59XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJuZy1jYXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFXekQsSUFBYSxlQUFlLEdBQTVCLE1BQWEsZUFBZTtJQVExQixZQUNVLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBTDdCLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsb0JBQWUsR0FBRyxFQUFFLENBQUM7SUFJMUIsQ0FBQztJQUVMLFFBQVE7UUFDTixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsR0FBRyxVQUFVLFdBQW9CO1lBQ25FLElBQUksV0FBVyxFQUFFO2dCQUNmLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ25DO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkMsQ0FBQztDQUVGLENBQUE7QUE3QlU7SUFBUixLQUFLLEVBQUU7bURBQWlCO0FBQ2hCO0lBQVIsS0FBSyxFQUFFO3FEQUFzQjtBQUNyQjtJQUFSLEtBQUssRUFBRTt3REFBc0I7QUFObkIsZUFBZTtJQVAzQixTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsU0FBUztRQUNuQixvMkNBQXVDOztLQUl4QyxDQUFDO0dBQ1csZUFBZSxDQWlDM0I7U0FqQ1ksZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBOZ0Nhc3RTZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvbmctY2FzdC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctY2FzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZy1jYXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXG4gICAgJy4vbmctY2FzdC5jb21wb25lbnQuc2NzcydcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ0Nhc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBjYXN0aW5nU3RhdHVzOiBhbnk7XG4gIHdpbmRvdzogYW55O1xuXG4gIEBJbnB1dCgpIHZpZGVvSW1hZ2UgPSAnJztcbiAgQElucHV0KCkgaW1hZ2VPZmZsaW5lID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNyY0ltYWdlT2ZmbGluZSA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbmdDYXN0U2VydmljZTogTmdDYXN0U2VydmljZVxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMud2luZG93ID0gd2luZG93O1xuXG4gICAgbGV0IG5nQ2FzdFNlcnZpY2UgPSB0aGlzLm5nQ2FzdFNlcnZpY2U7XG4gICAgdGhpcy53aW5kb3dbJ19fb25HQ2FzdEFwaUF2YWlsYWJsZSddID0gZnVuY3Rpb24gKGlzQXZhaWxhYmxlOiBib29sZWFuKSB7XG4gICAgICBpZiAoaXNBdmFpbGFibGUpIHtcbiAgICAgICAgbmdDYXN0U2VydmljZS5pbml0aWFsaXplQ2FzdEFwaSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmNhc3RpbmdTdGF0dXMgPSB0aGlzLm5nQ2FzdFNlcnZpY2UuZ2V0U3RhdHVzKCk7XG4gIH1cblxuICBvcGVuU2Vzc2lvbigpIHtcbiAgICB0aGlzLm5nQ2FzdFNlcnZpY2UuZGlzY292ZXJEZXZpY2VzKCk7XG4gIH1cblxuICBjbG9zZVNlc3Npb24oKSB7XG4gICAgdGhpcy5uZ0Nhc3RTZXJ2aWNlLmRpc2NvdmVyRGV2aWNlcygpO1xuICB9XG5cbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/esm2015/shared/ng-cast.service.js b/dist/esm2015/shared/ng-cast.service.js index b823e94..64c3a2c 100644 --- a/dist/esm2015/shared/ng-cast.service.js +++ b/dist/esm2015/shared/ng-cast.service.js @@ -38,6 +38,9 @@ let NgCastService = class NgCastService { script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1'); window['document'].body.appendChild(script); globalThis.CastPlayer.mediaJSON.categories = categories; + globalThis.CastPlayer.addMediaContents(); + globalThis.CastPlayer.setupLocalPlayer(); + globalThis.CastPlayer.initializeUI(); }; this.play = () => { this.currentMedia.play(null); @@ -57,13 +60,13 @@ let NgCastService = class NgCastService { } initializeCastApi() { this.cast = this.window['chrome'].cast; - let sessionRequest = new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID); + let sessionRequest = new this.cast.SessionRequest('4F8B3483'); let apiConfig = new this.cast.ApiConfig(sessionRequest, () => { }, (status) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }); let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError); } ; setCasting(value) { - globalThis.CastPlayer.addVideoThumbs(); + globalThis.CastPlayer.addMediaContents(); this.status.casting = value; } getStatus() { @@ -74,4 +77,4 @@ NgCastService = tslib_1.__decorate([ Injectable() ], NgCastService); export { NgCastService }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3RoaW5rZXIvZGV2L3RoaW5rYW0vbmdDYXN0LyIsInNvdXJjZXMiOlsic2hhcmVkL25nLWNhc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTy9CLElBQWEsYUFBYSxHQUExQixNQUFhLGFBQWE7SUFTeEI7UUFOUSxXQUFNLEdBQVEsTUFBTSxDQUFDO1FBRXRCLFdBQU0sR0FBRztZQUNkLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztRQWtCRixrQkFBYSxHQUFHO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQztRQUVGLFlBQU8sR0FBRyxVQUFVLEdBQVE7WUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUM7UUFFRixvQkFBZSxHQUFHLEdBQUcsRUFBRTtZQUNyQixJQUFJLElBQUksR0FBUSxJQUFJLENBQUM7WUFDckIsSUFBSSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QixDQUFDLEVBQUUsVUFBVSxHQUFRO2dCQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO29C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IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgdmFyIENhc3RQbGF5ZXI6IGFueTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5nQ2FzdFNlcnZpY2Uge1xuICBwcml2YXRlIGNhc3Q6IGFueTtcbiAgcHJpdmF0ZSBjdXJyZW50TWVkaWE6IGFueTtcbiAgcHJpdmF0ZSB3aW5kb3c6IGFueSA9IHdpbmRvdztcblxuICBwdWJsaWMgc3RhdHVzID0ge1xuICAgIGNhc3Rpbmc6IGZhbHNlXG4gIH07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLm1lZGlhSlNPTiA9IHtcbiAgICAgIGNhdGVnb3JpZXM6IFtdXG4gICAgfTtcbiAgfVxuXG4gIGluaXRpYWxpemVDYXN0QXBpKCkge1xuICAgIHRoaXMuY2FzdCA9IHRoaXMud2luZG93WydjaHJvbWUnXS5jYXN0O1xuICAgIGxldCBzZXNzaW9uUmVxdWVzdCA9IG5ldyB0aGlzLmNhc3QuU2Vzc2lvblJlcXVlc3QodGhpcy5jYXN0Lm1lZGlhLkRFRkFVTFRfTUVESUFfUkVDRUlWRVJfQVBQX0lEKTtcbiAgICBsZXQgYXBpQ29uZmlnID0gbmV3IHRoaXMuY2FzdC5BcGlDb25maWcoc2Vzc2lvblJlcXVlc3QsXG4gICAgICAoKSA9PiB7IH0sXG4gICAgICAoc3RhdHVzOiBhbnkpID0+IHsgaWYgKHN0YXR1cyA9PT0gdGhpcy5jYXN0LlJlY2VpdmVyQXZhaWxhYmlsaXR5LkFWQUlMQUJMRSkgeyB9IH1cbiAgICApO1xuICAgIGxldCB4ID0gdGhpcy5jYXN0LmluaXRpYWxpemUoYXBpQ29uZmlnLCB0aGlzLm9uSW5pdFN1Y2Nlc3MsIHRoaXMub25FcnJvcik7XG4gIH07XG5cbiAgb25Jbml0U3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zb2xlLmxvZygnR0Nhc3QgaW5pdGlhbGl6YXRpb24gc3VjY2VzcycpO1xuICB9O1xuXG4gIG9uRXJyb3IgPSBmdW5jdGlvbiAoZXJyOiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZygnR0Nhc3QgaW5pdGlhbGl6YXRpb24gZmFpbGVkJywgZXJyKTtcbiAgfTtcblxuICBkaXNjb3ZlckRldmljZXMgPSAoKSA9PiB7XG4gICAgbGV0IHNlbGY6IGFueSA9IHRoaXM7XG4gICAgbGV0IHN1YmogPSBuZXcgU3ViamVjdCgpO1xuICAgIHRoaXMuY2FzdC5yZXF1ZXN0U2Vzc2lvbigoczogYW55KSA9PiB7XG4gICAgICBzZWxmLnNlc3Npb24gPSBzO1xuICAgICAgc2VsZi5zZXRDYXN0aW5nKHRydWUpO1xuICAgICAgc3Viai5uZXh0KCdDT05ORUNURUQnKTtcbiAgICB9LCBmdW5jdGlvbiAoZXJyOiBhbnkpIHtcbiAgICAgIHNlbGYuc2V0Q2FzdGluZyhmYWxzZSk7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdjYW5jZWwnKSB7XG4gICAgICAgIHNlbGYuc2Vzc2lvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgc3Viai5uZXh0KCdDQU5DRUwnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHNlbGVjdGluZyBhIGNhc3QgZGV2aWNlJywgZXJyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3ViajtcbiAgfTtcblxuICBvbk1lZGlhRGlzY292ZXJlZCA9IChjYXRlZ29yaWVzOiBhbnlbXSkgPT4ge1xuICAgIGxldCBzY3JpcHQgPSB3aW5kb3dbJ2RvY3VtZW50J10uY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTtcbiAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCdzcmMnLCAnaHR0cHM6Ly93d3cuZ3N0YXRpYy5jb20vY3YvanMvc2VuZGVyL3YxL2Nhc3Rfc2VuZGVyLmpzP2xvYWRDYXN0RnJhbWV3b3JrPTEnKTtcbiAgICB3aW5kb3dbJ2RvY3VtZW50J10uYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuXG4gICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLm1lZGlhSlNPTi5jYXRlZ29yaWVzID0gY2F0ZWdvcmllcztcbiAgfTtcblxuICBwbGF5ID0gKCkgPT4geyAgICBcbiAgICB0aGlzLmN1cnJlbnRNZWRpYS5wbGF5KG51bGwpO1xuICB9O1xuXG4gIHBhdXNlID0gKCkgPT4ge1xuICAgIHRoaXMuY3VycmVudE1lZGlhLnBhdXNlKG51bGwpO1xuICB9O1xuXG4gIHN0b3AgPSAoKSA9PiB7XG4gICAgdGhpcy5jdXJyZW50TWVkaWEuc3RvcChudWxsKTtcbiAgfTtcblxuICBvbk1lZGlhRXJyb3IgPSAoZXJyOiBhbnkpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsYXVuY2hpbmcgbWVkaWEnLCBlcnIpO1xuICB9O1xuXG4gIHNldENhc3RpbmcodmFsdWU6IGFueSkge1xuICAgIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5hZGRWaWRlb1RodW1icygpO1xuICAgIHRoaXMuc3RhdHVzLmNhc3RpbmcgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldFN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXNcbiAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3RoaW5rZXIvZGV2L3RoaW5rYW0vbmdDYXN0LyIsInNvdXJjZXMiOlsic2hhcmVkL25nLWNhc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTy9CLElBQWEsYUFBYSxHQUExQixNQUFhLGFBQWE7SUFTeEI7UUFOUSxXQUFNLEdBQVEsTUFBTSxDQUFDO1FBRXRCLFdBQU0sR0FBRztZQUNkLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztRQWtCRixrQkFBYSxHQUFHO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQztRQUVGLFlBQU8sR0FBRyxVQUFVLEdBQVE7WUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUM7UUFFRixvQkFBZSxHQUFHLEdBQUcsRUFBRTtZQUNyQixJQUFJLElBQUksR0FBUSxJQUFJLENBQUM7WUFDckIsSUFBSSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QixDQUFDLEVBQUUsVUFBVSxHQUFRO2dCQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO29C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O0FBekZZLGFBQWE7SUFEekIsVUFBVSxFQUFFO0dBQ0EsYUFBYSxDQXlGekI7U0F6RlksYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIHZhciBDYXN0UGxheWVyOiBhbnk7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ0Nhc3RTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjYXN0OiBhbnk7XG4gIHByaXZhdGUgY3VycmVudE1lZGlhOiBhbnk7XG4gIHByaXZhdGUgd2luZG93OiBhbnkgPSB3aW5kb3c7XG5cbiAgcHVibGljIHN0YXR1cyA9IHtcbiAgICBjYXN0aW5nOiBmYWxzZVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5tZWRpYUpTT04gPSB7XG4gICAgICBjYXRlZ29yaWVzOiBbXVxuICAgIH07XG4gIH1cblxuICBpbml0aWFsaXplQ2FzdEFwaSgpIHtcbiAgICB0aGlzLmNhc3QgPSB0aGlzLndpbmRvd1snY2hyb21lJ10uY2FzdDtcbiAgICBsZXQgc2Vzc2lvblJlcXVlc3QgPSBuZXcgdGhpcy5jYXN0LlNlc3Npb25SZXF1ZXN0KCc0RjhCMzQ4MycpO1xuICAgIGxldCBhcGlDb25maWcgPSBuZXcgdGhpcy5jYXN0LkFwaUNvbmZpZyhzZXNzaW9uUmVxdWVzdCxcbiAgICAgICgpID0+IHsgfSxcbiAgICAgIChzdGF0dXM6IGFueSkgPT4geyBpZiAoc3RhdHVzID09PSB0aGlzLmNhc3QuUmVjZWl2ZXJBdmFpbGFiaWxpdHkuQVZBSUxBQkxFKSB7IH0gfVxuICAgICk7XG4gICAgbGV0IHggPSB0aGlzLmNhc3QuaW5pdGlhbGl6ZShhcGlDb25maWcsIHRoaXMub25Jbml0U3VjY2VzcywgdGhpcy5vbkVycm9yKTtcbiAgfTtcblxuICBvbkluaXRTdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUubG9nKCdHQ2FzdCBpbml0aWFsaXphdGlvbiBzdWNjZXNzJyk7XG4gIH07XG5cbiAgb25FcnJvciA9IGZ1bmN0aW9uIChlcnI6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCdHQ2FzdCBpbml0aWFsaXphdGlvbiBmYWlsZWQnLCBlcnIpO1xuICB9O1xuXG4gIGRpc2NvdmVyRGV2aWNlcyA9ICgpID0+IHtcbiAgICBsZXQgc2VsZjogYW55ID0gdGhpcztcbiAgICBsZXQgc3ViaiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgdGhpcy5jYXN0LnJlcXVlc3RTZXNzaW9uKChzOiBhbnkpID0+IHtcbiAgICAgIHNlbGYuc2Vzc2lvbiA9IHM7XG4gICAgICBzZWxmLnNldENhc3RpbmcodHJ1ZSk7XG4gICAgICBzdWJqLm5leHQoJ0NPTk5FQ1RFRCcpO1xuICAgIH0sIGZ1bmN0aW9uIChlcnI6IGFueSkge1xuICAgICAgc2VsZi5zZXRDYXN0aW5nKGZhbHNlKTtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ2NhbmNlbCcpIHtcbiAgICAgICAgc2VsZi5zZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBzdWJqLm5leHQoJ0NBTkNFTCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc2VsZWN0aW5nIGEgY2FzdCBkZXZpY2UnLCBlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzdWJqO1xuICB9O1xuXG4gIG9uTWVkaWFEaXNjb3ZlcmVkID0gKGNhdGVnb3JpZXM6IGFueVtdKSA9PiB7XG4gICAgbGV0IHNjcmlwdCA9IHdpbmRvd1snZG9jdW1lbnQnXS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvamF2YXNjcmlwdCcpO1xuICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3NyYycsICdodHRwczovL3d3dy5nc3RhdGljLmNvbS9jdi9qcy9zZW5kZXIvdjEvY2FzdF9zZW5kZXIuanM/bG9hZENhc3RGcmFtZXdvcms9MScpO1xuICAgIHdpbmRvd1snZG9jdW1lbnQnXS5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIubWVkaWFKU09OLmNhdGVnb3JpZXMgPSBjYXRlZ29yaWVzO1xuXG4gICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLmFkZE1lZGlhQ29udGVudHMoKTtcbiAgICBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIuc2V0dXBMb2NhbFBsYXllcigpO1xuICAgIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5pbml0aWFsaXplVUkoKTtcbiAgfTtcblxuICBwbGF5ID0gKCkgPT4geyAgICBcbiAgICB0aGlzLmN1cnJlbnRNZWRpYS5wbGF5KG51bGwpO1xuICB9O1xuXG4gIHBhdXNlID0gKCkgPT4ge1xuICAgIHRoaXMuY3VycmVudE1lZGlhLnBhdXNlKG51bGwpO1xuICB9O1xuXG4gIHN0b3AgPSAoKSA9PiB7XG4gICAgdGhpcy5jdXJyZW50TWVkaWEuc3RvcChudWxsKTtcbiAgfTtcblxuICBvbk1lZGlhRXJyb3IgPSAoZXJyOiBhbnkpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsYXVuY2hpbmcgbWVkaWEnLCBlcnIpO1xuICB9O1xuXG4gIHNldENhc3RpbmcodmFsdWU6IGFueSkge1xuICAgIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5hZGRNZWRpYUNvbnRlbnRzKCk7XG4gICAgdGhpcy5zdGF0dXMuY2FzdGluZyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0U3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXR1c1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/dist/fesm2015/thinkam.net-ng-cast.js b/dist/fesm2015/thinkam.net-ng-cast.js index 3e49718..cdf7ad2 100644 --- a/dist/fesm2015/thinkam.net-ng-cast.js +++ b/dist/fesm2015/thinkam.net-ng-cast.js @@ -1,64 +1,165 @@ import { __decorate } from 'tslib'; -import { Component, Injectable, NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { Input, Component, Injectable, NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { CommonModule } from '@angular/common'; import { Subject } from 'rxjs'; -'use strict'; - -/** Cleaner UI for demo purposes. */ -const DEMO_MODE = false; +let NgCastComponent = class NgCastComponent { + constructor(ngCastService) { + this.ngCastService = ngCastService; + this.videoImage = ''; + this.imageOffline = false; + this.srcImageOffline = ''; + } + ngOnInit() { + this.window = window; + let ngCastService = this.ngCastService; + this.window['__onGCastApiAvailable'] = function (isAvailable) { + if (isAvailable) { + ngCastService.initializeCastApi(); + } + }; + this.castingStatus = this.ngCastService.getStatus(); + } + openSession() { + this.ngCastService.discoverDevices(); + } + closeSession() { + this.ngCastService.discoverDevices(); + } +}; +__decorate([ + Input() +], NgCastComponent.prototype, "videoImage", void 0); +__decorate([ + Input() +], NgCastComponent.prototype, "imageOffline", void 0); +__decorate([ + Input() +], NgCastComponent.prototype, "srcImageOffline", void 0); +NgCastComponent = __decorate([ + Component({ + selector: 'ng-cast', + template: "
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", + styles: [""] + }) +], NgCastComponent); -/** @const {string} Media source root URL */ -const MEDIA_SOURCE_ROOT = 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/'; +let NgCastService = class NgCastService { + constructor() { + this.window = window; + this.status = { + casting: false + }; + this.onInitSuccess = function () { + console.log('GCast initialization success'); + }; + this.onError = function (err) { + console.log('GCast initialization failed', err); + }; + this.discoverDevices = () => { + let self = this; + let subj = new Subject(); + this.cast.requestSession((s) => { + self.session = s; + self.setCasting(true); + subj.next('CONNECTED'); + }, function (err) { + self.setCasting(false); + if (err.code === 'cancel') { + self.session = undefined; + subj.next('CANCEL'); + } + else { + console.error('Error selecting a cast device', err); + } + }); + return subj; + }; + this.onMediaDiscovered = (categories) => { + let script = window['document'].createElement('script'); + script.setAttribute('type', 'text/javascript'); + script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1'); + window['document'].body.appendChild(script); + globalThis.CastPlayer.mediaJSON.categories = categories; + globalThis.CastPlayer.addMediaContents(); + globalThis.CastPlayer.setupLocalPlayer(); + globalThis.CastPlayer.initializeUI(); + }; + this.play = () => { + this.currentMedia.play(null); + }; + this.pause = () => { + this.currentMedia.pause(null); + }; + this.stop = () => { + this.currentMedia.stop(null); + }; + this.onMediaError = (err) => { + console.error('Error launching media', err); + }; + globalThis.CastPlayer.mediaJSON = { + categories: [] + }; + } + initializeCastApi() { + this.cast = this.window['chrome'].cast; + let sessionRequest = new this.cast.SessionRequest('4F8B3483'); + let apiConfig = new this.cast.ApiConfig(sessionRequest, () => { }, (status) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }); + let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError); + } + ; + setCasting(value) { + globalThis.CastPlayer.addMediaContents(); + this.status.casting = value; + } + getStatus() { + return this.status; + } +}; +NgCastService = __decorate([ + Injectable() +], NgCastService); -/** - * Controls if Ads are enabled. Controlled by radio button. - * @type {boolean} - */ -let ENABLE_ADS = false; +let NgCastModule = class NgCastModule { +}; +NgCastModule = __decorate([ + NgModule({ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [ + CommonModule + ], + exports: [NgCastComponent], + providers: [NgCastService], + declarations: [NgCastComponent] + }) +], NgCastModule); -/** - * Controls if Live stream is played. Controlled by radio button. - * @type {boolean} - */ -let ENABLE_LIVE = false; +"use strict"; -/** - * Buffer to decide if the live indicator should be displayed to show that - * playback is at the playback head. - * @const {number} - */ -const LIVE_INDICATOR_BUFFER = 50; +/** @const {string} Media source root URL */ +const MEDIA_SOURCE_ROOT = ''; /** - * Width of progress bar in pixels. - * @const {number} + * Width of progress bar in pixel + * @const */ -const PROGRESS_BAR_WIDTH = 700; +var PROGRESS_BAR_WIDTH = 600; -/** - * Time in milliseconds for minimal progress update. - * @const {number} - */ -const TIMER_STEP = 1000; +/** @const {number} Time in milliseconds for minimal progress update */ +var TIMER_STEP = 1000; -/** - * Cast volume upon initial connection. - * @const {number} - */ -const DEFAULT_VOLUME = 0.5; +/** @const {number} Cast volume upon initial connection */ +var DEFAULT_VOLUME = 0.5; -/** - * Height, in pixels, of volume bar. - * @const {number} - */ -const FULL_VOLUME_HEIGHT = 100; +/** @const {number} Height, in pixels, of volume bar */ +var FULL_VOLUME_HEIGHT = 100; /** @enum {string} Constants of states for media for both local and remote playback */ const PLAYER_STATE = { // No media is loaded into the player. For remote playback, maps to // the PlayerState.IDLE state. IDLE: 'IDLE', + LOADING: 'LOADING', // Player is in PLAY mode but not actively playing content. For remote // playback, maps to the PlayerState.BUFFERING state. BUFFERING: 'BUFFERING', @@ -67,7 +168,9 @@ const PLAYER_STATE = { // The media is playing. For remote playback, maps to the PlayerState.PLAYING state. PLAYING: 'PLAYING', // The media is paused. For remote playback, maps to the PlayerState.PAUSED state. - PAUSED: 'PAUSED' + PAUSED: 'PAUSED', + STOPPED: 'STOPPED', + ERROR: 'ERROR' }; /** @@ -140,10 +243,6 @@ var CastPlayer = function () { /** @type {boolean} Remote player is playing live content. */ this.isLiveContent = false; - this.setupLocalPlayer(); - this.addVideoThumbs(); - this.initializeUI(); - this.mediaJSON = { 'categories': [] }; @@ -155,7 +254,7 @@ CastPlayer.prototype.initializeCastPlayer = function () { // Set the receiver application ID to your own (created in the // Google Cast Developer Console), or optionally // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID - options.receiverApplicationId = 'C0868879'; + options.receiverApplicationId = '4F8B3483'; // Auto join policy can be one of the following three: // ORIGIN_SCOPED - Auto connect from same appId and page origin @@ -352,121 +451,71 @@ var PlayerHandler = function (castPlayer) { * Set the PlayerHandler target to use the video-element player */ CastPlayer.prototype.setupLocalPlayer = function () { - // Cleanup remote player UI - let live_indicator = document.getElementById('live_indicator'); - if (live_indicator && live_indicator.style && live_indicator.style.display) { - live_indicator.style.display = 'none'; - } - - this.removeAdMarkers(); - document.getElementById('skip').style.display = 'none'; - var localPlayer = document.getElementById('video_element'); - if (typeof localPlayer !== 'undefined' && localPlayer) - localPlayer.addEventListener( + localPlayer.addEventListener( 'loadeddata', this.onMediaLoadedLocally.bind(this)); // This object will implement PlayerHandler callbacks with localPlayer var playerTarget = {}; - playerTarget.play = function () { - localPlayer.play(); + playerTarget.play = function() { + localPlayer.play(); - var vi = document.getElementById('video_image'); - vi.style.display = 'none'; - localPlayer.style.display = 'block'; + var vi = document.getElementById('video_image'); + vi.style.display = 'none'; + localPlayer.style.display = 'block'; }; playerTarget.pause = function () { - localPlayer.pause(); + localPlayer.pause(); }; playerTarget.stop = function () { - localPlayer.stop(); + localPlayer.stop(); }; - playerTarget.load = function (mediaIndex) { - localPlayer.src = this.mediaContents[mediaIndex]['sources'][0]; - localPlayer.load(); + playerTarget.load = function(mediaIndex) { + localPlayer.src = + this.mediaContents[mediaIndex]['sources'][0]; + localPlayer.load(); }.bind(this); - playerTarget.isMediaLoaded = function (mediaIndex) { - if (!mediaIndex) { - return (localPlayer.src !== null && localPlayer.src !== ""); - } else { - return (localPlayer.src == this.mediaContents[mediaIndex]['sources'][0]); - } - }.bind(this); - - playerTarget.getCurrentMediaTime = function () { - return localPlayer.currentTime; + playerTarget.getCurrentMediaTime = function() { + return localPlayer.currentTime; }; - playerTarget.getMediaDuration = function () { - return localPlayer.duration; + playerTarget.getMediaDuration = function() { + return localPlayer.duration; }; - playerTarget.updateDisplay = function () { - // playerstate view - document.getElementById('playerstate').style.display = 'none'; - document.getElementById('playerstatebg').style.display = 'none'; - document.getElementById('video_image_overlay').style.display = 'none'; - - // media_info view - document.getElementById('media_title').innerHTML = - castPlayer.mediaContents[castPlayer.currentMediaIndex]['title']; - document.getElementById('media_subtitle').innerHTML = - castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle']; + playerTarget.updateDisplayMessage = function () { + document.getElementById('playerstate').style.display = 'none'; + document.getElementById('playerstatebg').style.display = 'none'; + document.getElementById('video_image_overlay').style.display = 'none'; }; - playerTarget.updateCurrentTimeDisplay = function () { - // Increment for local playback - this.currentMediaTime += 1; - this.playerHandler.setTimeString(document.getElementById('currentTime'), this.currentMediaTime); - }.bind(this); - - playerTarget.updateDurationDisplay = function () { - this.playerHandler.setTimeString(document.getElementById('duration'), this.mediaDuration); - }.bind(this); - - playerTarget.setTimeString = function (element, time) { - let currentTimeString = this.getMediaTimeString(time); - if (currentTimeString !== null) { - element.style.display = ''; - element.innerHTML = currentTimeString; - } else { - element.style.display = 'none'; - } - }.bind(this); - - playerTarget.setVolume = function (volumeSliderPosition) { - if (localPlayer) { + playerTarget.setVolume = function(volumeSliderPosition) { localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ? - volumeSliderPosition / FULL_VOLUME_HEIGHT : 1; - } - - var p = document.getElementById('audio_bg_level'); - if (typeof p !== 'undefined' && p) { + volumeSliderPosition / FULL_VOLUME_HEIGHT : 1; + var p = document.getElementById('audio_bg_level'); p.style.height = volumeSliderPosition + 'px'; p.style.marginTop = -volumeSliderPosition + 'px'; - } }; - playerTarget.mute = function () { - localPlayer.muted = true; + playerTarget.mute = function() { + localPlayer.muted = true; }; - playerTarget.unMute = function () { - localPlayer.muted = false; + playerTarget.unMute = function() { + localPlayer.muted = false; }; - playerTarget.isMuted = function () { - if (localPlayer) + playerTarget.isMuted = function() { return localPlayer.muted; }; - playerTarget.seekTo = function (time) { - localPlayer.currentTime = time; + playerTarget.seekTo = function(time) { + localPlayer.currentTime = time; }; this.playerHandler.setTarget(playerTarget); @@ -475,11 +524,8 @@ CastPlayer.prototype.setupLocalPlayer = function () { this.showFullscreenButton(); - this.enableProgressBar(true); - if (this.currentMediaTime > 0) { - this.playerHandler.load(); - this.playerHandler.play(); + this.playerHandler.play(); } }; @@ -1525,106 +1571,64 @@ CastPlayer.prototype.resetVolumeSlider = function () { * Initialize UI components and add event listeners */ CastPlayer.prototype.initializeUI = function () { - // Set initial values for title and subtitle. - if (this.mediaContents && this.mediaContents.length > 0) { + // Set initial values for title, subtitle, and description document.getElementById('media_title').innerHTML = - this.mediaContents[0]['title']; - + this.mediaContents[0]['title']; document.getElementById('media_subtitle').innerHTML = - this.mediaContents[this.currentMediaIndex]['subtitle']; - } - - document.getElementById('seekable_window').addEventListener( - 'click', this.seekMediaListener); - document.getElementById('progress').addEventListener( - 'click', this.seekMediaListener); - document.getElementById('progress_indicator').addEventListener( - 'dragend', this.seekMediaListener); - document.getElementById('skip').addEventListener( - 'click', this.skipAd.bind(this)); - document.getElementById('audio_on').addEventListener( - 'click', this.playerHandler.mute.bind(this.playerHandler)); - document.getElementById('audio_off').addEventListener( - 'click', this.playerHandler.unMute.bind(this.playerHandler)); - document.getElementById('audio_bg').addEventListener( - 'mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_on').addEventListener( - 'mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_level').addEventListener( - 'mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_track').addEventListener( - 'mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_level').addEventListener( - 'click', this.setVolume.bind(this)); - document.getElementById('audio_bg_track').addEventListener( - 'click', this.setVolume.bind(this)); - document.getElementById('audio_bg').addEventListener( - 'mouseout', this.hideVolumeSlider.bind(this)); - document.getElementById('audio_on').addEventListener( - 'mouseout', this.hideVolumeSlider.bind(this)); - - let main_video = document.getElementById('main_video'); - if (typeof main_video !== 'undefined' && main_video) { - main_video.addEventListener( - 'mouseover', this.showMediaControl.bind(this)); - main_video.addEventListener( - 'mouseout', this.hideMediaControl.bind(this)); - } - - document.getElementById('media_control').addEventListener( - 'mouseover', this.showMediaControl.bind(this)); - document.getElementById('media_control').addEventListener( - 'mouseout', this.hideMediaControl.bind(this)); - document.getElementById('fullscreen_expand').addEventListener( - 'click', this.requestFullScreen.bind(this)); - document.getElementById('fullscreen_collapse').addEventListener( - 'click', this.cancelFullScreen.bind(this)); - document.addEventListener( - 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false); - document.addEventListener( - 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false); - - // Enable play/pause buttons - document.getElementById('play').addEventListener( - 'click', this.playerHandler.play.bind(this.playerHandler)); - document.getElementById('pause').addEventListener( - 'click', this.playerHandler.pause.bind(this.playerHandler)); - - document.getElementById('progress_indicator').draggable = true; - - // Set up feature radio buttons - let noneRadio = document.getElementById('none'); - noneRadio.onclick = function () { - ENABLE_LIVE = false; - ENABLE_ADS = false; - console.log("Features have been removed"); - }; - let adsRadio = document.getElementById('ads'); - adsRadio.onclick = function () { - ENABLE_LIVE = false; - ENABLE_ADS = true; - console.log("Ads have been enabled"); - }; - let liveRadio = document.getElementById('live'); - liveRadio.onclick = function () { - ENABLE_LIVE = true; - ENABLE_ADS = false; - console.log("Live has been enabled"); - }; - - if (ENABLE_ADS) { - if (ENABLE_LIVE) { - console.error('Only one feature can be enabled at a time. Enabling ads.'); - } - adsRadio.checked = true; - console.log("Ads are enabled"); - } else if (ENABLE_LIVE) { - liveRadio.checked = true; - console.log("Live is enabled"); - } else { - noneRadio.checked = true; - console.log("No features are enabled"); - } + this.mediaContents[this.currentMediaIndex]['subtitle']; + document.getElementById('media_desc').innerHTML = + this.mediaContents[this.currentMediaIndex]['description']; + + // Add event handlers to UI components + document.getElementById('progress_bg').addEventListener( + 'click', this.seekMedia.bind(this)); + document.getElementById('progress').addEventListener( + 'click', this.seekMedia.bind(this)); + document.getElementById('progress_indicator').addEventListener( + 'dragend', this.seekMedia.bind(this)); + document.getElementById('audio_on').addEventListener( + 'click', this.playerHandler.mute.bind(this.playerHandler)); + document.getElementById('audio_off').addEventListener( + 'click', this.playerHandler.unMute.bind(this.playerHandler)); + document.getElementById('audio_bg').addEventListener( + 'mouseover', this.showVolumeSlider.bind(this)); + document.getElementById('audio_on').addEventListener( + 'mouseover', this.showVolumeSlider.bind(this)); + document.getElementById('audio_bg_level').addEventListener( + 'mouseover', this.showVolumeSlider.bind(this)); + document.getElementById('audio_bg_track').addEventListener( + 'mouseover', this.showVolumeSlider.bind(this)); + document.getElementById('audio_bg_level').addEventListener( + 'click', this.setVolume.bind(this)); + document.getElementById('audio_bg_track').addEventListener( + 'click', this.setVolume.bind(this)); + document.getElementById('audio_bg').addEventListener( + 'mouseout', this.hideVolumeSlider.bind(this)); + document.getElementById('audio_on').addEventListener( + 'mouseout', this.hideVolumeSlider.bind(this)); + document.getElementById('main_video').addEventListener( + 'mouseover', this.showMediaControl.bind(this)); + document.getElementById('main_video').addEventListener( + 'mouseout', this.hideMediaControl.bind(this)); + document.getElementById('media_control').addEventListener( + 'mouseover', this.showMediaControl.bind(this)); + document.getElementById('media_control').addEventListener( + 'mouseout', this.hideMediaControl.bind(this)); + document.getElementById('fullscreen_expand').addEventListener( + 'click', this.requestFullScreen.bind(this)); + document.getElementById('fullscreen_collapse').addEventListener( + 'click', this.cancelFullScreen.bind(this)); + document.addEventListener( + 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false); + document.addEventListener( + 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false); + + // Enable play/pause buttons + document.getElementById('play').addEventListener( + 'click', this.playerHandler.play.bind(this.playerHandler)); + document.getElementById('pause').addEventListener( + 'click', this.playerHandler.pause.bind(this.playerHandler)); + document.getElementById('progress_indicator').draggable = true; }; /** @@ -1650,6 +1654,12 @@ CastPlayer.prototype.addVideoThumbs = function () { } }; +CastPlayer.prototype.addMediaContents = function () { + if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) { + this.mediaContents = this.mediaJSON['categories'][0]['videos']; + } +}; + /** * Makes human-readable message from chrome.cast.Error * @param {chrome.cast.Error} error @@ -1695,124 +1705,6 @@ window['__onGCastApiAvailable'] = function (isAvailable) { window.CastPlayer = castPlayer; -let NgCastComponent = class NgCastComponent { - constructor(ngCastService) { - this.ngCastService = ngCastService; - } - ngOnInit() { - this.window = window; - let ngCastService = this.ngCastService; - this.window['__onGCastApiAvailable'] = function (isAvailable) { - if (isAvailable) { - ngCastService.initializeCastApi(); - } - }; - this.castingStatus = this.ngCastService.getStatus(); - } - openSession() { - this.ngCastService.discoverDevices(); - } - closeSession() { - this.ngCastService.discoverDevices(); - } -}; -NgCastComponent = __decorate([ - Component({ - selector: 'ng-cast', - template: "cast\ncast_connected", - styles: [""] - }) -], NgCastComponent); - -let NgCastService = class NgCastService { - constructor() { - this.window = window; - this.status = { - casting: false - }; - this.onInitSuccess = function () { - console.log('GCast initialization success'); - }; - this.onError = function (err) { - console.log('GCast initialization failed', err); - }; - this.discoverDevices = () => { - let self = this; - let subj = new Subject(); - this.cast.requestSession((s) => { - self.session = s; - self.setCasting(true); - subj.next('CONNECTED'); - }, function (err) { - self.setCasting(false); - if (err.code === 'cancel') { - self.session = undefined; - subj.next('CANCEL'); - } - else { - console.error('Error selecting a cast device', err); - } - }); - return subj; - }; - this.onMediaDiscovered = (categories) => { - let script = window['document'].createElement('script'); - script.setAttribute('type', 'text/javascript'); - script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1'); - window['document'].body.appendChild(script); - globalThis.CastPlayer.mediaJSON.categories = categories; - }; - this.play = () => { - this.currentMedia.play(null); - }; - this.pause = () => { - this.currentMedia.pause(null); - }; - this.stop = () => { - this.currentMedia.stop(null); - }; - this.onMediaError = (err) => { - console.error('Error launching media', err); - }; - globalThis.CastPlayer.mediaJSON = { - categories: [] - }; - } - initializeCastApi() { - this.cast = this.window['chrome'].cast; - let sessionRequest = new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID); - let apiConfig = new this.cast.ApiConfig(sessionRequest, () => { }, (status) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }); - let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError); - } - ; - setCasting(value) { - globalThis.CastPlayer.addVideoThumbs(); - this.status.casting = value; - } - getStatus() { - return this.status; - } -}; -NgCastService = __decorate([ - Injectable() -], NgCastService); - -let NgCastModule = class NgCastModule { -}; -NgCastModule = __decorate([ - NgModule({ - schemas: [CUSTOM_ELEMENTS_SCHEMA], - imports: [ - CommonModule - ], - exports: [NgCastComponent], - providers: [NgCastService], - declarations: [NgCastComponent] - }) -], NgCastModule); - -// ------ project path -------- | --- lib --- - /** * Generated bundle index. Do not edit. */ diff --git a/dist/fesm2015/thinkam.net-ng-cast.js.map b/dist/fesm2015/thinkam.net-ng-cast.js.map index 4b66557..f65aeff 100644 --- a/dist/fesm2015/thinkam.net-ng-cast.js.map +++ b/dist/fesm2015/thinkam.net-ng-cast.js.map @@ -1 +1 @@ -{"version":3,"file":"thinkam.net-ng-cast.js","sources":["../../CastVideos.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../index.ts","../../thinkam.net-ng-cast.ts"],"sourcesContent":["'use strict';\n\n/** Cleaner UI for demo purposes. */\nconst DEMO_MODE = false;\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = 'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/';\n\n/**\n * Controls if Ads are enabled. Controlled by radio button.\n * @type {boolean}\n */\nlet ENABLE_ADS = false;\n\n/**\n * Controls if Live stream is played. Controlled by radio button.\n * @type {boolean}\n */\nlet ENABLE_LIVE = false;\n\n/**\n * Buffer to decide if the live indicator should be displayed to show that\n * playback is at the playback head.\n * @const {number}\n */\nconst LIVE_INDICATOR_BUFFER = 50;\n\n/**\n * Width of progress bar in pixels.\n * @const {number}\n */\nconst PROGRESS_BAR_WIDTH = 700;\n\n/**\n * Time in milliseconds for minimal progress update.\n * @const {number}\n */\nconst TIMER_STEP = 1000;\n\n/**\n * Cast volume upon initial connection.\n * @const {number}\n */\nconst DEFAULT_VOLUME = 0.5;\n\n/**\n * Height, in pixels, of volume bar.\n * @const {number}\n */\nconst FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.setupLocalPlayer();\n this.addVideoThumbs();\n this.initializeUI();\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = function () {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = 'C0868879';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n this.remotePlayer = new cast.framework.RemotePlayer();\n this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer);\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n function (e) {\n this.switchPlayer(e.value);\n }.bind(this)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = function () {\n this.playerStateBeforeSwitch = this.playerState;\n\n this.stopProgressTimer();\n this.resetVolumeSlider();\n\n // Session is active\n if (cast && cast.framework && this.remotePlayer.isConnected) {\n // Pause local playback\n this.playerHandler.pause();\n this.setupRemotePlayer();\n } else {\n this.setupLocalPlayer();\n }\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n this.updateDurationDisplay = function () {\n this.target.updateDurationDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = function () {\n // Cleanup remote player UI\n let live_indicator = document.getElementById('live_indicator');\n if (live_indicator && live_indicator.style && live_indicator.style.display) {\n live_indicator.style.display = 'none';\n }\n\n this.removeAdMarkers();\n document.getElementById('skip').style.display = 'none';\n\n var localPlayer = document.getElementById('video_element');\n if (typeof localPlayer !== 'undefined' && localPlayer)\n localPlayer.addEventListener(\n 'loadeddata', this.onMediaLoadedLocally.bind(this));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src = this.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n if (!mediaIndex) {\n return (localPlayer.src !== null && localPlayer.src !== \"\");\n } else {\n return (localPlayer.src == this.mediaContents[mediaIndex]['sources'][0]);\n }\n }.bind(this);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplay = function () {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n };\n\n playerTarget.updateCurrentTimeDisplay = function () {\n // Increment for local playback\n this.currentMediaTime += 1;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.currentMediaTime);\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.mediaDuration);\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n if (currentTimeString !== null) {\n element.style.display = '';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n if (localPlayer) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n }\n\n var p = document.getElementById('audio_bg_level');\n if (typeof p !== 'undefined' && p) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n }\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n if (localPlayer)\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n this.playerHandler.setTarget(playerTarget);\n\n this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n this.showFullscreenButton();\n\n this.enableProgressBar(true);\n\n if (this.currentMediaTime > 0) {\n this.playerHandler.load();\n this.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n this.mediaInfo = media.media;\n\n if (this.mediaInfo) {\n this.isLiveContent = (this.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n this.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) {\n this.playerHandler.prepareToPlay();\n }\n\n this.removeAdMarkers();\n this.updateAdMarkers();\n\n this.playerHandler.updateDisplay();\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n this.enableProgressBar(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (this.remotePlayer.isPaused) {\n this.playerHandler.pause();\n } else if (this.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n this.playerHandler.play();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n } else {\n this.playerHandler.unMute();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n this.isPlayingBreak(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n this.onWhenSkippableChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n this.onCurrentBreakClipTimeChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n this.onBreakClipIdChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n this.liveSeekableRange = event.value;\n }.bind(this)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(this);\n\n playerTarget.pause = function () {\n if (!this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n }.bind(this);\n\n playerTarget.stop = function () {\n this.remotePlayerController.stop();\n }.bind(this);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n\n let mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;\n mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata();\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle'];\n mediaInfo.metadata.images = [{\n 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']\n }];\n\n let request = new chrome.cast.media.LoadRequest(mediaInfo);\n request.currentTime = this.currentMediaTime;\n\n if (ENABLE_ADS) {\n // Add sample breaks and breakClips.\n mediaInfo.breakClips = breakClipsJSON;\n mediaInfo.breaks = breaksJSON;\n } else if (ENABLE_LIVE) {\n // Change the streamType and add live specific metadata.\n mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;\n // TODO: Set the metadata on the receiver side in your implementation.\n // startAbsoluteTime and sectionStartTimeInMedia will be set for you.\n // See https://developers.google.com/cast/docs/caf_receiver/live.\n\n // TODO: Start time, is a fake timestamp. Use correct values for your implementation.\n let currentTime = new Date();\n // Convert from milliseconds to seconds.\n currentTime = currentTime / 1000;\n let sectionStartAbsoluteTime = currentTime;\n\n // Duration should be -1 for live streams.\n mediaInfo.duration = -1;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.startAbsoluteTime = currentTime;\n mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.metadata.sectionStartTimeInMedia = 0;\n mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration'];\n\n let item = new chrome.cast.media.QueueItem(mediaInfo);\n request.queueData = new chrome.cast.media.QueueData();\n request.queueData.items = [item];\n request.queueData.name = \"Sample Queue for Live\";\n }\n\n // Do not immediately start playing if the player was previously PAUSED.\n if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) {\n request.autoplay = false;\n } else {\n request.autoplay = true;\n }\n\n cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(\n function () {\n console.log('Remote media loaded');\n }.bind(this),\n function (errorCode) {\n this.playerState = PLAYER_STATE.IDLE;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n this.playerHandler.updateDisplay();\n }.bind(this));\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(this);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (this.isLiveContent && this.mediaInfo.metadata &&\n this.mediaInfo.metadata.sectionStartTimeInMedia) {\n return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return this.remotePlayer.currentTime;\n }\n }.bind(this);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (this.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (this.mediaInfo.metadata == undefined ||\n this.mediaInfo.metadata.sectionDuration == undefined ||\n this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return this.mediaInfo.metadata.sectionDuration;\n } else {\n return this.remotePlayer.duration;\n }\n }.bind(this);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n this.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(this);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime());\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration());\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n\n if (this.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = this.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n this.remotePlayer.volumeLevel = currentVolume;\n this.remotePlayerController.setVolumeLevel();\n }.bind(this);\n\n playerTarget.mute = function () {\n if (!this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.unMute = function () {\n if (this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.isMuted = function () {\n return this.remotePlayer.isMuted;\n }.bind(this);\n\n playerTarget.seekTo = function (time) {\n this.remotePlayer.currentTime = time;\n this.remotePlayerController.seek();\n }.bind(this);\n\n this.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n }\n this.enableProgressBar(this.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n this.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n this.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n this.removeAdMarkers();\n this.updateAdMarkers();\n } else {\n this.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = this.currentMediaTime;\n\n this.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n this.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n this.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n this.stopProgressTimer();\n this.currentMediaTime = 0;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n this.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (this.isLiveContent && !this.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (this.playerState === PLAYER_STATE.PLAYING ||\n this.playerState === PLAYER_STATE.PAUSED) {\n this.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (this.isLiveContent) {\n seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n this.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n this.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n this.stopProgressTimer();\n\n // Start progress timer\n this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n this.currentMediaTime = this.playerHandler.getCurrentMediaTime();\n this.mediaDuration = this.playerHandler.getMediaDuration();\n\n this.playerHandler.updateDurationDisplay();\n\n if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) {\n this.playerHandler.updateCurrentTimeDisplay();\n this.updateProgressBarByTimer();\n } else if (this.mediaDuration > 0) {\n this.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (this.mediaDuration == null) {\n if (!this.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n \n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n \n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (this.isLiveContent) {\n if (this.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) {\n this.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n this.currentMediaTime = 0;\n this.stopProgressTimer();\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n this.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n this.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (this.whenSkippable == undefined || this.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n this.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', this.seekMediaListener);\n seekable_window.addEventListener('click', this.seekMediaListener);\n progress_indicator.addEventListener('dragend', this.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', this.seekMediaListener);\n seekable_window.removeEventListener('click', this.seekMediaListener);\n progress_indicator.removeEventListener('dragend', this.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n this.fullscreen = !this.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (this.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block'; \n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!this.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = function () {\n // Set initial values for title and subtitle.\n if (this.mediaContents && this.mediaContents.length > 0) {\n document.getElementById('media_title').innerHTML =\n this.mediaContents[0]['title'];\n\n document.getElementById('media_subtitle').innerHTML =\n this.mediaContents[this.currentMediaIndex]['subtitle'];\n }\n\n document.getElementById('seekable_window').addEventListener(\n 'click', this.seekMediaListener);\n document.getElementById('progress').addEventListener(\n 'click', this.seekMediaListener);\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', this.seekMediaListener);\n document.getElementById('skip').addEventListener(\n 'click', this.skipAd.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'click', this.playerHandler.mute.bind(this.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', this.playerHandler.unMute.bind(this.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n\n let main_video = document.getElementById('main_video');\n if (typeof main_video !== 'undefined' && main_video) {\n main_video.addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n main_video.addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n }\n \n document.getElementById('media_control').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', this.requestFullScreen.bind(this));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', this.cancelFullScreen.bind(this));\n document.addEventListener(\n 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n document.addEventListener(\n 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', this.playerHandler.play.bind(this.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', this.playerHandler.pause.bind(this.playerHandler));\n\n document.getElementById('progress_indicator').draggable = true;\n\n // Set up feature radio buttons\n let noneRadio = document.getElementById('none');\n noneRadio.onclick = function () {\n ENABLE_LIVE = false;\n ENABLE_ADS = false;\n console.log(\"Features have been removed\");\n }\n let adsRadio = document.getElementById('ads');\n adsRadio.onclick = function () {\n ENABLE_LIVE = false;\n ENABLE_ADS = true;\n console.log(\"Ads have been enabled\");\n }\n let liveRadio = document.getElementById('live');\n liveRadio.onclick = function () {\n ENABLE_LIVE = true;\n ENABLE_ADS = false;\n console.log(\"Live has been enabled\");\n }\n\n if (ENABLE_ADS) {\n if (ENABLE_LIVE) {\n console.error('Only one feature can be enabled at a time. Enabling ads.');\n }\n adsRadio.checked = true;\n console.log(\"Ads are enabled\");\n } else if (ENABLE_LIVE) {\n liveRadio.checked = true;\n console.log(\"Live is enabled\");\n } else {\n noneRadio.checked = true;\n console.log(\"No features are enabled\");\n }\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) {\n this.mediaContents = this.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < this.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', this.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","import { Component, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID);\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n };\n\n play = () => { \n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n globalThis.CastPlayer.addVideoThumbs();\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n"," // ------ project path -------- | --- lib ---\nimport \"/home/thinker/dev/thinkam/ngCast/CastVideos.js\";\n\nexport * from './ng.cast.module';\nexport * from './shared/ng-cast.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":[],"mappings":";;;;;AAAA,YAAY,CAAC;AACb;AACA;AACA,MAAM,SAAS,GAAG,KAAK,CAAC;AACxB;AACA;AACA,MAAM,iBAAiB,GAAG,mEAAmE,CAAC;AAC9F;AACA;AACA;AACA;AACA;AACA,IAAI,UAAU,GAAG,KAAK,CAAC;AACvB;AACA;AACA;AACA;AACA;AACA,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC;AACA;AACA;AACA;AACA;AACA,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B;AACA;AACA;AACA;AACA;AACA,MAAM,UAAU,GAAG,IAAI,CAAC;AACxB;AACA;AACA;AACA;AACA;AACA,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B;AACA;AACA;AACA;AACA;AACA,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B;AACA;AACA,MAAM,YAAY,GAAG;AACrB;AACA;AACA,EAAE,IAAI,EAAE,MAAM;AACd;AACA;AACA,EAAE,SAAS,EAAE,WAAW;AACxB;AACA,EAAE,MAAM,EAAE,QAAQ;AAClB;AACA,EAAE,OAAO,EAAE,SAAS;AACpB;AACA,EAAE,MAAM,EAAE,QAAQ;AAClB,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,UAAU,GAAG,YAAY;AAC7B;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;AAC/C;AACA;AACA,EAAE,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AACvC;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;AACtC;AACA;AACA;AACA,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AAC3B;AACA,EAAE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;AACrC;AACA;AACA;AACA,EAAE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;AAC5B;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;AAC1B;AACA;AACA,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AACpB;AACA,EAAE,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtE;AACA,EAAE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrD;AACA;AACA;AACA,EAAE,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;AAC7B;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC5B;AACA,EAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;AAC1B;AACA;AACA;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC5B;AACA;AACA;AACA,EAAE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAChC;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;AAC7B;AACA,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAC1B,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;AACxB,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;AACtB;AACA,EAAE,IAAI,CAAC,SAAS,GAAG;AACnB,IAAI,YAAY,EAAE,EAAE;AACpB,GAAG,CAAC;AACJ,CAAC,CAAC;AACF;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY;AACxD,EAAE,IAAI,OAAO,GAAG,EAAE,CAAC;AACnB;AACA;AACA;AACA;AACA,EAAE,OAAO,CAAC,qBAAqB,GAAG,UAAU,CAAC;AAC7C;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;AACpE;AACA,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAC/D;AACA,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;AACxD,EAAE,IAAI,CAAC,sBAAsB,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAC7F,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,oBAAoB;AAC7D,IAAI,UAAU,CAAC,EAAE;AACjB,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACjC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,YAAY,GAAG,YAAY;AAChD,EAAE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,WAAW,CAAC;AAClD;AACA,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC3B,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC3B;AACA;AACA,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;AAC/D;AACA,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;AAC/B,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC7B,GAAG,MAAM;AACT,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAC5B,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,aAAa,GAAG,UAAU,UAAU,EAAE;AAC1C,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;AACnB;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,UAAU,MAAM,EAAE;AACrC,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACzB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,YAAY;AAC1B,IAAI,IAAI,UAAU,CAAC,WAAW,IAAI,YAAY,CAAC,IAAI;AACnD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE;AAChE,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AAC9C,MAAM,OAAO;AACb,KAAK;AACL;AACA,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC;AAClD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB;AACA,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC3D,IAAI,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC7D,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,KAAK,GAAG,YAAY;AAC3B,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;AACxB,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;AACjD,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC5D,IAAI,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC5D,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,YAAY;AAC1B,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AAC/C,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,UAAU,UAAU,GAAG,IAAI,EAAE;AAC3C,IAAI,IAAI,CAAC,UAAU,EAAE;AACrB,MAAM,UAAU,GAAG,UAAU,CAAC,iBAAiB,CAAC;AAChD,KAAK;AACL,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC;AACpD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACjC,GAAG,CAAC;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,UAAU,UAAU,EAAE;AAC7C,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;AACjD,GAAG,CAAC;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,YAAY;AACnC,IAAI,UAAU,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACvD,IAAI,UAAU,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;AACrD,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;AACjD;AACA,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AAChB,IAAI,UAAU,CAAC,kBAAkB,EAAE,CAAC;AACpC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;AACzB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,mBAAmB,GAAG,YAAY;AACzC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;AAC7C,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,gBAAgB,GAAG,YAAY;AACtC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;AAC1C,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,YAAY;AACnC;AACA,IAAI,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;AAC9D,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;AACxD;AACA,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;AAChC,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,wBAAwB,GAAG,YAAY;AAC9C,IAAI,IAAI,CAAC,MAAM,CAAC,wBAAwB,EAAE,CAAC;AAC3C,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,qBAAqB,GAAG,YAAY;AAC3C,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;AACxC,GAAG,CAAC;AACJ;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,UAAU,OAAO,EAAE,IAAI,EAAE;AAChD,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC7C,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,UAAU,oBAAoB,EAAE;AACnD,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;AAChD,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,YAAY;AAC1B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,IAAI,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC/D,IAAI,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACjE,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,YAAY;AAC5B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;AACzB,IAAI,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAChE,IAAI,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAChE,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,OAAO,GAAG,YAAY;AAC7B,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;AACjC,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,UAAU,IAAI,EAAE;AAChC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,GAAG,CAAC;AACJ,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD;AACA,EAAE,IAAI,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACjE,EAAE,IAAI,cAAc,IAAI,cAAc,CAAC,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE;AAC9E,IAAI,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC1C,GAAG;AACH;AACA,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC;AACzB,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACzD;AACA,EAAE,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AAC7D,EAAE,IAAI,OAAO,WAAW,KAAK,WAAW,IAAI,WAAW;AACvD,IAAI,WAAW,CAAC,gBAAgB;AAChC,MAAM,YAAY,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1D;AACA;AACA,EAAE,IAAI,YAAY,GAAG,EAAE,CAAC;AACxB;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;AACvB;AACA,IAAI,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AACpD,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC9B,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACxC,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,KAAK,GAAG,YAAY;AACnC,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;AACxB,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;AACvB,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,UAAU,UAAU,EAAE;AAC5C,IAAI,WAAW,CAAC,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;AACvB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,aAAa,GAAG,UAAU,UAAU,EAAE;AACrD,IAAI,IAAI,CAAC,UAAU,EAAE;AACrB,MAAM,QAAQ,WAAW,CAAC,GAAG,KAAK,IAAI,IAAI,WAAW,CAAC,GAAG,KAAK,EAAE,EAAE;AAClE,KAAK,MAAM;AACX,MAAM,QAAQ,WAAW,CAAC,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;AAC/E,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,mBAAmB,GAAG,YAAY;AACjD,IAAI,OAAO,WAAW,CAAC,WAAW,CAAC;AACnC,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,gBAAgB,GAAG,YAAY;AAC9C,IAAI,OAAO,WAAW,CAAC,QAAQ,CAAC;AAChC,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,aAAa,GAAG,YAAY;AAC3C;AACA,IAAI,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAClE,IAAI,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACpE,IAAI,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC1E;AACA;AACA,IAAI,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;AACpD,MAAM,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC;AACtE,IAAI,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS;AACvD,MAAM,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,UAAU,CAAC,CAAC;AACzE,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,wBAAwB,GAAG,YAAY;AACtD;AACA,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;AAC/B,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACpG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,qBAAqB,GAAG,YAAY;AACnD,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;AAC9F,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,aAAa,GAAG,UAAU,OAAO,EAAE,IAAI,EAAE;AACxD,IAAI,IAAI,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAC1D,IAAI,IAAI,iBAAiB,KAAK,IAAI,EAAE;AACpC,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;AACjC,MAAM,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAC;AAC5C,KAAK,MAAM;AACX,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACrC,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,SAAS,GAAG,UAAU,oBAAoB,EAAE;AAC3D,IAAI,IAAI,WAAW,EAAE;AACrB,MAAM,WAAW,CAAC,MAAM,GAAG,oBAAoB,GAAG,kBAAkB;AACpE,QAAQ,oBAAoB,GAAG,kBAAkB,GAAG,CAAC,CAAC;AACtD,KAAK;AACL;AACA,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACtD,IAAI,IAAI,OAAO,CAAC,KAAK,WAAW,IAAI,CAAC,EAAE;AACvC,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAC;AACnD,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,oBAAoB,GAAG,IAAI,CAAC;AACvD,KAAK;AACL,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;AAC7B,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,MAAM,GAAG,YAAY;AACpC,IAAI,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC;AAC9B,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,OAAO,GAAG,YAAY;AACrC,IAAI,IAAI,WAAW;AACnB,MAAM,OAAO,WAAW,CAAC,KAAK,CAAC;AAC/B,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,MAAM,GAAG,UAAU,IAAI,EAAE;AACxC,IAAI,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC;AACnC,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;AAC7C;AACA,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,GAAG,kBAAkB,CAAC,CAAC;AACpE;AACA,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC9B;AACA,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;AAC/B;AACA,EAAE,IAAI,IAAI,CAAC,gBAAgB,GAAG,CAAC,EAAE;AACjC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAC9B,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAC9B,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACrD;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,kBAAkB;AAC3D,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;AACjF,MAAM,IAAI,CAAC,OAAO,EAAE;AACpB,QAAQ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AAC9B,QAAQ,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;AACnC,QAAQ,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AAC3C,QAAQ,OAAO;AACf,OAAO;AACP;AACA,MAAM,IAAI,KAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;AAC5C,MAAM,IAAI,CAAC,KAAK,EAAE;AAClB,QAAQ,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AAC9B,QAAQ,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;AACnC,QAAQ,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AAC3C,QAAQ,OAAO;AACf,OAAO;AACP;AACA,MAAM,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;AACnC;AACA,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE;AAC1B,QAAQ,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU;AACvD,UAAU,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAC7C,OAAO,MAAM;AACb,QAAQ,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;AACnC,OAAO;AACP;AACA,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,YAAY,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO,EAAE;AAClG,QAAQ,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AAC3C,OAAO;AACP;AACA,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;AAC7B,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;AAC7B;AACA,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AACzC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,gBAAgB;AACzD,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC1C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,iBAAiB;AAC1D,IAAI,YAAY;AAChB,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AACtC,QAAQ,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;AACnC,OAAO,MAAM,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO,EAAE;AAC5D;AACA;AACA;AACA,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAClC,OAAO;AACP,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,gBAAgB;AACzD,IAAI,YAAY;AAChB,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AACrC,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAClC,OAAO,MAAM;AACb,QAAQ,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;AACpC,OAAO;AACP,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,oBAAoB;AAC7D,IAAI,YAAY;AAChB,MAAM,IAAI,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,kBAAkB,CAAC;AACzE,MAAM,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACxD,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;AACxC,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;AAC5C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,wBAAwB;AACjE,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACvC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,sBAAsB;AAC/D,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC/C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,+BAA+B;AACxE,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACtD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,qBAAqB;AAC9D,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,sBAAsB,CAAC,gBAAgB;AAC9C,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,2BAA2B;AACpE,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AACjD,MAAM,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC;AAC3C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAChB,GAAG,CAAC;AACJ;AACA;AACA;AACA;AACA,EAAE,IAAI,YAAY,GAAG,EAAE,CAAC;AACxB;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AACpC,MAAM,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC;AAChD,KAAK;AACL;AACA,IAAI,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AACpD,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;AAC1B,IAAI,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AAC/D,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,KAAK,GAAG,YAAY;AACnC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;AACrC,MAAM,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC;AAChD,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;AACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,UAAU,UAAU,EAAE;AAC5C,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACxE;AACA,IAAI,IAAI,SAAS,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AAC/G,IAAI,SAAS,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;AACjE,IAAI,SAAS,CAAC,QAAQ,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;AACrE,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;AACvE,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC;AAC7E,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;AACjC,MAAM,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC;AACxE,KAAK,CAAC,CAAC;AACP;AACA,IAAI,IAAI,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AAC/D,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC;AAChD;AACA,IAAI,IAAI,UAAU,EAAE;AACpB;AACA,MAAM,SAAS,CAAC,UAAU,GAAG,cAAc,CAAC;AAC5C,MAAM,SAAS,CAAC,MAAM,GAAG,UAAU,CAAC;AACpC,KAAK,MAAM,IAAI,WAAW,EAAE;AAC5B;AACA,MAAM,SAAS,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;AAC/D;AACA;AACA;AACA;AACA;AACA,MAAM,IAAI,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;AACnC;AACA,MAAM,WAAW,GAAG,WAAW,GAAG,IAAI,CAAC;AACvC,MAAM,IAAI,wBAAwB,GAAG,WAAW,CAAC;AACjD;AACA;AACA,MAAM,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;AAC9B;AACA,MAAM,SAAS,CAAC,iBAAiB,GAAG,WAAW,CAAC;AAChD,MAAM,SAAS,CAAC,QAAQ,CAAC,wBAAwB,GAAG,wBAAwB,CAAC;AAC7E;AACA,MAAM,SAAS,CAAC,QAAQ,CAAC,uBAAuB,GAAG,CAAC,CAAC;AACrD,MAAM,SAAS,CAAC,QAAQ,CAAC,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC;AACtF;AACA,MAAM,IAAI,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAC5D,MAAM,OAAO,CAAC,SAAS,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;AAC5D,MAAM,OAAO,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;AACvC,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,GAAG,uBAAuB,CAAC;AACvD,KAAK;AACL;AACA;AACA,IAAI,IAAI,CAAC,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,uBAAuB,IAAI,YAAY,CAAC,MAAM,EAAE;AAC9F,MAAM,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC;AAC/B,KAAK,MAAM;AACX,MAAM,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;AAC9B,KAAK;AACL;AACA,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI;AACxF,MAAM,YAAY;AAClB,QAAQ,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AAC3C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AAClB,MAAM,UAAU,SAAS,EAAE;AAC3B,QAAQ,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AAC7C,QAAQ,OAAO,CAAC,GAAG,CAAC,2BAA2B;AAC/C,UAAU,UAAU,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;AACjD,QAAQ,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AAC3C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACpB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,aAAa,GAAG,UAAU,UAAU,EAAE;AACrD,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;AAC/E,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,KAAK,CAAC;AAC/B;AACA,IAAI,IAAI,KAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;AAC1C,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC;AAC7B;AACA,IAAI,IAAI,KAAK,CAAC,WAAW,IAAI,YAAY,CAAC,IAAI,EAAE;AAChD,MAAM,OAAO,KAAK,CAAC;AACnB,KAAK;AACL;AACA;AACA,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA;AACA;AACA;AACA;AACA,EAAE,YAAY,CAAC,mBAAmB,GAAG,YAAY;AACjD,IAAI,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ;AACrD,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,EAAE;AACvD,MAAM,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;AAC7F,KAAK,MAAM;AACX;AACA,MAAM,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;AAC3C,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA;AACA;AACA;AACA;AACA,EAAE,YAAY,CAAC,gBAAgB,GAAG,YAAY;AAC9C,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE;AAC5B;AACA,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,SAAS;AAC9C,QAAQ,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,IAAI,SAAS;AAC5D,QAAQ,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,IAAI,SAAS,EAAE;AACtE,QAAQ,OAAO,IAAI,CAAC;AACpB,OAAO;AACP;AACA,MAAM,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC;AACrD,KAAK,MAAM;AACX,MAAM,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;AACxC,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,aAAa,GAAG,YAAY;AAC3C,IAAI,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;AACnF,IAAI,IAAI,WAAW,IAAI,WAAW,CAAC,eAAe,EAAE,IAAI,WAAW,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE;AAC7F,MAAM,IAAI,KAAK,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;AAChD,MAAM,IAAI,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;AAClC;AACA;AACA,MAAM,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AACtD,MAAM,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM;AACzD,QAAQ,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9C,QAAQ,EAAE,CAAC,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAClD,OAAO;AACP;AACA;AACA,MAAM,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACrE,MAAM,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACvE,MAAM,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC7E;AACA,MAAM,IAAI,UAAU,GAAG,EAAE,CAAC;AAC1B,MAAM,IAAI,iBAAiB,GAAG,EAAE,CAAC;AACjC,MAAM,IAAI,aAAa,GAAG,EAAE,CAAC;AAC7B;AACA,MAAM,IAAI,SAAS,CAAC,QAAQ,EAAE;AAC9B,QAAQ,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC9C,QAAQ,iBAAiB,GAAG,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC;AAC5D;AACA,QAAQ,UAAU,GAAG,iBAAiB,GAAG,UAAU,GAAG,IAAI,GAAG,iBAAiB,GAAG,UAAU,CAAC;AAC5F;AACA,QAAQ,UAAU,GAAG,CAAC,UAAU,IAAI,UAAU,GAAG,GAAG,GAAG,EAAE,CAAC;AAC1D,QAAQ,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACpD,QAAQ,aAAa,GAAG,CAAC,aAAa,IAAI,aAAa,GAAG,GAAG,GAAG,EAAE,CAAC;AACnE,OAAO;AACP;AACA,MAAM,IAAI,SAAS,EAAE;AACrB,QAAQ,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;AACxD,UAAU,CAAC,WAAW,GAAG,eAAe,GAAG,eAAe,IAAI,KAAK,CAAC,WAAW,GAAG,gBAAgB,CAAC;AACnG;AACA;AACA,QAAQ,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS,IAAI,WAAW,GAAG,cAAc,GAAG,cAAc,CAAC,CAAC;AAC3G,QAAQ,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC;AACjE,OAAO,MAAM;AACb,QAAQ,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;AACxD,UAAU,UAAU,GAAG,KAAK,CAAC,WAAW,GAAG,MAAM;AACjD,UAAU,WAAW,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC;AACnD;AACA;AACA,QAAQ,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC;AACtE,QAAQ,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS,GAAG,aAAa,CAAC;AAC5E,OAAO;AACP;AACA;AACA,MAAM,IAAI,SAAS,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE;AACrE,QAAQ,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;AACzD;AACA,QAAQ,IAAI,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACvE,QAAQ,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC/C;AACA;AACA;AACA,QAAQ,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,qBAAqB,CAAC,EAAE;AACjI,UAAU,cAAc,CAAC,GAAG,GAAG,sCAAsC,CAAC;AACtE,SAAS,MAAM;AACf,UAAU,cAAc,CAAC,GAAG,GAAG,wCAAwC,CAAC;AACxE,SAAS;AACT,OAAO,MAAM;AACb,QAAQ,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACzE,OAAO;AACP,KAAK,MAAM;AACX;AACA,MAAM,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACpE,MAAM,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACtE,MAAM,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC5E;AACA;AACA,MAAM,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC;AAC5D,MAAM,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC;AAC/D,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,wBAAwB,GAAG,YAAY;AACtD,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC,CAAC;AACvH,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,qBAAqB,GAAG,YAAY;AACnD,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC,CAAC;AACjH,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,aAAa,GAAG,UAAU,OAAO,EAAE,IAAI,EAAE;AACxD,IAAI,IAAI,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAC1D;AACA,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE;AAC5B,MAAM,IAAI,iBAAiB,IAAI,IAAI,EAAE;AACrC,QAAQ,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvC,QAAQ,OAAO;AACf,OAAO;AACP;AACA;AACA,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,wBAAwB,KAAK,SAAS,EAAE;AACrG,QAAQ,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvC,QAAQ,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;AAC7G,OAAO,MAAM;AACb;AACA,QAAQ,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvC,QAAQ,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAC;AAC9C,OAAO;AACP,KAAK,MAAM;AACX,MAAM,IAAI,iBAAiB,KAAK,IAAI,EAAE;AACtC,QAAQ,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvC,QAAQ,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAC;AAC9C,OAAO,MAAM;AACb,QAAQ,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvC,OAAO;AACP,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,SAAS,GAAG,UAAU,oBAAoB,EAAE;AAC3D,IAAI,IAAI,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;AACtD,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACtD,IAAI,IAAI,oBAAoB,GAAG,kBAAkB,EAAE;AACnD,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAC;AACnD,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,oBAAoB,GAAG,IAAI,CAAC;AACvD,MAAM,aAAa,GAAG,oBAAoB,GAAG,kBAAkB,CAAC;AAChE,KAAK,MAAM;AACX,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,KAAK;AACL,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,aAAa,CAAC;AAClD,IAAI,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,CAAC;AACjD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AACpC,MAAM,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,CAAC;AACjD,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,MAAM,GAAG,YAAY;AACpC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AACnC,MAAM,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,CAAC;AACjD,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,OAAO,GAAG,YAAY;AACrC,IAAI,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;AACrC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,YAAY,CAAC,MAAM,GAAG,UAAU,IAAI,EAAE;AACxC,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC;AACzC,IAAI,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;AACvC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf;AACA,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;AAC7C;AACA;AACA,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AACjC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAC9B,GAAG;AACH,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AACpD;AACA,EAAE,IAAI,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,kBAAkB,CAAC;AACzE,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACpD,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,aAAa,GAAG,IAAI,CAAC;AACxC,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC;AAC5C;AACA;AACA,EAAE,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;AAC/D;AACA,EAAE,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAC9B;AACA;AACA;AACA,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC,eAAe,EAAE;AACpF,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,eAAe,EAAE;AACjD,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AACpC,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AACvC;AACA;AACA;AACA,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;AAC3B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;AAC3B,GAAG,MAAM;AACT,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAC9B,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY;AACxD,EAAE,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AAC7D,EAAE,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC;AAClD;AACA,EAAE,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AACrC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,UAAU,EAAE;AACzD,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,UAAU,CAAC,CAAC;AACrD;AACA,EAAE,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC;AACtC;AACA,EAAE,IAAI,CAAC,aAAa,CAAC,gBAAgB,GAAG,SAAS,CAAC;AAClD;AACA;AACA,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AAClD,EAAE,EAAE,CAAC,GAAG,GAAG,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;AACvE;AACA;AACA,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzD,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;AAC9B,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACrD,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAC/B;AACA,EAAE,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACnE,EAAE,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzE,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,kBAAkB,CAAC;AACnD,EAAE,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AACzC;AACA;AACA,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC3B,EAAE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;AAC5B,EAAE,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9E,EAAE,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3E;AACA,EAAE,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AACvC,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAC5B,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,KAAK,EAAE;AAClD,EAAE,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;AAClI,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AACxC,IAAI,OAAO;AACX,GAAG;AACH;AACA,EAAE,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;AACrD,IAAI,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAC;AACtD,IAAI,OAAO;AACX,GAAG;AACH;AACA,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC7C,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzD,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACrD,EAAE,IAAI,QAAQ,GAAG,CAAC,CAAC;AACnB,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AACb,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AACb,EAAE,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,IAAI,oBAAoB,EAAE;AACtD,IAAI,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,GAAG,QAAQ;AAC7E,MAAM,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAC9B,IAAI,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC;AACtD,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC;AACvD,GAAG,MAAM;AACT,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,GAAG,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAChF,IAAI,EAAE,GAAG,QAAQ,CAAC;AAClB,IAAI,EAAE,GAAG,QAAQ,CAAC;AAClB,GAAG;AACH;AACA,EAAE,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO;AAC/C,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,CAAC,MAAM,EAAE;AAC9C,IAAI,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC;AACrC,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC;AACrC,IAAI,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC;AACpC,GAAG;AACH;AACA,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE;AAC1B,IAAI,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;AAChE,GAAG;AACH;AACA,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,UAAU,EAAE;AACvD,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACpD,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AACd,EAAE,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,KAAK,gBAAgB,EAAE;AACxD,IAAI,GAAG,GAAG,kBAAkB,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAChE,GAAG,MAAM;AACT,IAAI,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1E,GAAG;AACH,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,YAAY;AACtD,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC3B;AACA;AACA,EAAE,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,yBAAyB,EAAE,UAAU,CAAC,CAAC;AACvE,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACrD,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;AAClB,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9B,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AACtB,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,YAAY;AACtD;AACA,EAAE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC;AACnE,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;AAC7D;AACA,EAAE,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;AAC7C;AACA,EAAE,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,IAAI,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,EAAE;AACtG,IAAI,IAAI,CAAC,aAAa,CAAC,wBAAwB,EAAE,CAAC;AAClD,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;AACpC,GAAG,MAAM,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE;AACrC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;AACvB,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,wBAAwB,GAAG,YAAY;AAC5D,EAAE,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACxD,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzD;AACA;AACA,EAAE,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;AAClC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AAC7B,MAAM,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;AACvE,KAAK;AACL;AACA,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AACpC;AACA,IAAI,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC/C,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;AAClD,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAClC,KAAK;AACL;AACA,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC9B;AACA,IAAI,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACrE,IAAI,IAAI,eAAe,IAAI,eAAe,CAAC,KAAK,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK;AAC/E,MAAM,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAC1C;AACA,IAAI,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AAC3E,IAAI,IAAI,kBAAkB,IAAI,kBAAkB,CAAC,KAAK,IAAI,kBAAkB,CAAC,KAAK,CAAC,KAAK;AACxF,MAAM,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAC7C;AACA,IAAI,OAAO;AACX,GAAG,MAAM;AACT,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;AAC1B,GAAG;AACH;AACA,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE;AACpD,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AACpC,GAAG;AACH;AACA;AACA;AACA,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;AACvF,EAAE,IAAI,EAAE,GAAG,kBAAkB,EAAE;AAC/B,IAAI,EAAE,GAAG,kBAAkB,CAAC;AAC5B,GAAG,MAAM,IAAI,EAAE,GAAG,CAAC,EAAE;AACrB,IAAI,EAAE,GAAG,CAAC,CAAC;AACX,GAAG;AACH;AACA,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC;AACtC,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC;AAClC;AACA,EAAE,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACnE,EAAE,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzE,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE;AAC1B,IAAI,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAChC;AACA,MAAM,IAAI,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;AACvH,QAAQ,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;AACxD,MAAM,IAAI,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,qBAAqB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;AACtG,MAAM,IAAI,aAAa,GAAG,kBAAkB,EAAE;AAC9C,QAAQ,aAAa,GAAG,kBAAkB,CAAC;AAC3C,OAAO,MAAM,IAAI,aAAa,GAAG,CAAC,EAAE;AACpC,QAAQ,aAAa,GAAG,CAAC,CAAC;AAC1B,OAAO;AACP,MAAM,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,aAAa,GAAG,IAAI,CAAC;AACzD;AACA,MAAM,IAAI,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;AAC3H,QAAQ,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;AACxD,MAAM,IAAI,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,uBAAuB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;AAC1G,MAAM,IAAI,eAAe,GAAG,kBAAkB,EAAE;AAChD,QAAQ,eAAe,GAAG,kBAAkB,CAAC;AAC7C,OAAO,MAAM,IAAI,eAAe,GAAG,CAAC,EAAE;AACtC,QAAQ,eAAe,GAAG,CAAC,CAAC;AAC5B,OAAO;AACP,MAAM,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,eAAe,GAAG,IAAI,CAAC;AAC9D,KAAK,MAAM;AACX;AACA,MAAM,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAC1C,MAAM,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,kBAAkB,GAAG,IAAI,CAAC;AACjE,KAAK;AACL,GAAG,MAAM;AACT;AACA,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,kBAAkB,GAAG,IAAI,CAAC;AAC5D,IAAI,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAC3C,GAAG;AACH;AACA,EAAE,IAAI,EAAE,IAAI,kBAAkB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACvD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;AACvB,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,WAAW,GAAG,YAAY;AAC/C,EAAE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;AAC5B,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC3B,EAAE,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AACvC,EAAE,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AACrC;AACA,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC7C,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO;AACxC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACjC;AACA,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AAC/C,EAAE,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO;AACjD,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACjC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,SAAS,EAAE;AAC/D,EAAE,IAAI,SAAS,IAAI,SAAS,IAAI,SAAS,IAAI,IAAI,EAAE;AACnD,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG;AACH;AACA,EAAE,IAAI,UAAU,GAAG,KAAK,CAAC;AACzB,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE;AACrB,IAAI,UAAU,GAAG,IAAI,CAAC;AACtB,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC;AACpB,GAAG;AACH;AACA,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;AAC3C,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9D,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;AACxE;AACA,EAAE,IAAI,KAAK,GAAG,EAAE,EAAE,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC;AACtC,EAAE,IAAI,OAAO,GAAG,EAAE,EAAE,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;AAC5C,EAAE,IAAI,OAAO,GAAG,EAAE,EAAE,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;AAC5C;AACA,EAAE,OAAO,CAAC,UAAU,GAAG,GAAG,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;AACzE,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,SAAS,EAAE;AAC/D,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,SAAS,CAAC;AACnC;AACA,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;AACxC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC9B,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AAClC,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AAClC,EAAE,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACvC,EAAE,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;AACrB;AACA,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;AAC7B,EAAE,OAAO,GAAG,CAAC,GAAG,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,EAAE,OAAO,GAAG,CAAC,GAAG,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,EAAE,IAAI,SAAS,GAAG,KAAK,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC;AACrE,EAAE,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,eAAe,GAAG,YAAY;AACnD,EAAE,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;AACjF,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO;AAC3B;AACA,EAAE,IAAI,KAAK,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;AAC5C,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO;AACrB;AACA,EAAE,IAAI,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;AAC9B,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO;AACzB;AACA,EAAE,IAAI,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;AAChC,EAAE,IAAI,eAAe,GAAG,SAAS,CAAC,QAAQ,CAAC;AAC3C;AACA,EAAE,IAAI,CAAC,MAAM,EAAE;AACf,IAAI,OAAO;AACX,GAAG;AACH;AACA,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,IAAI,IAAI,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAC5B;AACA;AACA;AACA,IAAI,IAAI,OAAO,CAAC,QAAQ,GAAG,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE;AAClE,MAAM,SAAS;AACf,KAAK;AACL;AACA;AACA,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC3D,MAAM,IAAI,GAAG,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAC;AACnD,MAAM,GAAG,CAAC,SAAS,IAAI,8BAA8B,GAAG,OAAO,CAAC,QAAQ;AACxE,QAAQ,wBAAwB;AAChC,QAAQ,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,GAAG,YAAY,CAAC;AAClF,KAAK;AACL,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,eAAe,GAAG,YAAY;AACnD,EAAE,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,UAAU,QAAQ,EAAE;AACrE,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;AACtB,GAAG,CAAC,CAAC;AACL,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,QAAQ,EAAE,eAAe,EAAE;AAC/E;AACA,EAAE,IAAI,QAAQ,IAAI,CAAC,CAAC,EAAE;AACtB,IAAI,OAAO,kBAAkB,CAAC;AAC9B,GAAG;AACH;AACA;AACA;AACA,EAAE,IAAI,QAAQ,GAAG,eAAe,EAAE;AAClC,IAAI,OAAO,kBAAkB,CAAC;AAC9B,GAAG;AACH;AACA;AACA,EAAE,OAAO,CAAC,kBAAkB,GAAG,QAAQ,IAAI,eAAe,CAAC;AAC3D,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY;AACxD;AACA,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC7C,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;AAC9C,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAChC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,cAAc,GAAG,UAAU,cAAc,EAAE;AAChE,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,cAAc,CAAC,CAAC;AAC1C,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,sBAAsB,GAAG,UAAU,aAAa,EAAE;AACvE,EAAE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;AACrC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,6BAA6B,GAAG,UAAU,oBAAoB,EAAE;AACrF,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC7C;AACA;AACA,EAAE,IAAI,IAAI,CAAC,aAAa,IAAI,SAAS,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE;AACjE;AACA,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;AAChD,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAClC,GAAG;AACH;AACA,OAAO,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,oBAAoB,IAAI,IAAI,CAAC,aAAa,EAAE;AAC3F;AACA,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;AAChD,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACnC,GAAG;AACH;AACA,OAAO;AACP;AACA,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;AAChD,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAClC,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;AAC1C,EAAE,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,CAAC;AACvC,EAAC;AACD;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,UAAU,MAAM,EAAE;AAC3D,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACrD,EAAE,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzE,EAAE,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACnE;AACA,EAAE,IAAI,MAAM,EAAE;AACd;AACA,IAAI,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,qDAAqD,CAAC;AAC3F,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AACtC,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AAC7C,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AAChD,IAAI,kBAAkB,CAAC,SAAS,GAAG,IAAI,CAAC;AACxC;AACA;AACA,IAAI,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC/D,IAAI,eAAe,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACtE,IAAI,kBAAkB,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC3E,GAAG,MAAM;AACT;AACA,IAAI,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,mDAAmD,CAAC;AACzF,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AACtC,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AAC7C,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AAChD,IAAI,kBAAkB,CAAC,SAAS,GAAG,KAAK,CAAC;AACzC;AACA;AACA,IAAI,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAClE,IAAI,eAAe,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACzE,IAAI,kBAAkB,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC9E,GAAG;AACH,EAAC;AACD;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACrD;AACA,EAAE,IAAI,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AACzD,EAAE,IAAI,aAAa;AACnB,IAAI,OAAO,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAAC;AACvE;AACA,EAAE,IAAI,aAAa,EAAE;AACrB;AACA,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAChC,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AACxC,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD;AACA,EAAE,IAAI,aAAa;AACnB,IAAI,QAAQ,CAAC,kBAAkB,CAAC,IAAI,QAAQ,CAAC,wBAAwB,CAAC,CAAC;AACvE;AACA,EAAE,IAAI,aAAa,EAAE;AACrB,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACjC,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,uBAAuB,GAAG,YAAY;AAC3D,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;AACrC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY;AACxD,EAAE,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;AACvE,EAAE,IAAI,mBAAmB,GAAG,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;AAC3E;AACA,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE;AACvB,IAAI,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO;AACvF,MAAM,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC/C;AACA,IAAI,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO;AAC7F,MAAM,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAClD,GAAG,MAAM;AACT,IAAI,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO;AACvF,MAAM,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAChD;AACA,IAAI,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO;AAC7F,MAAM,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACjD,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY;AACxD,EAAE,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;AACvE,EAAE,IAAI,mBAAmB,GAAG,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;AAC3E;AACA,EAAE,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO;AACrF,MAAM,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC/C;AACA,EAAE,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO;AAC3F,MAAM,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACjD,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD,EAAE,IAAI,aAAa,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AAC/D,EAAE,IAAI,aAAa,IAAI,aAAa,CAAC,KAAK,IAAI,aAAa,CAAC,OAAO;AACnE,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;AACtC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD,EAAE,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE;AACnC,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;AAC3D,IAAI,IAAI,OAAO,IAAI,OAAO,CAAC,iBAAiB,EAAE,EAAE;AAChD;AACA,MAAM,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;AACnE,KAAK,MAAM;AACX,MAAM,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AACjE,KAAK;AACL,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE;AACrC,IAAI,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAC1D,IAAI,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAChE,IAAI,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAChE,IAAI,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AACjE,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AACxD,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAC/D,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACrD,EAAE,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC;AACjF,EAAE,IAAI,yBAAyB,GAAG,cAAc,GAAG,iBAAiB,CAAC;AACrE,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,MAAM;AACxD,IAAI,yBAAyB,GAAG,IAAI,CAAC;AACrC,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC9D,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,YAAY,GAAG,YAAY;AAChD;AACA,EAAE,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3D,IAAI,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;AACpD,MAAM,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACrC;AACA,IAAI,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS;AACvD,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,UAAU,CAAC,CAAC;AAC7D,GAAG;AACH;AACA,EAAE,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,gBAAgB;AAC7D,IAAI,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACrC,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACrC,EAAE,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,gBAAgB;AAChE,IAAI,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACvC,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,gBAAgB;AAClD,IAAI,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACrC,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AAC/D,EAAE,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,gBAAgB;AACvD,IAAI,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AACjE,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB;AAC5D,IAAI,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB;AAC5D,IAAI,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB;AAC5D,IAAI,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACxC,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB;AAC5D,IAAI,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACxC,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD;AACA,EAAE,IAAI,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;AACzD,EAAE,IAAI,OAAO,UAAU,KAAK,WAAW,IAAI,UAAU,EAAE;AACvD,IAAI,UAAU,CAAC,gBAAgB;AAC/B,MAAM,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACrD,IAAI,UAAU,CAAC,gBAAgB;AAC/B,MAAM,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACpD,GAAG;AACH;AACA,EAAE,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,gBAAgB;AAC3D,IAAI,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,EAAE,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,gBAAgB;AAC3D,IAAI,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,EAAE,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,gBAAgB;AAC/D,IAAI,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChD,EAAE,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,gBAAgB;AACjE,IAAI,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,EAAE,QAAQ,CAAC,gBAAgB;AAC3B,IAAI,kBAAkB,EAAE,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AACxE,EAAE,QAAQ,CAAC,gBAAgB;AAC3B,IAAI,wBAAwB,EAAE,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AAC9E;AACA;AACA,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,gBAAgB;AAClD,IAAI,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AAC/D,EAAE,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,gBAAgB;AACnD,IAAI,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AAChE;AACA,EAAE,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;AACjE;AACA;AACA,EAAE,IAAI,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAClD,EAAE,SAAS,CAAC,OAAO,GAAG,YAAY;AAClC,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,IAAI,UAAU,GAAG,KAAK,CAAC;AACvB,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAC9C,IAAG;AACH,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AAChD,EAAE,QAAQ,CAAC,OAAO,GAAG,YAAY;AACjC,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB,IAAI,UAAU,GAAG,IAAI,CAAC;AACtB,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AACzC,IAAG;AACH,EAAE,IAAI,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAClD,EAAE,SAAS,CAAC,OAAO,GAAG,YAAY;AAClC,IAAI,WAAW,GAAG,IAAI,CAAC;AACvB,IAAI,UAAU,GAAG,KAAK,CAAC;AACvB,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AACzC,IAAG;AACH;AACA,EAAE,IAAI,UAAU,EAAE;AAClB,IAAI,IAAI,WAAW,EAAE;AACrB,MAAM,OAAO,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;AAChF,KAAK;AACL,IAAI,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;AAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AACnC,GAAG,MAAM,IAAI,WAAW,EAAE;AAC1B,IAAI,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;AAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AACnC,GAAG,MAAM;AACT,IAAI,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;AAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAC3C,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,cAAc,GAAG,YAAY;AAClD,EAAE,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AACxH,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AACnE,IAAI,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACjD,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC;AACtB,IAAI,IAAI,SAAS,GAAG,IAAI,CAAC;AACzB,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAC7C,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC;AACtC,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAC3C,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5C,MAAM,MAAM,CAAC,SAAS;AACtB,QAAQ,YAAY,GAAG,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACzE,QAAQ,sBAAsB,CAAC;AAC/B,MAAM,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACvE,MAAM,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAC7B,KAAK;AACL,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,eAAe,GAAG,UAAU,KAAK,EAAE;AAC9C,EAAE,QAAQ,KAAK,CAAC,IAAI;AACpB,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB;AAClD,MAAM,OAAO,6BAA6B;AAC1C,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM;AACrC,MAAM,OAAO,wCAAwC;AACrD,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa;AAC5C,MAAM,OAAO,6CAA6C;AAC1D,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB;AAChD,MAAM,OAAO,sCAAsC;AACnD,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB;AAChD,MAAM,OAAO,iDAAiD;AAC9D,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB;AACnD,MAAM,OAAO,sDAAsD;AACnE,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa;AAC5C,MAAM,OAAO,2DAA2D;AACxE,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO;AACtC,MAAM,OAAO,0BAA0B;AACvC,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI;AACJ,MAAM,OAAO,KAAK,CAAC;AACnB,GAAG;AACH,CAAC,CAAC;AACF;AACA,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;AAClC,MAAM,CAAC,uBAAuB,CAAC,GAAG,UAAU,WAAW,EAAE;AACzD,EAAE,IAAI,WAAW,EAAE;AACnB,IAAI,UAAU,CAAC,oBAAoB,EAAE,CAAC;AACtC,GAAG;AACH,CAAC,CAAC;AACF;AACA,MAAM,CAAC,UAAU,GAAG,UAAU;;IC/oDjB,eAAe,GAA5B,MAAa,eAAe;IAI1B,YACU,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;KACjC;IAEL,QAAQ;QACN,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,GAAG,UAAU,WAAoB;YACnE,IAAI,WAAW,EAAE;gBACf,aAAa,CAAC,iBAAiB,EAAE,CAAC;aACnC;SACF,CAAC;QAEF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;KACrD;IAED,WAAW;QACT,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;KACtC;IAED,YAAY;QACV,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;KACtC;EAEF;AA7BY,eAAe;IAP3B,SAAS,CAAC;QACT,QAAQ,EAAE,SAAS;QACnB,sNAAuC;;KAIxC,CAAC;GACW,eAAe,CA6B3B;;IC/BY,aAAa,GAA1B,MAAa,aAAa;IASxB;QANQ,WAAM,GAAQ,MAAM,CAAC;QAEtB,WAAM,GAAG;YACd,OAAO,EAAE,KAAK;SACf,CAAC;QAkBF,kBAAa,GAAG;YACd,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;SAC7C,CAAC;QAEF,YAAO,GAAG,UAAU,GAAQ;YAC1B,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;SACjD,CAAC;QAEF,oBAAe,GAAG;YAChB,IAAI,IAAI,GAAQ,IAAI,CAAC;YACrB,IAAI,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAM;gBAC9B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;gBACjB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aACxB,EAAE,UAAU,GAAQ;gBACnB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACvB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;oBACzB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;oBACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBACrB;qBAAM;oBACL,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;iBACrD;aACF,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;SACb,CAAC;QAEF,sBAAiB,GAAG,CAAC,UAAiB;YACpC,IAAI,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxD,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YAC/C,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,4EAA4E,CAAC,CAAC;YACzG,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAE5C,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,UAAU,CAAC;SACzD,CAAC;QAEF,SAAI,GAAG;YACL,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC9B,CAAC;QAEF,UAAK,GAAG;YACN,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC/B,CAAC;QAEF,SAAI,GAAG;YACL,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC9B,CAAC;QAEF,iBAAY,GAAG,CAAC,GAAQ;YACtB,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;SAC7C,CAAC;QAjEA,UAAU,CAAC,UAAU,CAAC,SAAS,GAAG;YAChC,UAAU,EAAE,EAAE;SACf,CAAC;KACH;IAED,iBAAiB;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;QACvC,IAAI,cAAc,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjG,IAAI,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EACpD,SAAS,EACT,CAAC,MAAW,OAAO,IAAI,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,CAClF,CAAC;QACF,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;KAC3E;;IAsDD,UAAU,CAAC,KAAU;QACnB,UAAU,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;KAC7B;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;KACnB;EACF;AArFY,aAAa;IADzB,UAAU,EAAE;GACA,aAAa,CAqFzB;;IC/EY,YAAY,GAAzB,MAAa,YAAY;EAAI;AAAhB,YAAY;IATxB,QAAQ,CAAC;QACR,OAAO,EAAE,CAAE,sBAAsB,CAAE;QACnC,OAAO,EAAE;YACP,YAAY;SACb;QACD,OAAO,EAAE,CAAC,eAAe,CAAC;QAC1B,SAAS,EAAE,CAAC,aAAa,CAAC;QAC1B,YAAY,EAAE,CAAC,eAAe,CAAC;KAChC,CAAC;GACW,YAAY,CAAI;;ACfrB;;ACAR;;;;;;"} \ No newline at end of file +{"version":3,"file":"thinkam.net-ng-cast.js","sources":["../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../CastVideos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n globalThis.CastPlayer.addMediaContents();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeUI();\n };\n\n play = () => { \n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n globalThis.CastPlayer.addMediaContents();\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = function () {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n this.remotePlayer = new cast.framework.RemotePlayer();\n this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer);\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n function (e) {\n this.switchPlayer(e.value);\n }.bind(this)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = function () {\n this.playerStateBeforeSwitch = this.playerState;\n\n this.stopProgressTimer();\n this.resetVolumeSlider();\n\n // Session is active\n if (cast && cast.framework && this.remotePlayer.isConnected) {\n // Pause local playback\n this.playerHandler.pause();\n this.setupRemotePlayer();\n } else {\n this.setupLocalPlayer();\n }\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n this.updateDurationDisplay = function () {\n this.target.updateDurationDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', this.onMediaLoadedLocally.bind(this));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function() {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function(mediaIndex) {\n localPlayer.src =\n this.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(this);\n\n playerTarget.getCurrentMediaTime = function() {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function() {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function(volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function() {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function() {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function() {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function(time) {\n localPlayer.currentTime = time;\n };\n\n this.playerHandler.setTarget(playerTarget);\n\n this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n this.showFullscreenButton();\n\n if (this.currentMediaTime > 0) {\n this.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n this.mediaInfo = media.media;\n\n if (this.mediaInfo) {\n this.isLiveContent = (this.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n this.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) {\n this.playerHandler.prepareToPlay();\n }\n\n this.removeAdMarkers();\n this.updateAdMarkers();\n\n this.playerHandler.updateDisplay();\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n this.enableProgressBar(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (this.remotePlayer.isPaused) {\n this.playerHandler.pause();\n } else if (this.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n this.playerHandler.play();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n } else {\n this.playerHandler.unMute();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n this.isPlayingBreak(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n this.onWhenSkippableChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n this.onCurrentBreakClipTimeChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n this.onBreakClipIdChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n this.liveSeekableRange = event.value;\n }.bind(this)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(this);\n\n playerTarget.pause = function () {\n if (!this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n }.bind(this);\n\n playerTarget.stop = function () {\n this.remotePlayerController.stop();\n }.bind(this);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n\n let mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;\n mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata();\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle'];\n mediaInfo.metadata.images = [{\n 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']\n }];\n\n let request = new chrome.cast.media.LoadRequest(mediaInfo);\n request.currentTime = this.currentMediaTime;\n\n if (ENABLE_ADS) {\n // Add sample breaks and breakClips.\n mediaInfo.breakClips = breakClipsJSON;\n mediaInfo.breaks = breaksJSON;\n } else if (ENABLE_LIVE) {\n // Change the streamType and add live specific metadata.\n mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;\n // TODO: Set the metadata on the receiver side in your implementation.\n // startAbsoluteTime and sectionStartTimeInMedia will be set for you.\n // See https://developers.google.com/cast/docs/caf_receiver/live.\n\n // TODO: Start time, is a fake timestamp. Use correct values for your implementation.\n let currentTime = new Date();\n // Convert from milliseconds to seconds.\n currentTime = currentTime / 1000;\n let sectionStartAbsoluteTime = currentTime;\n\n // Duration should be -1 for live streams.\n mediaInfo.duration = -1;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.startAbsoluteTime = currentTime;\n mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.metadata.sectionStartTimeInMedia = 0;\n mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration'];\n\n let item = new chrome.cast.media.QueueItem(mediaInfo);\n request.queueData = new chrome.cast.media.QueueData();\n request.queueData.items = [item];\n request.queueData.name = \"Sample Queue for Live\";\n }\n\n // Do not immediately start playing if the player was previously PAUSED.\n if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) {\n request.autoplay = false;\n } else {\n request.autoplay = true;\n }\n\n cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(\n function () {\n console.log('Remote media loaded');\n }.bind(this),\n function (errorCode) {\n this.playerState = PLAYER_STATE.IDLE;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n this.playerHandler.updateDisplay();\n }.bind(this));\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(this);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (this.isLiveContent && this.mediaInfo.metadata &&\n this.mediaInfo.metadata.sectionStartTimeInMedia) {\n return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return this.remotePlayer.currentTime;\n }\n }.bind(this);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (this.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (this.mediaInfo.metadata == undefined ||\n this.mediaInfo.metadata.sectionDuration == undefined ||\n this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return this.mediaInfo.metadata.sectionDuration;\n } else {\n return this.remotePlayer.duration;\n }\n }.bind(this);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n this.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(this);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime());\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration());\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n\n if (this.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = this.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n this.remotePlayer.volumeLevel = currentVolume;\n this.remotePlayerController.setVolumeLevel();\n }.bind(this);\n\n playerTarget.mute = function () {\n if (!this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.unMute = function () {\n if (this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.isMuted = function () {\n return this.remotePlayer.isMuted;\n }.bind(this);\n\n playerTarget.seekTo = function (time) {\n this.remotePlayer.currentTime = time;\n this.remotePlayerController.seek();\n }.bind(this);\n\n this.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n }\n this.enableProgressBar(this.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n this.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n this.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n this.removeAdMarkers();\n this.updateAdMarkers();\n } else {\n this.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = this.currentMediaTime;\n\n this.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n this.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n this.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n this.stopProgressTimer();\n this.currentMediaTime = 0;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n this.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (this.isLiveContent && !this.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (this.playerState === PLAYER_STATE.PLAYING ||\n this.playerState === PLAYER_STATE.PAUSED) {\n this.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (this.isLiveContent) {\n seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n this.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n this.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n this.stopProgressTimer();\n\n // Start progress timer\n this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n this.currentMediaTime = this.playerHandler.getCurrentMediaTime();\n this.mediaDuration = this.playerHandler.getMediaDuration();\n\n this.playerHandler.updateDurationDisplay();\n\n if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) {\n this.playerHandler.updateCurrentTimeDisplay();\n this.updateProgressBarByTimer();\n } else if (this.mediaDuration > 0) {\n this.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (this.mediaDuration == null) {\n if (!this.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n \n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n \n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (this.isLiveContent) {\n if (this.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) {\n this.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n this.currentMediaTime = 0;\n this.stopProgressTimer();\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n this.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n this.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (this.whenSkippable == undefined || this.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n this.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', this.seekMediaListener);\n seekable_window.addEventListener('click', this.seekMediaListener);\n progress_indicator.addEventListener('dragend', this.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', this.seekMediaListener);\n seekable_window.removeEventListener('click', this.seekMediaListener);\n progress_indicator.removeEventListener('dragend', this.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n this.fullscreen = !this.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (this.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block'; \n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!this.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = function () {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n this.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n this.mediaContents[this.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n this.mediaContents[this.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', this.seekMedia.bind(this));\n document.getElementById('progress').addEventListener(\n 'click', this.seekMedia.bind(this));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', this.seekMedia.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'click', this.playerHandler.mute.bind(this.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', this.playerHandler.unMute.bind(this.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('main_video').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('main_video').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', this.requestFullScreen.bind(this));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', this.cancelFullScreen.bind(this));\n document.addEventListener(\n 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n document.addEventListener(\n 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', this.playerHandler.play.bind(this.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', this.playerHandler.pause.bind(this.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) {\n this.mediaContents = this.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < this.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', this.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = function () {\n if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) {\n this.mediaContents = this.mediaJSON['categories'][0]['videos']; \n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["tslib_1.__decorate"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index aebfd96..282628c 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,3 +1,3 @@ -import "/home/thinker/dev/thinkam/ngCast/CastVideos.js"; export * from './ng.cast.module'; export * from './shared/ng-cast.service'; +import "/home/thinker/dev/thinkam/ngCast/CastVideos.js"; diff --git a/dist/ng-cast.component.d.ts b/dist/ng-cast.component.d.ts index f42723d..031d192 100644 --- a/dist/ng-cast.component.d.ts +++ b/dist/ng-cast.component.d.ts @@ -4,6 +4,9 @@ export declare class NgCastComponent implements OnInit { private ngCastService; castingStatus: any; window: any; + videoImage: string; + imageOffline: boolean; + srcImageOffline: string; constructor(ngCastService: NgCastService); ngOnInit(): void; openSession(): void; diff --git a/dist/package.json b/dist/package.json index 2fed340..7308973 100644 --- a/dist/package.json +++ b/dist/package.json @@ -4,7 +4,7 @@ "assets": [ "./CastVideos.js" ], - "version": "0.1.28", + "version": "0.2.7", "description": "Broadcast media on your TV from your Angular app", "main": "bundles/thinkam.net-ng-cast.umd.js", "repository": { diff --git a/dist/thinkam.net-ng-cast.metadata.json b/dist/thinkam.net-ng-cast.metadata.json index cc947a1..4ed2ac8 100644 --- a/dist/thinkam.net-ng-cast.metadata.json +++ b/dist/thinkam.net-ng-cast.metadata.json @@ -1 +1 @@ -{"__symbolic":"module","version":4,"metadata":{"NgCastModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":6,"character":1},"arguments":[{"schemas":[{"__symbolic":"reference","module":"@angular/core","name":"CUSTOM_ELEMENTS_SCHEMA","line":7,"character":13}],"imports":[{"__symbolic":"reference","module":"@angular/common","name":"CommonModule","line":9,"character":4}],"exports":[{"__symbolic":"reference","name":"ɵa"}],"providers":[{"__symbolic":"reference","name":"NgCastService"}],"declarations":[{"__symbolic":"reference","name":"ɵa"}]}]}],"members":{}},"NgCastService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":8,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor"}],"initializeCastApi":[{"__symbolic":"method"}],"setCasting":[{"__symbolic":"method"}],"getStatus":[{"__symbolic":"method"}]}},"ɵa":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":4,"character":1},"arguments":[{"selector":"ng-cast","template":"cast\ncast_connected","styles":[""]}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"NgCastService"}]}],"ngOnInit":[{"__symbolic":"method"}],"openSession":[{"__symbolic":"method"}],"closeSession":[{"__symbolic":"method"}]}}},"origins":{"NgCastModule":"./ng.cast.module","NgCastService":"./shared/ng-cast.service","ɵa":"./ng-cast.component"},"importAs":"@thinkam.net/ng-cast"} \ No newline at end of file +{"__symbolic":"module","version":4,"metadata":{"NgCastModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":6,"character":1},"arguments":[{"schemas":[{"__symbolic":"reference","module":"@angular/core","name":"CUSTOM_ELEMENTS_SCHEMA","line":7,"character":13}],"imports":[{"__symbolic":"reference","module":"@angular/common","name":"CommonModule","line":9,"character":4}],"exports":[{"__symbolic":"reference","name":"ɵa"}],"providers":[{"__symbolic":"reference","name":"NgCastService"}],"declarations":[{"__symbolic":"reference","name":"ɵa"}]}]}],"members":{}},"NgCastService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":8,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor"}],"initializeCastApi":[{"__symbolic":"method"}],"setCasting":[{"__symbolic":"method"}],"getStatus":[{"__symbolic":"method"}]}},"ɵa":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":4,"character":1},"arguments":[{"selector":"ng-cast","template":"
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n","styles":[""]}]}],"members":{"videoImage":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":15,"character":3}}]}],"imageOffline":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":16,"character":3}}]}],"srcImageOffline":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":17,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"NgCastService"}]}],"ngOnInit":[{"__symbolic":"method"}],"openSession":[{"__symbolic":"method"}],"closeSession":[{"__symbolic":"method"}]}}},"origins":{"NgCastModule":"./ng.cast.module","NgCastService":"./shared/ng-cast.service","ɵa":"./ng-cast.component"},"importAs":"@thinkam.net/ng-cast"} \ No newline at end of file diff --git a/index.ts b/index.ts index 6d95813..1e0b12b 100644 --- a/index.ts +++ b/index.ts @@ -1,5 +1,5 @@ - // ------ project path -------- | --- lib --- -import "/home/thinker/dev/thinkam/ngCast/CastVideos.js"; - export * from './ng.cast.module'; export * from './shared/ng-cast.service'; + +// ------ project path -------- | --- lib --- +import "/home/thinker/dev/thinkam/ngCast/CastVideos.js"; diff --git a/ng-cast.component.html b/ng-cast.component.html index c9422c7..e0d335d 100644 --- a/ng-cast.component.html +++ b/ng-cast.component.html @@ -1,2 +1,46 @@ -cast -cast_connected \ No newline at end of file +
+
+
IDLE
+
IDLE
+ +
+ +
+ +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
00:00:00
+
+
+
+
+
+
+
+
+
+
+ + + +TV Offline diff --git a/ng-cast.component.ts b/ng-cast.component.ts index 52fb5bf..41b017a 100644 --- a/ng-cast.component.ts +++ b/ng-cast.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, Input, OnInit } from '@angular/core'; import { NgCastService } from './shared/ng-cast.service'; @@ -13,6 +13,10 @@ export class NgCastComponent implements OnInit { castingStatus: any; window: any; + @Input() videoImage = ''; + @Input() imageOffline = false; + @Input() srcImageOffline = ''; + constructor( private ngCastService: NgCastService ) { } diff --git a/package.json b/package.json index e3842e6..a04960e 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "assets": [ "./CastVideos.js" ], - "version": "0.1.28", + "version": "0.2.7", "ngPackage": { "lib": { "entryFile": "index.ts" diff --git a/shared/ng-cast.service.ts b/shared/ng-cast.service.ts index b86c7f7..363ae84 100644 --- a/shared/ng-cast.service.ts +++ b/shared/ng-cast.service.ts @@ -24,7 +24,7 @@ export class NgCastService { initializeCastApi() { this.cast = this.window['chrome'].cast; - let sessionRequest = new this.cast.SessionRequest(this.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID); + let sessionRequest = new this.cast.SessionRequest('4F8B3483'); let apiConfig = new this.cast.ApiConfig(sessionRequest, () => { }, (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } } @@ -66,6 +66,10 @@ export class NgCastService { window['document'].body.appendChild(script); globalThis.CastPlayer.mediaJSON.categories = categories; + + globalThis.CastPlayer.addMediaContents(); + globalThis.CastPlayer.setupLocalPlayer(); + globalThis.CastPlayer.initializeUI(); }; play = () => { @@ -85,7 +89,7 @@ export class NgCastService { }; setCasting(value: any) { - globalThis.CastPlayer.addVideoThumbs(); + globalThis.CastPlayer.addMediaContents(); this.status.casting = value; } diff --git a/tsconfig.json b/tsconfig.json index 4af68ad..35bbf8f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,11 +7,8 @@ "dom" ], /* Specify library files to be included in the compilation. */ "baseUrl": ".", - "paths": { - "@types/*": [ "./@types/*" ] - }, - "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ + //"allowJs": true, /* Allow javascript files to be compiled. */ + "checkJs": false, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ "declaration": true, /* Generates corresponding '.d.ts' file. */ // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ @@ -71,8 +68,4 @@ "files": [ "index.ts" ] - // "include": [ - // "./typings.d.ts" - // ], - // "typeRoots": ["@types"] } From 189193cf03db8656c78f88bcbec94778e6c70185 Mon Sep 17 00:00:00 2001 From: Felipe de Almeida Date: Sun, 11 Oct 2020 19:37:47 -0300 Subject: [PATCH 03/10] style component --- CastVideos.js => cast-videos.js | 694 ++++++++--------- dist/bundles/thinkam.net-ng-cast.umd.js | 537 ++++++------- dist/bundles/thinkam.net-ng-cast.umd.js.map | 2 +- dist/bundles/thinkam.net-ng-cast.umd.min.js | 2 +- .../thinkam.net-ng-cast.umd.min.js.map | 2 +- dist/esm2015/index.js | 4 +- dist/esm2015/ng-cast.component.js | 4 +- dist/esm2015/shared/ng-cast.service.js | 13 +- dist/fesm2015/thinkam.net-ng-cast.js | 707 ++++++++---------- dist/fesm2015/thinkam.net-ng-cast.js.map | 2 +- dist/index.d.ts | 2 +- dist/package.json | 5 +- dist/shared/ng-cast.service.d.ts | 3 +- dist/thinkam.net-ng-cast.metadata.json | 2 +- index.ts | 4 +- ng-cast.component.scss | 454 ++++++++++- ng-cast.component.ts | 1 - package.json | 7 +- shared/ng-cast.service.ts | 14 +- 19 files changed, 1381 insertions(+), 1078 deletions(-) rename CastVideos.js => cast-videos.js (66%) diff --git a/CastVideos.js b/cast-videos.js similarity index 66% rename from CastVideos.js rename to cast-videos.js index 81316a4..a098412 100755 --- a/CastVideos.js +++ b/cast-videos.js @@ -112,7 +112,7 @@ var CastPlayer = function () { }; }; -CastPlayer.prototype.initializeCastPlayer = function () { +CastPlayer.prototype.initializeCastPlayer = () => { var options = {}; // Set the receiver application ID to your own (created in the @@ -128,33 +128,29 @@ CastPlayer.prototype.initializeCastPlayer = function () { cast.framework.CastContext.getInstance().setOptions(options); - this.remotePlayer = new cast.framework.RemotePlayer(); - this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer); - this.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, - function (e) { - this.switchPlayer(e.value); - }.bind(this) + castPlayer.remotePlayer = new cast.framework.RemotePlayer(); + castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer); + castPlayer.remotePlayerController.addEventListener( + cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, + castPlayer.switchPlayer.bind(castPlayer) ); }; /** * Switch between the remote and local players. */ -CastPlayer.prototype.switchPlayer = function () { - this.playerStateBeforeSwitch = this.playerState; - - this.stopProgressTimer(); - this.resetVolumeSlider(); - - // Session is active - if (cast && cast.framework && this.remotePlayer.isConnected) { - // Pause local playback - this.playerHandler.pause(); - this.setupRemotePlayer(); - } else { - this.setupLocalPlayer(); +CastPlayer.prototype.switchPlayer = () => { + castPlayer.stopProgressTimer(); + castPlayer.resetVolumeSlider(); + castPlayer.playerHandler.stop(); + castPlayer.playerState = PLAYER_STATE.IDLE; + if (cast && cast.framework) { + if (castPlayer.remotePlayer.isConnected) { + castPlayer.setupRemotePlayer(); + return; + } } + castPlayer.setupLocalPlayer(); }; /** @@ -275,10 +271,6 @@ var PlayerHandler = function (castPlayer) { this.target.updateCurrentTimeDisplay(); }; - this.updateDurationDisplay = function () { - this.target.updateDurationDisplay(); - }; - /** * Determines the correct time string (media or clock) and sets it for the given element. */ @@ -314,82 +306,82 @@ var PlayerHandler = function (castPlayer) { /** * Set the PlayerHandler target to use the video-element player */ -CastPlayer.prototype.setupLocalPlayer = function () { +CastPlayer.prototype.setupLocalPlayer = () => { var localPlayer = document.getElementById('video_element'); localPlayer.addEventListener( - 'loadeddata', this.onMediaLoadedLocally.bind(this)); + 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer)); // This object will implement PlayerHandler callbacks with localPlayer var playerTarget = {}; - playerTarget.play = function() { - localPlayer.play(); + playerTarget.play = function () { + localPlayer.play(); - var vi = document.getElementById('video_image'); - vi.style.display = 'none'; - localPlayer.style.display = 'block'; + var vi = document.getElementById('video_image'); + vi.style.display = 'none'; + localPlayer.style.display = 'block'; }; playerTarget.pause = function () { - localPlayer.pause(); + localPlayer.pause(); }; playerTarget.stop = function () { - localPlayer.stop(); + localPlayer.stop(); }; - playerTarget.load = function(mediaIndex) { - localPlayer.src = - this.mediaContents[mediaIndex]['sources'][0]; - localPlayer.load(); - }.bind(this); + playerTarget.load = function (mediaIndex) { + localPlayer.src = + castPlayer.mediaContents[mediaIndex]['sources'][0]; + localPlayer.load(); + }.bind(castPlayer); - playerTarget.getCurrentMediaTime = function() { - return localPlayer.currentTime; + playerTarget.getCurrentMediaTime = function () { + return localPlayer.currentTime; }; - playerTarget.getMediaDuration = function() { - return localPlayer.duration; + playerTarget.getMediaDuration = function () { + return localPlayer.duration; }; playerTarget.updateDisplayMessage = function () { - document.getElementById('playerstate').style.display = 'none'; - document.getElementById('playerstatebg').style.display = 'none'; - document.getElementById('video_image_overlay').style.display = 'none'; + document.getElementById('playerstate').style.display = 'none'; + document.getElementById('playerstatebg').style.display = 'none'; + document.getElementById('video_image_overlay').style.display = 'none'; }; - playerTarget.setVolume = function(volumeSliderPosition) { - localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ? - volumeSliderPosition / FULL_VOLUME_HEIGHT : 1; - var p = document.getElementById('audio_bg_level'); - p.style.height = volumeSliderPosition + 'px'; - p.style.marginTop = -volumeSliderPosition + 'px'; + playerTarget.setVolume = function (volumeSliderPosition) { + localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ? + volumeSliderPosition / FULL_VOLUME_HEIGHT : 1; + var p = document.getElementById('audio_bg_level'); + p.style.height = volumeSliderPosition + 'px'; + p.style.marginTop = -volumeSliderPosition + 'px'; }; - playerTarget.mute = function() { - localPlayer.muted = true; + playerTarget.mute = function () { + localPlayer.muted = true; }; - playerTarget.unMute = function() { - localPlayer.muted = false; + playerTarget.unMute = function () { + localPlayer.muted = false; }; - playerTarget.isMuted = function() { - return localPlayer.muted; + playerTarget.isMuted = function () { + return localPlayer.muted; }; - playerTarget.seekTo = function(time) { - localPlayer.currentTime = time; + playerTarget.seekTo = function (time) { + localPlayer.currentTime = time; }; - this.playerHandler.setTarget(playerTarget); + castPlayer.playerHandler.setTarget(playerTarget); - this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT); + castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT); - this.showFullscreenButton(); + castPlayer.showFullscreenButton(); - if (this.currentMediaTime > 0) { - this.playerHandler.play(); + if (castPlayer.currentMediaTime > 0) { + castPlayer.playerHandler.play(); } }; @@ -399,121 +391,121 @@ CastPlayer.prototype.setupLocalPlayer = function () { */ CastPlayer.prototype.setupRemotePlayer = function () { // Triggers when the media info or the player state changes - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED, function (event) { let session = cast.framework.CastContext.getInstance().getCurrentSession(); if (!session) { - this.mediaInfo = null; - this.isLiveContent = false; - this.playerHandler.updateDisplay(); + castPlayer.mediaInfo = null; + castPlayer.isLiveContent = false; + castPlayer.playerHandler.updateDisplay(); return; } let media = session.getMediaSession(); if (!media) { - this.mediaInfo = null; - this.isLiveContent = false; - this.playerHandler.updateDisplay(); + castPlayer.mediaInfo = null; + castPlayer.isLiveContent = false; + castPlayer.playerHandler.updateDisplay(); return; } - this.mediaInfo = media.media; + castPlayer.mediaInfo = media.media; - if (this.mediaInfo) { - this.isLiveContent = (this.mediaInfo.streamType == + if (castPlayer.mediaInfo) { + castPlayer.isLiveContent = (castPlayer.mediaInfo.streamType == chrome.cast.media.StreamType.LIVE); } else { - this.isLiveContent = false; + castPlayer.isLiveContent = false; } - if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) { - this.playerHandler.prepareToPlay(); + if (media.playerState == PLAYER_STATE.PLAYING && castPlayer.playerState !== PLAYER_STATE.PLAYING) { + castPlayer.playerHandler.prepareToPlay(); } - this.removeAdMarkers(); - this.updateAdMarkers(); + castPlayer.removeAdMarkers(); + castPlayer.updateAdMarkers(); - this.playerHandler.updateDisplay(); - }.bind(this) + castPlayer.playerHandler.updateDisplay(); + }.bind(castPlayer) ); - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED, function (event) { - this.enableProgressBar(event.value); - }.bind(this) + castPlayer.enableProgressBar(event.value); + }.bind(castPlayer) ); - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, function () { - if (this.remotePlayer.isPaused) { - this.playerHandler.pause(); - } else if (this.playerState !== PLAYER_STATE.PLAYING) { + if (castPlayer.remotePlayer.isPaused) { + castPlayer.playerHandler.pause(); + } else if (castPlayer.playerState !== PLAYER_STATE.PLAYING) { // If currently not playing, start to play. // This occurs if starting to play from local, but this check is // required if the state is changed remotely. - this.playerHandler.play(); + castPlayer.playerHandler.play(); } - }.bind(this) + }.bind(castPlayer) ); - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED, function () { - if (this.remotePlayer.isMuted) { - this.playerHandler.mute(); + if (castPlayer.remotePlayer.isMuted) { + castPlayer.playerHandler.mute(); } else { - this.playerHandler.unMute(); + castPlayer.playerHandler.unMute(); } - }.bind(this) + }.bind(castPlayer) ); - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED, function () { - var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; + var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; var p = document.getElementById('audio_bg_level'); p.style.height = newVolume + 'px'; p.style.marginTop = -newVolume + 'px'; - }.bind(this) + }.bind(castPlayer) ); - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED, function (event) { - this.isPlayingBreak(event.value); - }.bind(this) + castPlayer.isPlayingBreak(event.value); + }.bind(castPlayer) ); - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED, function (event) { - this.onWhenSkippableChanged(event.value); - }.bind(this) + castPlayer.onWhenSkippableChanged(event.value); + }.bind(castPlayer) ); - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED, function (event) { - this.onCurrentBreakClipTimeChanged(event.value); - }.bind(this) + castPlayer.onCurrentBreakClipTimeChanged(event.value); + }.bind(castPlayer) ); - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED, function (event) { - this.onBreakClipIdChanged(event.value); - }.bind(this) + castPlayer.onBreakClipIdChanged(event.value); + }.bind(castPlayer) ); - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED, function (event) { console.log('LIVE_SEEKABLE_RANGE_CHANGED'); - this.liveSeekableRange = event.value; - }.bind(this) + castPlayer.liveSeekableRange = event.value; + }.bind(castPlayer) ); // This object will implement PlayerHandler callbacks with @@ -522,92 +514,47 @@ CastPlayer.prototype.setupRemotePlayer = function () { var playerTarget = {}; playerTarget.play = function () { - if (this.remotePlayer.isPaused) { - this.remotePlayerController.playOrPause(); + if (castPlayer.remotePlayer.isPaused) { + castPlayer.remotePlayerController.playOrPause(); } var vi = document.getElementById('video_image'); vi.style.display = ''; var localPlayer = document.getElementById('video_element'); localPlayer.style.display = 'none'; - }.bind(this); + }.bind(castPlayer); playerTarget.pause = function () { - if (!this.remotePlayer.isPaused) { - this.remotePlayerController.playOrPause(); + if (!castPlayer.remotePlayer.isPaused) { + castPlayer.remotePlayerController.playOrPause(); } - }.bind(this); + }.bind(castPlayer); playerTarget.stop = function () { - this.remotePlayerController.stop(); - }.bind(this); + castPlayer.remotePlayerController.stop(); + }.bind(castPlayer); // Load request for local -> remote playerTarget.load = function (mediaIndex) { console.log('Loading...' + this.mediaContents[mediaIndex]['title']); + var mediaInfo = new chrome.cast.media.MediaInfo( + this.mediaContents[mediaIndex]['sources'][0], 'video/mp4'); - let mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4'); - mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED; - mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata(); + mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata(); + mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC; mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title']; - mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle']; - mediaInfo.metadata.images = [{ - 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'] - }]; - - let request = new chrome.cast.media.LoadRequest(mediaInfo); - request.currentTime = this.currentMediaTime; - - if (ENABLE_ADS) { - // Add sample breaks and breakClips. - mediaInfo.breakClips = breakClipsJSON; - mediaInfo.breaks = breaksJSON; - } else if (ENABLE_LIVE) { - // Change the streamType and add live specific metadata. - mediaInfo.streamType = chrome.cast.media.StreamType.LIVE; - // TODO: Set the metadata on the receiver side in your implementation. - // startAbsoluteTime and sectionStartTimeInMedia will be set for you. - // See https://developers.google.com/cast/docs/caf_receiver/live. - - // TODO: Start time, is a fake timestamp. Use correct values for your implementation. - let currentTime = new Date(); - // Convert from milliseconds to seconds. - currentTime = currentTime / 1000; - let sectionStartAbsoluteTime = currentTime; - - // Duration should be -1 for live streams. - mediaInfo.duration = -1; - // TODO: Set on the receiver for your implementation. - mediaInfo.startAbsoluteTime = currentTime; - mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime; - // TODO: Set on the receiver for your implementation. - mediaInfo.metadata.sectionStartTimeInMedia = 0; - mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration']; - - let item = new chrome.cast.media.QueueItem(mediaInfo); - request.queueData = new chrome.cast.media.QueueData(); - request.queueData.items = [item]; - request.queueData.name = "Sample Queue for Live"; - } - - // Do not immediately start playing if the player was previously PAUSED. - if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) { - request.autoplay = false; - } else { - request.autoplay = true; - } - - cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then( - function () { - console.log('Remote media loaded'); - }.bind(this), - function (errorCode) { - this.playerState = PLAYER_STATE.IDLE; - console.log('Remote media load error: ' + - CastPlayer.getErrorMessage(errorCode)); - this.playerHandler.updateDisplay(); - }.bind(this)); - }.bind(this); + mediaInfo.metadata.images = [ + {'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']}]; + + var request = new chrome.cast.media.LoadRequest(mediaInfo); + castSession.loadMedia(request).then( + this.playerHandler.loaded.bind(this.playerHandler), + function (errorCode) { + this.playerState = PLAYER_STATE.ERROR; + console.log('Remote media load error: ' + + CastPlayer.getErrorMessage(errorCode)); + }.bind(castPlayer)); + }.bind(castPlayer); playerTarget.isMediaLoaded = function (mediaIndex) { let session = cast.framework.CastContext.getInstance().getCurrentSession(); @@ -622,40 +569,40 @@ CastPlayer.prototype.setupRemotePlayer = function () { // No need to verify local mediaIndex content. return true; - }.bind(this); + }.bind(castPlayer); /** * @return {number?} Current media time for the content. Always returns * media time even if in clock time (conversion done when displaying). */ playerTarget.getCurrentMediaTime = function () { - if (this.isLiveContent && this.mediaInfo.metadata && - this.mediaInfo.metadata.sectionStartTimeInMedia) { - return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia; + if (castPlayer.isLiveContent && castPlayer.mediaInfo.metadata && + castPlayer.mediaInfo.metadata.sectionStartTimeInMedia) { + return castPlayer.remotePlayer.currentTime - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; } else { // VOD and live scenerios where live metadata is not provided. - return this.remotePlayer.currentTime; + return castPlayer.remotePlayer.currentTime; } - }.bind(this); + }.bind(castPlayer); /** * @return {number?} media time duration for the content. Always returns * media time even if in clock time (conversion done when displaying). */ playerTarget.getMediaDuration = function () { - if (this.isLiveContent) { + if (castPlayer.isLiveContent) { // Scenerios when live metadata is not provided. - if (this.mediaInfo.metadata == undefined || - this.mediaInfo.metadata.sectionDuration == undefined || - this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) { + if (castPlayer.mediaInfo.metadata == undefined || + castPlayer.mediaInfo.metadata.sectionDuration == undefined || + castPlayer.mediaInfo.metadata.sectionStartTimeInMedia == undefined) { return null; } - return this.mediaInfo.metadata.sectionDuration; + return castPlayer.mediaInfo.metadata.sectionDuration; } else { - return this.remotePlayer.duration; + return castPlayer.remotePlayer.duration; } - }.bind(this); + }.bind(castPlayer); playerTarget.updateDisplay = function () { let castSession = cast.framework.CastContext.getInstance().getCurrentSession(); @@ -709,14 +656,14 @@ CastPlayer.prototype.setupRemotePlayer = function () { // live information if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) { - this.liveSeekableRange = media.liveSeekableRange; + castPlayer.liveSeekableRange = media.liveSeekableRange; let live_indicator = document.getElementById('live_indicator'); live_indicator.style.display = 'block'; // Display indicator if current time is close to the end of // the seekable range. - if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) { + if (castPlayer.liveSeekableRange && (Math.abs(media.getEstimatedTime() - castPlayer.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) { live_indicator.src = "imagefiles/live_indicator_active.png"; } else { live_indicator.src = "imagefiles/live_indicator_inactive.png"; @@ -734,29 +681,25 @@ CastPlayer.prototype.setupRemotePlayer = function () { document.getElementById('media_title').innerHTML = ""; document.getElementById('media_subtitle').innerHTML = ""; } - }.bind(this); + }.bind(castPlayer); playerTarget.updateCurrentTimeDisplay = function () { - this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime()); - }.bind(this); - - playerTarget.updateDurationDisplay = function () { - this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration()); - }.bind(this); + castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), castPlayer.playerHandler.getCurrentMediaTime()); + }.bind(castPlayer); playerTarget.setTimeString = function (element, time) { - let currentTimeString = this.getMediaTimeString(time); + let currentTimeString = castPlayer.getMediaTimeString(time); - if (this.isLiveContent) { + if (castPlayer.isLiveContent) { if (currentTimeString == null) { element.style.display = 'none'; return; } // clock time - if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) { + if (castPlayer.mediaInfo.metadata && castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) { element.style.display = 'flex'; - element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime); + element.innerHTML = castPlayer.getClockTimeString(time + castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime); } else { // media time element.style.display = 'flex'; @@ -770,10 +713,10 @@ CastPlayer.prototype.setupRemotePlayer = function () { element.style.display = 'none'; } } - }.bind(this); + }.bind(castPlayer); playerTarget.setVolume = function (volumeSliderPosition) { - var currentVolume = this.remotePlayer.volumeLevel; + var currentVolume = castPlayer.remotePlayer.volumeLevel; var p = document.getElementById('audio_bg_level'); if (volumeSliderPosition < FULL_VOLUME_HEIGHT) { p.style.height = volumeSliderPosition + 'px'; @@ -782,40 +725,40 @@ CastPlayer.prototype.setupRemotePlayer = function () { } else { currentVolume = 1; } - this.remotePlayer.volumeLevel = currentVolume; - this.remotePlayerController.setVolumeLevel(); - }.bind(this); + castPlayer.remotePlayer.volumeLevel = currentVolume; + castPlayer.remotePlayerController.setVolumeLevel(); + }.bind(castPlayer); playerTarget.mute = function () { - if (!this.remotePlayer.isMuted) { - this.remotePlayerController.muteOrUnmute(); + if (!castPlayer.remotePlayer.isMuted) { + castPlayer.remotePlayerController.muteOrUnmute(); } - }.bind(this); + }.bind(castPlayer); playerTarget.unMute = function () { - if (this.remotePlayer.isMuted) { - this.remotePlayerController.muteOrUnmute(); + if (castPlayer.remotePlayer.isMuted) { + castPlayer.remotePlayerController.muteOrUnmute(); } - }.bind(this); + }.bind(castPlayer); playerTarget.isMuted = function () { - return this.remotePlayer.isMuted; - }.bind(this); + return castPlayer.remotePlayer.isMuted; + }.bind(castPlayer); playerTarget.seekTo = function (time) { - this.remotePlayer.currentTime = time; - this.remotePlayerController.seek(); - }.bind(this); + castPlayer.remotePlayer.currentTime = time; + castPlayer.remotePlayerController.seek(); + }.bind(castPlayer); - this.playerHandler.setTarget(playerTarget); + castPlayer.playerHandler.setTarget(playerTarget); // Setup remote player properties on setup - if (this.remotePlayer.isMuted) { - this.playerHandler.mute(); + if (castPlayer.remotePlayer.isMuted) { + castPlayer.playerHandler.mute(); } - this.enableProgressBar(this.remotePlayer.canSeek); + castPlayer.enableProgressBar(castPlayer.remotePlayer.canSeek); // The remote player may have had a volume set from previous playback - var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; + var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; var p = document.getElementById('audio_bg_level'); p.style.height = currentVolume + 'px'; p.style.marginTop = -currentVolume + 'px'; @@ -823,21 +766,21 @@ CastPlayer.prototype.setupRemotePlayer = function () { // Show media_control document.getElementById('media_control').style.opacity = 0.7; - this.hideFullscreenButton(); + castPlayer.hideFullscreenButton(); // If resuming a session, take the remote properties and continue the existing // playback. Otherwise, load local content. if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() == cast.framework.SessionState.SESSION_RESUMED) { console.log('Resuming session'); - this.playerHandler.prepareToPlay(); + castPlayer.playerHandler.prepareToPlay(); // New media has been loaded so the previous ad markers should // be removed. - this.removeAdMarkers(); - this.updateAdMarkers(); + castPlayer.removeAdMarkers(); + castPlayer.updateAdMarkers(); } else { - this.playerHandler.load(); + castPlayer.playerHandler.load(); } }; @@ -846,9 +789,9 @@ CastPlayer.prototype.setupRemotePlayer = function () { */ CastPlayer.prototype.onMediaLoadedLocally = function () { var localPlayer = document.getElementById('video_element'); - localPlayer.currentTime = this.currentMediaTime; + localPlayer.currentTime = castPlayer.currentMediaTime; - this.playerHandler.prepareToPlay(); + castPlayer.playerHandler.prepareToPlay(); }; /** @@ -858,13 +801,13 @@ CastPlayer.prototype.onMediaLoadedLocally = function () { CastPlayer.prototype.selectMedia = function (mediaIndex) { console.log('Media index selected: ' + mediaIndex); - this.currentMediaIndex = mediaIndex; + castPlayer.currentMediaIndex = mediaIndex; // Clear currentMediaInfo when playing content from the sender. - this.playerHandler.currentMediaInfo = undefined; + castPlayer.playerHandler.currentMediaInfo = undefined; // Set video image var vi = document.getElementById('video_image'); - vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']; + vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']; // Reset progress bar var pi = document.getElementById('progress_indicator'); @@ -878,13 +821,13 @@ CastPlayer.prototype.selectMedia = function (mediaIndex) { unseekable_overlay.style.width = '0px'; // Stop timer and reset time displays - this.stopProgressTimer(); - this.currentMediaTime = 0; - this.playerHandler.setTimeString(document.getElementById('currentTime'), 0); - this.playerHandler.setTimeString(document.getElementById('duration'), 0); + castPlayer.stopProgressTimer(); + castPlayer.currentMediaTime = 0; + castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0); + castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0); - this.playerState = PLAYER_STATE.IDLE; - this.playerHandler.play(); + castPlayer.playerState = PLAYER_STATE.IDLE; + castPlayer.playerHandler.play(); }; /** @@ -892,12 +835,12 @@ CastPlayer.prototype.selectMedia = function (mediaIndex) { * @param {Event} event An event object from seek */ CastPlayer.prototype.seekMedia = function (event) { - if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) { + if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) { console.log('Error - Not seekable'); return; } - if (this.isLiveContent && !this.liveSeekableRange) { + if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) { console.log('Live content has no seekable range.') return; } @@ -909,28 +852,28 @@ CastPlayer.prototype.seekMedia = function (event) { let pp = 0; let pw = 0; if (event.currentTarget.id == 'progress_indicator') { - seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position / + seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position / PROGRESS_BAR_WIDTH, 10); pp = parseInt(pi.style.marginLeft, 10) + position; pw = parseInt(progress.style.width, 10) + position; } else { - seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10); + seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10); pp = position; pw = position; } - if (this.playerState === PLAYER_STATE.PLAYING || - this.playerState === PLAYER_STATE.PAUSED) { - this.currentMediaTime = seekTime; + if (castPlayer.playerState === PLAYER_STATE.PLAYING || + castPlayer.playerState === PLAYER_STATE.PAUSED) { + castPlayer.currentMediaTime = seekTime; progress.style.width = pw + 'px'; pi.style.marginLeft = pp + 'px'; } - if (this.isLiveContent) { - seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia; + if (castPlayer.isLiveContent) { + seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; } - this.playerHandler.seekTo(seekTime); + castPlayer.playerHandler.seekTo(seekTime); }; /** @@ -945,26 +888,26 @@ CastPlayer.prototype.setVolume = function (mouseEvent) { } else { pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10); } - this.playerHandler.setVolume(pos); + castPlayer.playerHandler.setVolume(pos); }; /** * Starts the timer to increment the media progress bar */ CastPlayer.prototype.startProgressTimer = function () { - this.stopProgressTimer(); + castPlayer.stopProgressTimer(); // Start progress timer - this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP); + castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP); }; /** * Stops the timer to increment the media progress bar */ CastPlayer.prototype.stopProgressTimer = function () { - if (this.timer) { - clearInterval(this.timer); - this.timer = null; + if (castPlayer.timer) { + clearInterval(castPlayer.timer); + castPlayer.timer = null; } }; @@ -973,16 +916,16 @@ CastPlayer.prototype.stopProgressTimer = function () { */ CastPlayer.prototype.incrementMediaTime = function () { // First sync with the current player's time - this.currentMediaTime = this.playerHandler.getCurrentMediaTime(); - this.mediaDuration = this.playerHandler.getMediaDuration(); + castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime(); + castPlayer.mediaDuration = castPlayer.playerHandler.getMediaDuration(); - this.playerHandler.updateDurationDisplay(); + castPlayer.playerHandler.updateDurationDisplay(); - if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) { - this.playerHandler.updateCurrentTimeDisplay(); - this.updateProgressBarByTimer(); - } else if (this.mediaDuration > 0) { - this.endPlayback(); + if (castPlayer.mediaDuration == null || castPlayer.currentMediaTime < castPlayer.mediaDuration || castPlayer.isLiveContent) { + castPlayer.playerHandler.updateCurrentTimeDisplay(); + castPlayer.updateProgressBarByTimer(); + } else if (castPlayer.mediaDuration > 0) { + castPlayer.endPlayback(); } }; @@ -994,20 +937,20 @@ CastPlayer.prototype.updateProgressBarByTimer = function () { var pi = document.getElementById('progress_indicator'); // Live situation where the progress and duration is unknown. - if (this.mediaDuration == null) { - if (!this.isLiveContent) { + if (castPlayer.mediaDuration == null) { + if (!castPlayer.isLiveContent) { console.log('Error - Duration is not defined for a VOD stream.'); } progressBar.style.width = '0px'; - + let skip = document.getElementById('skip'); if (skip && skip.style && skip.style.display) { skip.style.display = 'none'; } pi.style.display = 'none'; - + let seekable_window = document.getElementById('seekable_window'); if (seekable_window && seekable_window.style && seekable_window.style.width) seekable_window.style.width = '0px'; @@ -1027,7 +970,7 @@ CastPlayer.prototype.updateProgressBarByTimer = function () { // Prevent indicator from exceeding the max width. Happens during // short media when each progress step is large - var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration); + var pp = Math.floor(PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.mediaDuration); if (pp > PROGRESS_BAR_WIDTH) { pp = PROGRESS_BAR_WIDTH; } else if (pp < 0) { @@ -1039,12 +982,12 @@ CastPlayer.prototype.updateProgressBarByTimer = function () { let seekable_window = document.getElementById('seekable_window'); let unseekable_overlay = document.getElementById('unseekable_overlay'); - if (this.isLiveContent) { - if (this.liveSeekableRange) { + if (castPlayer.isLiveContent) { + if (castPlayer.liveSeekableRange) { // Use the liveSeekableRange to draw the seekable and unseekable windows - let seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) - - this.mediaInfo.metadata.sectionStartTimeInMedia; - let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration); + let seekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.end) - + castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; + let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / castPlayer.mediaDuration); if (seekableWidth > PROGRESS_BAR_WIDTH) { seekableWidth = PROGRESS_BAR_WIDTH; } else if (seekableWidth < 0) { @@ -1052,9 +995,9 @@ CastPlayer.prototype.updateProgressBarByTimer = function () { } seekable_window.style.width = seekableWidth + 'px'; - let unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) - - this.mediaInfo.metadata.sectionStartTimeInMedia; - let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration); + let unseekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.start) - + castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; + let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / castPlayer.mediaDuration); if (unseekableWidth > PROGRESS_BAR_WIDTH) { unseekableWidth = PROGRESS_BAR_WIDTH; } else if (unseekableWidth < 0) { @@ -1072,8 +1015,8 @@ CastPlayer.prototype.updateProgressBarByTimer = function () { unseekable_overlay.style.width = '0px'; } - if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) { - this.endPlayback(); + if (pp >= PROGRESS_BAR_WIDTH && !castPlayer.isLiveContent) { + castPlayer.endPlayback(); } }; @@ -1081,10 +1024,10 @@ CastPlayer.prototype.updateProgressBarByTimer = function () { * End playback. Called when media ends. */ CastPlayer.prototype.endPlayback = function () { - this.currentMediaTime = 0; - this.stopProgressTimer(); - this.playerState = PLAYER_STATE.IDLE; - this.playerHandler.updateDisplay(); + castPlayer.currentMediaTime = 0; + castPlayer.stopProgressTimer(); + castPlayer.playerState = PLAYER_STATE.IDLE; + castPlayer.playerHandler.updateDisplay(); let play = document.getElementById('play'); if (play && play.style && play.display) @@ -1176,7 +1119,7 @@ CastPlayer.prototype.updateAdMarkers = function () { var div = document.getElementById('progress') div.innerHTML += '
'; + castPlayer.adPositionToMargin(adBreak.position, contentDuration) + 'px">'; } } }; @@ -1223,14 +1166,14 @@ CastPlayer.prototype.onBreakClipIdChanged = function () { * Disable progress bar if playing a break. */ CastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) { - this.enableProgressBar(!isPlayingBreak); + castPlayer.enableProgressBar(!isPlayingBreak); }; /** * Handle WHEN_SKIPPABLE_CHANGED event */ CastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) { - this.whenSkippable = whenSkippable; + castPlayer.whenSkippable = whenSkippable; }; /** @@ -1240,13 +1183,13 @@ CastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipT let skip = document.getElementById('skip'); // Unskippable - if (this.whenSkippable == undefined || this.whenSkippable < 0) { + if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) { // Hide skip button if (skip && skip.style && skip.style.display) skip.style.display = 'none'; } // Skippable - else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) { + else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) { // Show skip button if (skip && skip.style && skip.style.display) skip.style.display = 'block'; @@ -1263,7 +1206,7 @@ CastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipT * Skip the current Ad */ CastPlayer.prototype.skipAd = function () { - this.remotePlayerController.skipAd(); + castPlayer.remotePlayerController.skipAd(); } /** @@ -1283,9 +1226,9 @@ CastPlayer.prototype.enableProgressBar = function (enable) { progress_indicator.draggable = true; // Add listeners - progress.addEventListener('click', this.seekMediaListener); - seekable_window.addEventListener('click', this.seekMediaListener); - progress_indicator.addEventListener('dragend', this.seekMediaListener); + progress.addEventListener('click', castPlayer.seekMediaListener); + seekable_window.addEventListener('click', castPlayer.seekMediaListener); + progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener); } else { // Disable UI progress.style.backgroundImage = "url('./assets/imagefiles/timeline_bg_buffer.png')"; @@ -1295,9 +1238,9 @@ CastPlayer.prototype.enableProgressBar = function (enable) { progress_indicator.draggable = false; // Remove listeners - progress.removeEventListener('click', this.seekMediaListener); - seekable_window.removeEventListener('click', this.seekMediaListener); - progress_indicator.removeEventListener('dragend', this.seekMediaListener); + progress.removeEventListener('click', castPlayer.seekMediaListener); + seekable_window.removeEventListener('click', castPlayer.seekMediaListener); + progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener); } } @@ -1334,7 +1277,7 @@ CastPlayer.prototype.cancelFullScreen = function () { * Exit fullscreen mode by escape */ CastPlayer.prototype.fullscreenChangeHandler = function () { - this.fullscreen = !this.fullscreen; + castPlayer.fullscreen = !castPlayer.fullscreen; }; /** @@ -1344,12 +1287,12 @@ CastPlayer.prototype.showFullscreenButton = function () { let fullscreen_expand = document.getElementById('fullscreen_expand'); let fullscreen_collapse = document.getElementById('fullscreen_collapse'); - if (this.fullscreen) { + if (castPlayer.fullscreen) { if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) fullscreen_expand.style.display = 'none'; if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display) - fullscreen_collapse.style.display = 'block'; + fullscreen_collapse.style.display = 'block'; } else { if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) fullscreen_expand.style.display = 'block'; @@ -1367,10 +1310,10 @@ CastPlayer.prototype.hideFullscreenButton = function () { let fullscreen_collapse = document.getElementById('fullscreen_collapse'); if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) - fullscreen_expand.style.display = 'none'; + fullscreen_expand.style.display = 'none'; if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display) - fullscreen_collapse.style.display = 'none'; + fullscreen_collapse.style.display = 'none'; }; /** @@ -1401,7 +1344,7 @@ CastPlayer.prototype.hideMediaControl = function () { * Show the volume slider */ CastPlayer.prototype.showVolumeSlider = function () { - if (!this.playerHandler.isMuted()) { + if (!castPlayer.playerHandler.isMuted()) { document.getElementById('audio_bg').style.opacity = 1; document.getElementById('audio_bg_track').style.opacity = 1; document.getElementById('audio_bg_level').style.opacity = 1; @@ -1434,93 +1377,96 @@ CastPlayer.prototype.resetVolumeSlider = function () { /** * Initialize UI components and add event listeners */ -CastPlayer.prototype.initializeUI = function () { - // Set initial values for title, subtitle, and description - document.getElementById('media_title').innerHTML = - this.mediaContents[0]['title']; - document.getElementById('media_subtitle').innerHTML = - this.mediaContents[this.currentMediaIndex]['subtitle']; - document.getElementById('media_desc').innerHTML = - this.mediaContents[this.currentMediaIndex]['description']; - - // Add event handlers to UI components - document.getElementById('progress_bg').addEventListener( - 'click', this.seekMedia.bind(this)); - document.getElementById('progress').addEventListener( - 'click', this.seekMedia.bind(this)); - document.getElementById('progress_indicator').addEventListener( - 'dragend', this.seekMedia.bind(this)); - document.getElementById('audio_on').addEventListener( - 'click', this.playerHandler.mute.bind(this.playerHandler)); - document.getElementById('audio_off').addEventListener( - 'click', this.playerHandler.unMute.bind(this.playerHandler)); - document.getElementById('audio_bg').addEventListener( - 'mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_on').addEventListener( - 'mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_level').addEventListener( - 'mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_track').addEventListener( - 'mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_level').addEventListener( - 'click', this.setVolume.bind(this)); - document.getElementById('audio_bg_track').addEventListener( - 'click', this.setVolume.bind(this)); - document.getElementById('audio_bg').addEventListener( - 'mouseout', this.hideVolumeSlider.bind(this)); - document.getElementById('audio_on').addEventListener( - 'mouseout', this.hideVolumeSlider.bind(this)); - document.getElementById('main_video').addEventListener( - 'mouseover', this.showMediaControl.bind(this)); - document.getElementById('main_video').addEventListener( - 'mouseout', this.hideMediaControl.bind(this)); - document.getElementById('media_control').addEventListener( - 'mouseover', this.showMediaControl.bind(this)); - document.getElementById('media_control').addEventListener( - 'mouseout', this.hideMediaControl.bind(this)); - document.getElementById('fullscreen_expand').addEventListener( - 'click', this.requestFullScreen.bind(this)); - document.getElementById('fullscreen_collapse').addEventListener( - 'click', this.cancelFullScreen.bind(this)); - document.addEventListener( - 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false); - document.addEventListener( - 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false); - - // Enable play/pause buttons - document.getElementById('play').addEventListener( - 'click', this.playerHandler.play.bind(this.playerHandler)); - document.getElementById('pause').addEventListener( - 'click', this.playerHandler.pause.bind(this.playerHandler)); - document.getElementById('progress_indicator').draggable = true; +CastPlayer.prototype.initializeUI = () => { + // Set initial values for title, subtitle, and description + document.getElementById('media_title').innerHTML = + castPlayer.mediaContents[0]['title']; + document.getElementById('media_subtitle').innerHTML = + castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle']; + document.getElementById('media_desc').innerHTML = + castPlayer.mediaContents[castPlayer.currentMediaIndex]['description']; + + // Add event handlers to UI components + document.getElementById('progress_bg').addEventListener( + 'click', castPlayer.seekMedia.bind(castPlayer)); + document.getElementById('progress').addEventListener( + 'click', castPlayer.seekMedia.bind(castPlayer)); + document.getElementById('progress_indicator').addEventListener( + 'dragend', castPlayer.seekMedia.bind(castPlayer)); + document.getElementById('audio_on').addEventListener( + 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler)); + document.getElementById('audio_off').addEventListener( + 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler)); + document.getElementById('audio_bg').addEventListener( + 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer)); + document.getElementById('audio_on').addEventListener( + 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer)); + document.getElementById('audio_bg_level').addEventListener( + 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer)); + document.getElementById('audio_bg_track').addEventListener( + 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer)); + document.getElementById('audio_bg_level').addEventListener( + 'click', castPlayer.setVolume.bind(castPlayer)); + document.getElementById('audio_bg_track').addEventListener( + 'click', castPlayer.setVolume.bind(castPlayer)); + document.getElementById('audio_bg').addEventListener( + 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer)); + document.getElementById('audio_on').addEventListener( + 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer)); + document.getElementById('main_video').addEventListener( + 'mouseover', castPlayer.showMediaControl.bind(castPlayer)); + document.getElementById('main_video').addEventListener( + 'mouseout', castPlayer.hideMediaControl.bind(castPlayer)); + document.getElementById('media_control').addEventListener( + 'mouseover', castPlayer.showMediaControl.bind(castPlayer)); + document.getElementById('media_control').addEventListener( + 'mouseout', castPlayer.hideMediaControl.bind(castPlayer)); + document.getElementById('fullscreen_expand').addEventListener( + 'click', castPlayer.requestFullScreen.bind(castPlayer)); + document.getElementById('fullscreen_collapse').addEventListener( + 'click', castPlayer.cancelFullScreen.bind(castPlayer)); + document.addEventListener( + 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false); + document.addEventListener( + 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false); + + // Enable play/pause buttons + document.getElementById('play').addEventListener( + 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler)); + document.getElementById('pause').addEventListener( + 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler)); + document.getElementById('progress_indicator').draggable = true; }; /** * Add video thumbnails div's to UI for media JSON contents */ CastPlayer.prototype.addVideoThumbs = function () { - if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) { - this.mediaContents = this.mediaJSON['categories'][0]['videos']; + if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) { + castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos']; var ni = document.getElementById('carousel'); var newdiv = null; var divIdName = null; - for (var i = 0; i < this.mediaContents.length; i++) { + for (var i = 0; i < castPlayer.mediaContents.length; i++) { newdiv = document.createElement('div'); divIdName = 'thumb' + i + 'Div'; newdiv.setAttribute('id', divIdName); newdiv.setAttribute('class', 'thumb'); newdiv.innerHTML = - ''; - newdiv.addEventListener('click', this.selectMedia.bind(this, i)); + newdiv.addEventListener('click', castPlayer.selectMedia.bind(this, i)); ni.appendChild(newdiv); } } }; -CastPlayer.prototype.addMediaContents = function () { - if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) { - this.mediaContents = this.mediaJSON['categories'][0]['videos']; +CastPlayer.prototype.addMediaContents = () => { + if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) { + castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos']; + return castPlayer.mediaContents; + } else { + return null; } }; diff --git a/dist/bundles/thinkam.net-ng-cast.umd.js b/dist/bundles/thinkam.net-ng-cast.umd.js index 6d910b0..8c571b5 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.js +++ b/dist/bundles/thinkam.net-ng-cast.umd.js @@ -334,7 +334,7 @@ core.Component({ selector: 'ng-cast', template: "
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", - styles: [""] + styles: ["body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:1100px}#video_image{height:536px;margin:20px auto 0 40px;width:960px}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin:0 0 0 40px;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;width:960px}#video_element{background-color:#000;margin:20px auto 0 40px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin:-4px 0 0 40px;opacity:.9;padding:10px;width:940px}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px;width:95%}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;left:8px;margin:-60px 0 0 40px;opacity:.7;padding:0;position:absolute;top:650px;transition:opacity 1s;width:960px;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] }) ], exports.ɵa); @@ -376,9 +376,7 @@ script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1'); window['document'].body.appendChild(script); globalThis.CastPlayer.mediaJSON.categories = categories; - globalThis.CastPlayer.addMediaContents(); - globalThis.CastPlayer.setupLocalPlayer(); - globalThis.CastPlayer.initializeUI(); + return globalThis.CastPlayer.addMediaContents(); }; this.play = function () { _this.currentMedia.play(null); @@ -404,8 +402,13 @@ var x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError); }; ; + NgCastService.prototype.initialize = function (mediaContents) { + if (mediaContents) { + globalThis.CastPlayer.initializeUI(); + globalThis.CastPlayer.setupLocalPlayer(); + } + }; NgCastService.prototype.setCasting = function (value) { - globalThis.CastPlayer.addMediaContents(); this.status.casting = value; }; NgCastService.prototype.getStatus = function () { @@ -543,28 +546,25 @@ // PAGE_SCOPED - No auto connect options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED; cast.framework.CastContext.getInstance().setOptions(options); - this.remotePlayer = new cast.framework.RemotePlayer(); - this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, function (e) { - this.switchPlayer(e.value); - }.bind(this)); + castPlayer.remotePlayer = new cast.framework.RemotePlayer(); + castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer); + castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, castPlayer.switchPlayer.bind(castPlayer)); }; /** * Switch between the remote and local players. */ CastPlayer.prototype.switchPlayer = function () { - this.playerStateBeforeSwitch = this.playerState; - this.stopProgressTimer(); - this.resetVolumeSlider(); - // Session is active - if (cast && cast.framework && this.remotePlayer.isConnected) { - // Pause local playback - this.playerHandler.pause(); - this.setupRemotePlayer(); - } - else { - this.setupLocalPlayer(); + castPlayer.stopProgressTimer(); + castPlayer.resetVolumeSlider(); + castPlayer.playerHandler.stop(); + castPlayer.playerState = PLAYER_STATE.IDLE; + if (cast && cast.framework) { + if (castPlayer.remotePlayer.isConnected) { + castPlayer.setupRemotePlayer(); + return; + } } + castPlayer.setupLocalPlayer(); }; /** * PlayerHandler @@ -669,9 +669,6 @@ this.updateCurrentTimeDisplay = function () { this.target.updateCurrentTimeDisplay(); }; - this.updateDurationDisplay = function () { - this.target.updateDurationDisplay(); - }; /** * Determines the correct time string (media or clock) and sets it for the given element. */ @@ -703,7 +700,7 @@ */ CastPlayer.prototype.setupLocalPlayer = function () { var localPlayer = document.getElementById('video_element'); - localPlayer.addEventListener('loadeddata', this.onMediaLoadedLocally.bind(this)); + localPlayer.addEventListener('loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer)); // This object will implement PlayerHandler callbacks with localPlayer var playerTarget = {}; playerTarget.play = function () { @@ -720,9 +717,9 @@ }; playerTarget.load = function (mediaIndex) { localPlayer.src = - this.mediaContents[mediaIndex]['sources'][0]; + castPlayer.mediaContents[mediaIndex]['sources'][0]; localPlayer.load(); - }.bind(this); + }.bind(castPlayer); playerTarget.getCurrentMediaTime = function () { return localPlayer.currentTime; }; @@ -753,11 +750,11 @@ playerTarget.seekTo = function (time) { localPlayer.currentTime = time; }; - this.playerHandler.setTarget(playerTarget); - this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT); - this.showFullscreenButton(); - if (this.currentMediaTime > 0) { - this.playerHandler.play(); + castPlayer.playerHandler.setTarget(playerTarget); + castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT); + castPlayer.showFullscreenButton(); + if (castPlayer.currentMediaTime > 0) { + castPlayer.playerHandler.play(); } }; /** @@ -766,159 +763,118 @@ */ CastPlayer.prototype.setupRemotePlayer = function () { // Triggers when the media info or the player state changes - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED, function (event) { + castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED, function (event) { var session = cast.framework.CastContext.getInstance().getCurrentSession(); if (!session) { - this.mediaInfo = null; - this.isLiveContent = false; - this.playerHandler.updateDisplay(); + castPlayer.mediaInfo = null; + castPlayer.isLiveContent = false; + castPlayer.playerHandler.updateDisplay(); return; } var media = session.getMediaSession(); if (!media) { - this.mediaInfo = null; - this.isLiveContent = false; - this.playerHandler.updateDisplay(); + castPlayer.mediaInfo = null; + castPlayer.isLiveContent = false; + castPlayer.playerHandler.updateDisplay(); return; } - this.mediaInfo = media.media; - if (this.mediaInfo) { - this.isLiveContent = (this.mediaInfo.streamType == + castPlayer.mediaInfo = media.media; + if (castPlayer.mediaInfo) { + castPlayer.isLiveContent = (castPlayer.mediaInfo.streamType == chrome.cast.media.StreamType.LIVE); } else { - this.isLiveContent = false; + castPlayer.isLiveContent = false; } - if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) { - this.playerHandler.prepareToPlay(); + if (media.playerState == PLAYER_STATE.PLAYING && castPlayer.playerState !== PLAYER_STATE.PLAYING) { + castPlayer.playerHandler.prepareToPlay(); } - this.removeAdMarkers(); - this.updateAdMarkers(); - this.playerHandler.updateDisplay(); - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED, function (event) { - this.enableProgressBar(event.value); - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, function () { - if (this.remotePlayer.isPaused) { - this.playerHandler.pause(); + castPlayer.removeAdMarkers(); + castPlayer.updateAdMarkers(); + castPlayer.playerHandler.updateDisplay(); + }.bind(castPlayer)); + castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED, function (event) { + castPlayer.enableProgressBar(event.value); + }.bind(castPlayer)); + castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, function () { + if (castPlayer.remotePlayer.isPaused) { + castPlayer.playerHandler.pause(); } - else if (this.playerState !== PLAYER_STATE.PLAYING) { + else if (castPlayer.playerState !== PLAYER_STATE.PLAYING) { // If currently not playing, start to play. // This occurs if starting to play from local, but this check is // required if the state is changed remotely. - this.playerHandler.play(); + castPlayer.playerHandler.play(); } - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED, function () { - if (this.remotePlayer.isMuted) { - this.playerHandler.mute(); + }.bind(castPlayer)); + castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED, function () { + if (castPlayer.remotePlayer.isMuted) { + castPlayer.playerHandler.mute(); } else { - this.playerHandler.unMute(); + castPlayer.playerHandler.unMute(); } - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED, function () { - var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; + }.bind(castPlayer)); + castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED, function () { + var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; var p = document.getElementById('audio_bg_level'); p.style.height = newVolume + 'px'; p.style.marginTop = -newVolume + 'px'; - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED, function (event) { - this.isPlayingBreak(event.value); - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED, function (event) { - this.onWhenSkippableChanged(event.value); - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED, function (event) { - this.onCurrentBreakClipTimeChanged(event.value); - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED, function (event) { - this.onBreakClipIdChanged(event.value); - }.bind(this)); - this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED, function (event) { + }.bind(castPlayer)); + castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED, function (event) { + castPlayer.isPlayingBreak(event.value); + }.bind(castPlayer)); + castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED, function (event) { + castPlayer.onWhenSkippableChanged(event.value); + }.bind(castPlayer)); + castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED, function (event) { + castPlayer.onCurrentBreakClipTimeChanged(event.value); + }.bind(castPlayer)); + castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED, function (event) { + castPlayer.onBreakClipIdChanged(event.value); + }.bind(castPlayer)); + castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED, function (event) { console.log('LIVE_SEEKABLE_RANGE_CHANGED'); - this.liveSeekableRange = event.value; - }.bind(this)); + castPlayer.liveSeekableRange = event.value; + }.bind(castPlayer)); // This object will implement PlayerHandler callbacks with // remotePlayerController, and makes necessary UI updates specific // to remote playback. var playerTarget = {}; playerTarget.play = function () { - if (this.remotePlayer.isPaused) { - this.remotePlayerController.playOrPause(); + if (castPlayer.remotePlayer.isPaused) { + castPlayer.remotePlayerController.playOrPause(); } var vi = document.getElementById('video_image'); vi.style.display = ''; var localPlayer = document.getElementById('video_element'); localPlayer.style.display = 'none'; - }.bind(this); + }.bind(castPlayer); playerTarget.pause = function () { - if (!this.remotePlayer.isPaused) { - this.remotePlayerController.playOrPause(); + if (!castPlayer.remotePlayer.isPaused) { + castPlayer.remotePlayerController.playOrPause(); } - }.bind(this); + }.bind(castPlayer); playerTarget.stop = function () { - this.remotePlayerController.stop(); - }.bind(this); + castPlayer.remotePlayerController.stop(); + }.bind(castPlayer); // Load request for local -> remote playerTarget.load = function (mediaIndex) { console.log('Loading...' + this.mediaContents[mediaIndex]['title']); var mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4'); - mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED; - mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata(); + mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata(); + mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC; mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title']; - mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle']; - mediaInfo.metadata.images = [{ - 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'] - }]; + mediaInfo.metadata.images = [ + { 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'] } + ]; var request = new chrome.cast.media.LoadRequest(mediaInfo); - request.currentTime = this.currentMediaTime; - if (ENABLE_ADS) { - // Add sample breaks and breakClips. - mediaInfo.breakClips = breakClipsJSON; - mediaInfo.breaks = breaksJSON; - } - else if (ENABLE_LIVE) { - // Change the streamType and add live specific metadata. - mediaInfo.streamType = chrome.cast.media.StreamType.LIVE; - // TODO: Set the metadata on the receiver side in your implementation. - // startAbsoluteTime and sectionStartTimeInMedia will be set for you. - // See https://developers.google.com/cast/docs/caf_receiver/live. - // TODO: Start time, is a fake timestamp. Use correct values for your implementation. - var currentTime = new Date(); - // Convert from milliseconds to seconds. - currentTime = currentTime / 1000; - var sectionStartAbsoluteTime = currentTime; - // Duration should be -1 for live streams. - mediaInfo.duration = -1; - // TODO: Set on the receiver for your implementation. - mediaInfo.startAbsoluteTime = currentTime; - mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime; - // TODO: Set on the receiver for your implementation. - mediaInfo.metadata.sectionStartTimeInMedia = 0; - mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration']; - var item = new chrome.cast.media.QueueItem(mediaInfo); - request.queueData = new chrome.cast.media.QueueData(); - request.queueData.items = [item]; - request.queueData.name = "Sample Queue for Live"; - } - // Do not immediately start playing if the player was previously PAUSED. - if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) { - request.autoplay = false; - } - else { - request.autoplay = true; - } - cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(function () { - console.log('Remote media loaded'); - }.bind(this), function (errorCode) { - this.playerState = PLAYER_STATE.IDLE; + castSession.loadMedia(request).then(this.playerHandler.loaded.bind(this.playerHandler), function (errorCode) { + this.playerState = PLAYER_STATE.ERROR; console.log('Remote media load error: ' + CastPlayer.getErrorMessage(errorCode)); - this.playerHandler.updateDisplay(); - }.bind(this)); - }.bind(this); + }.bind(castPlayer)); + }.bind(castPlayer); playerTarget.isMediaLoaded = function (mediaIndex) { var session = cast.framework.CastContext.getInstance().getCurrentSession(); if (!session) @@ -931,39 +887,39 @@ } // No need to verify local mediaIndex content. return true; - }.bind(this); + }.bind(castPlayer); /** * @return {number?} Current media time for the content. Always returns * media time even if in clock time (conversion done when displaying). */ playerTarget.getCurrentMediaTime = function () { - if (this.isLiveContent && this.mediaInfo.metadata && - this.mediaInfo.metadata.sectionStartTimeInMedia) { - return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia; + if (castPlayer.isLiveContent && castPlayer.mediaInfo.metadata && + castPlayer.mediaInfo.metadata.sectionStartTimeInMedia) { + return castPlayer.remotePlayer.currentTime - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; } else { // VOD and live scenerios where live metadata is not provided. - return this.remotePlayer.currentTime; + return castPlayer.remotePlayer.currentTime; } - }.bind(this); + }.bind(castPlayer); /** * @return {number?} media time duration for the content. Always returns * media time even if in clock time (conversion done when displaying). */ playerTarget.getMediaDuration = function () { - if (this.isLiveContent) { + if (castPlayer.isLiveContent) { // Scenerios when live metadata is not provided. - if (this.mediaInfo.metadata == undefined || - this.mediaInfo.metadata.sectionDuration == undefined || - this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) { + if (castPlayer.mediaInfo.metadata == undefined || + castPlayer.mediaInfo.metadata.sectionDuration == undefined || + castPlayer.mediaInfo.metadata.sectionStartTimeInMedia == undefined) { return null; } - return this.mediaInfo.metadata.sectionDuration; + return castPlayer.mediaInfo.metadata.sectionDuration; } else { - return this.remotePlayer.duration; + return castPlayer.remotePlayer.duration; } - }.bind(this); + }.bind(castPlayer); playerTarget.updateDisplay = function () { var castSession = cast.framework.CastContext.getInstance().getCurrentSession(); if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) { @@ -1009,12 +965,12 @@ } // live information if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) { - this.liveSeekableRange = media.liveSeekableRange; + castPlayer.liveSeekableRange = media.liveSeekableRange; var live_indicator = document.getElementById('live_indicator'); live_indicator.style.display = 'block'; // Display indicator if current time is close to the end of // the seekable range. - if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) { + if (castPlayer.liveSeekableRange && (Math.abs(media.getEstimatedTime() - castPlayer.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) { live_indicator.src = "imagefiles/live_indicator_active.png"; } else { @@ -1034,24 +990,21 @@ document.getElementById('media_title').innerHTML = ""; document.getElementById('media_subtitle').innerHTML = ""; } - }.bind(this); + }.bind(castPlayer); playerTarget.updateCurrentTimeDisplay = function () { - this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime()); - }.bind(this); - playerTarget.updateDurationDisplay = function () { - this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration()); - }.bind(this); + castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), castPlayer.playerHandler.getCurrentMediaTime()); + }.bind(castPlayer); playerTarget.setTimeString = function (element, time) { - var currentTimeString = this.getMediaTimeString(time); - if (this.isLiveContent) { + var currentTimeString = castPlayer.getMediaTimeString(time); + if (castPlayer.isLiveContent) { if (currentTimeString == null) { element.style.display = 'none'; return; } // clock time - if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) { + if (castPlayer.mediaInfo.metadata && castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) { element.style.display = 'flex'; - element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime); + element.innerHTML = castPlayer.getClockTimeString(time + castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime); } else { // media time @@ -1068,9 +1021,9 @@ element.style.display = 'none'; } } - }.bind(this); + }.bind(castPlayer); playerTarget.setVolume = function (volumeSliderPosition) { - var currentVolume = this.remotePlayer.volumeLevel; + var currentVolume = castPlayer.remotePlayer.volumeLevel; var p = document.getElementById('audio_bg_level'); if (volumeSliderPosition < FULL_VOLUME_HEIGHT) { p.style.height = volumeSliderPosition + 'px'; @@ -1080,53 +1033,53 @@ else { currentVolume = 1; } - this.remotePlayer.volumeLevel = currentVolume; - this.remotePlayerController.setVolumeLevel(); - }.bind(this); + castPlayer.remotePlayer.volumeLevel = currentVolume; + castPlayer.remotePlayerController.setVolumeLevel(); + }.bind(castPlayer); playerTarget.mute = function () { - if (!this.remotePlayer.isMuted) { - this.remotePlayerController.muteOrUnmute(); + if (!castPlayer.remotePlayer.isMuted) { + castPlayer.remotePlayerController.muteOrUnmute(); } - }.bind(this); + }.bind(castPlayer); playerTarget.unMute = function () { - if (this.remotePlayer.isMuted) { - this.remotePlayerController.muteOrUnmute(); + if (castPlayer.remotePlayer.isMuted) { + castPlayer.remotePlayerController.muteOrUnmute(); } - }.bind(this); + }.bind(castPlayer); playerTarget.isMuted = function () { - return this.remotePlayer.isMuted; - }.bind(this); + return castPlayer.remotePlayer.isMuted; + }.bind(castPlayer); playerTarget.seekTo = function (time) { - this.remotePlayer.currentTime = time; - this.remotePlayerController.seek(); - }.bind(this); - this.playerHandler.setTarget(playerTarget); + castPlayer.remotePlayer.currentTime = time; + castPlayer.remotePlayerController.seek(); + }.bind(castPlayer); + castPlayer.playerHandler.setTarget(playerTarget); // Setup remote player properties on setup - if (this.remotePlayer.isMuted) { - this.playerHandler.mute(); + if (castPlayer.remotePlayer.isMuted) { + castPlayer.playerHandler.mute(); } - this.enableProgressBar(this.remotePlayer.canSeek); + castPlayer.enableProgressBar(castPlayer.remotePlayer.canSeek); // The remote player may have had a volume set from previous playback - var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; + var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; var p = document.getElementById('audio_bg_level'); p.style.height = currentVolume + 'px'; p.style.marginTop = -currentVolume + 'px'; // Show media_control document.getElementById('media_control').style.opacity = 0.7; - this.hideFullscreenButton(); + castPlayer.hideFullscreenButton(); // If resuming a session, take the remote properties and continue the existing // playback. Otherwise, load local content. if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() == cast.framework.SessionState.SESSION_RESUMED) { console.log('Resuming session'); - this.playerHandler.prepareToPlay(); + castPlayer.playerHandler.prepareToPlay(); // New media has been loaded so the previous ad markers should // be removed. - this.removeAdMarkers(); - this.updateAdMarkers(); + castPlayer.removeAdMarkers(); + castPlayer.updateAdMarkers(); } else { - this.playerHandler.load(); + castPlayer.playerHandler.load(); } }; /** @@ -1134,8 +1087,8 @@ */ CastPlayer.prototype.onMediaLoadedLocally = function () { var localPlayer = document.getElementById('video_element'); - localPlayer.currentTime = this.currentMediaTime; - this.playerHandler.prepareToPlay(); + localPlayer.currentTime = castPlayer.currentMediaTime; + castPlayer.playerHandler.prepareToPlay(); }; /** * Select a media content @@ -1143,12 +1096,12 @@ */ CastPlayer.prototype.selectMedia = function (mediaIndex) { console.log('Media index selected: ' + mediaIndex); - this.currentMediaIndex = mediaIndex; + castPlayer.currentMediaIndex = mediaIndex; // Clear currentMediaInfo when playing content from the sender. - this.playerHandler.currentMediaInfo = undefined; + castPlayer.playerHandler.currentMediaInfo = undefined; // Set video image var vi = document.getElementById('video_image'); - vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']; + vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']; // Reset progress bar var pi = document.getElementById('progress_indicator'); pi.style.marginLeft = '0px'; @@ -1159,23 +1112,23 @@ seekable_window.style.width = PROGRESS_BAR_WIDTH; unseekable_overlay.style.width = '0px'; // Stop timer and reset time displays - this.stopProgressTimer(); - this.currentMediaTime = 0; - this.playerHandler.setTimeString(document.getElementById('currentTime'), 0); - this.playerHandler.setTimeString(document.getElementById('duration'), 0); - this.playerState = PLAYER_STATE.IDLE; - this.playerHandler.play(); + castPlayer.stopProgressTimer(); + castPlayer.currentMediaTime = 0; + castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0); + castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0); + castPlayer.playerState = PLAYER_STATE.IDLE; + castPlayer.playerHandler.play(); }; /** * Media seek function * @param {Event} event An event object from seek */ CastPlayer.prototype.seekMedia = function (event) { - if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) { + if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) { console.log('Error - Not seekable'); return; } - if (this.isLiveContent && !this.liveSeekableRange) { + if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) { console.log('Live content has no seekable range.'); return; } @@ -1186,26 +1139,26 @@ var pp = 0; var pw = 0; if (event.currentTarget.id == 'progress_indicator') { - seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position / + seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position / PROGRESS_BAR_WIDTH, 10); pp = parseInt(pi.style.marginLeft, 10) + position; pw = parseInt(progress.style.width, 10) + position; } else { - seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10); + seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10); pp = position; pw = position; } - if (this.playerState === PLAYER_STATE.PLAYING || - this.playerState === PLAYER_STATE.PAUSED) { - this.currentMediaTime = seekTime; + if (castPlayer.playerState === PLAYER_STATE.PLAYING || + castPlayer.playerState === PLAYER_STATE.PAUSED) { + castPlayer.currentMediaTime = seekTime; progress.style.width = pw + 'px'; pi.style.marginLeft = pp + 'px'; } - if (this.isLiveContent) { - seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia; + if (castPlayer.isLiveContent) { + seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; } - this.playerHandler.seekTo(seekTime); + castPlayer.playerHandler.seekTo(seekTime); }; /** * Set current player volume @@ -1220,23 +1173,23 @@ else { pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10); } - this.playerHandler.setVolume(pos); + castPlayer.playerHandler.setVolume(pos); }; /** * Starts the timer to increment the media progress bar */ CastPlayer.prototype.startProgressTimer = function () { - this.stopProgressTimer(); + castPlayer.stopProgressTimer(); // Start progress timer - this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP); + castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP); }; /** * Stops the timer to increment the media progress bar */ CastPlayer.prototype.stopProgressTimer = function () { - if (this.timer) { - clearInterval(this.timer); - this.timer = null; + if (castPlayer.timer) { + clearInterval(castPlayer.timer); + castPlayer.timer = null; } }; /** @@ -1244,15 +1197,15 @@ */ CastPlayer.prototype.incrementMediaTime = function () { // First sync with the current player's time - this.currentMediaTime = this.playerHandler.getCurrentMediaTime(); - this.mediaDuration = this.playerHandler.getMediaDuration(); - this.playerHandler.updateDurationDisplay(); - if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) { - this.playerHandler.updateCurrentTimeDisplay(); - this.updateProgressBarByTimer(); + castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime(); + castPlayer.mediaDuration = castPlayer.playerHandler.getMediaDuration(); + castPlayer.playerHandler.updateDurationDisplay(); + if (castPlayer.mediaDuration == null || castPlayer.currentMediaTime < castPlayer.mediaDuration || castPlayer.isLiveContent) { + castPlayer.playerHandler.updateCurrentTimeDisplay(); + castPlayer.updateProgressBarByTimer(); } - else if (this.mediaDuration > 0) { - this.endPlayback(); + else if (castPlayer.mediaDuration > 0) { + castPlayer.endPlayback(); } }; /** @@ -1262,8 +1215,8 @@ var progressBar = document.getElementById('progress'); var pi = document.getElementById('progress_indicator'); // Live situation where the progress and duration is unknown. - if (this.mediaDuration == null) { - if (!this.isLiveContent) { + if (castPlayer.mediaDuration == null) { + if (!castPlayer.isLiveContent) { console.log('Error - Duration is not defined for a VOD stream.'); } progressBar.style.width = '0px'; @@ -1288,7 +1241,7 @@ } // Prevent indicator from exceeding the max width. Happens during // short media when each progress step is large - var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration); + var pp = Math.floor(PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.mediaDuration); if (pp > PROGRESS_BAR_WIDTH) { pp = PROGRESS_BAR_WIDTH; } @@ -1299,12 +1252,12 @@ pi.style.marginLeft = pp + 'px'; var seekable_window = document.getElementById('seekable_window'); var unseekable_overlay = document.getElementById('unseekable_overlay'); - if (this.isLiveContent) { - if (this.liveSeekableRange) { + if (castPlayer.isLiveContent) { + if (castPlayer.liveSeekableRange) { // Use the liveSeekableRange to draw the seekable and unseekable windows - var seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) - - this.mediaInfo.metadata.sectionStartTimeInMedia; - var seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration); + var seekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.end) - + castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; + var seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / castPlayer.mediaDuration); if (seekableWidth > PROGRESS_BAR_WIDTH) { seekableWidth = PROGRESS_BAR_WIDTH; } @@ -1312,9 +1265,9 @@ seekableWidth = 0; } seekable_window.style.width = seekableWidth + 'px'; - var unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) - - this.mediaInfo.metadata.sectionStartTimeInMedia; - var unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration); + var unseekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.start) - + castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; + var unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / castPlayer.mediaDuration); if (unseekableWidth > PROGRESS_BAR_WIDTH) { unseekableWidth = PROGRESS_BAR_WIDTH; } @@ -1334,18 +1287,18 @@ seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px'; unseekable_overlay.style.width = '0px'; } - if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) { - this.endPlayback(); + if (pp >= PROGRESS_BAR_WIDTH && !castPlayer.isLiveContent) { + castPlayer.endPlayback(); } }; /** * End playback. Called when media ends. */ CastPlayer.prototype.endPlayback = function () { - this.currentMediaTime = 0; - this.stopProgressTimer(); - this.playerState = PLAYER_STATE.IDLE; - this.playerHandler.updateDisplay(); + castPlayer.currentMediaTime = 0; + castPlayer.stopProgressTimer(); + castPlayer.playerState = PLAYER_STATE.IDLE; + castPlayer.playerHandler.updateDisplay(); var play = document.getElementById('play'); if (play && play.style && play.display) play.style.display = 'block'; @@ -1427,7 +1380,7 @@ var div = document.getElementById('progress'); div.innerHTML += '
'; + castPlayer.adPositionToMargin(adBreak.position, contentDuration) + 'px">'; } } }; @@ -1468,13 +1421,13 @@ * Disable progress bar if playing a break. */ CastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) { - this.enableProgressBar(!isPlayingBreak); + castPlayer.enableProgressBar(!isPlayingBreak); }; /** * Handle WHEN_SKIPPABLE_CHANGED event */ CastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) { - this.whenSkippable = whenSkippable; + castPlayer.whenSkippable = whenSkippable; }; /** * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event @@ -1482,13 +1435,13 @@ CastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) { var skip = document.getElementById('skip'); // Unskippable - if (this.whenSkippable == undefined || this.whenSkippable < 0) { + if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) { // Hide skip button if (skip && skip.style && skip.style.display) skip.style.display = 'none'; } // Skippable - else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) { + else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) { // Show skip button if (skip && skip.style && skip.style.display) skip.style.display = 'block'; @@ -1504,7 +1457,7 @@ * Skip the current Ad */ CastPlayer.prototype.skipAd = function () { - this.remotePlayerController.skipAd(); + castPlayer.remotePlayerController.skipAd(); }; /** * Enable/disable progress bar @@ -1521,9 +1474,9 @@ progress_indicator.style.cursor = "pointer"; progress_indicator.draggable = true; // Add listeners - progress.addEventListener('click', this.seekMediaListener); - seekable_window.addEventListener('click', this.seekMediaListener); - progress_indicator.addEventListener('dragend', this.seekMediaListener); + progress.addEventListener('click', castPlayer.seekMediaListener); + seekable_window.addEventListener('click', castPlayer.seekMediaListener); + progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener); } else { // Disable UI @@ -1533,9 +1486,9 @@ progress_indicator.style.cursor = "default"; progress_indicator.draggable = false; // Remove listeners - progress.removeEventListener('click', this.seekMediaListener); - seekable_window.removeEventListener('click', this.seekMediaListener); - progress_indicator.removeEventListener('dragend', this.seekMediaListener); + progress.removeEventListener('click', castPlayer.seekMediaListener); + seekable_window.removeEventListener('click', castPlayer.seekMediaListener); + progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener); } }; /** @@ -1565,7 +1518,7 @@ * Exit fullscreen mode by escape */ CastPlayer.prototype.fullscreenChangeHandler = function () { - this.fullscreen = !this.fullscreen; + castPlayer.fullscreen = !castPlayer.fullscreen; }; /** * Show expand/collapse fullscreen button @@ -1573,7 +1526,7 @@ CastPlayer.prototype.showFullscreenButton = function () { var fullscreen_expand = document.getElementById('fullscreen_expand'); var fullscreen_collapse = document.getElementById('fullscreen_collapse'); - if (this.fullscreen) { + if (castPlayer.fullscreen) { if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) fullscreen_expand.style.display = 'none'; if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display) @@ -1624,7 +1577,7 @@ * Show the volume slider */ CastPlayer.prototype.showVolumeSlider = function () { - if (!this.playerHandler.isMuted()) { + if (!castPlayer.playerHandler.isMuted()) { document.getElementById('audio_bg').style.opacity = 1; document.getElementById('audio_bg_track').style.opacity = 1; document.getElementById('audio_bg_level').style.opacity = 1; @@ -1657,63 +1610,67 @@ CastPlayer.prototype.initializeUI = function () { // Set initial values for title, subtitle, and description document.getElementById('media_title').innerHTML = - this.mediaContents[0]['title']; + castPlayer.mediaContents[0]['title']; document.getElementById('media_subtitle').innerHTML = - this.mediaContents[this.currentMediaIndex]['subtitle']; + castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle']; document.getElementById('media_desc').innerHTML = - this.mediaContents[this.currentMediaIndex]['description']; + castPlayer.mediaContents[castPlayer.currentMediaIndex]['description']; // Add event handlers to UI components - document.getElementById('progress_bg').addEventListener('click', this.seekMedia.bind(this)); - document.getElementById('progress').addEventListener('click', this.seekMedia.bind(this)); - document.getElementById('progress_indicator').addEventListener('dragend', this.seekMedia.bind(this)); - document.getElementById('audio_on').addEventListener('click', this.playerHandler.mute.bind(this.playerHandler)); - document.getElementById('audio_off').addEventListener('click', this.playerHandler.unMute.bind(this.playerHandler)); - document.getElementById('audio_bg').addEventListener('mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_on').addEventListener('mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_level').addEventListener('mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_track').addEventListener('mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_level').addEventListener('click', this.setVolume.bind(this)); - document.getElementById('audio_bg_track').addEventListener('click', this.setVolume.bind(this)); - document.getElementById('audio_bg').addEventListener('mouseout', this.hideVolumeSlider.bind(this)); - document.getElementById('audio_on').addEventListener('mouseout', this.hideVolumeSlider.bind(this)); - document.getElementById('main_video').addEventListener('mouseover', this.showMediaControl.bind(this)); - document.getElementById('main_video').addEventListener('mouseout', this.hideMediaControl.bind(this)); - document.getElementById('media_control').addEventListener('mouseover', this.showMediaControl.bind(this)); - document.getElementById('media_control').addEventListener('mouseout', this.hideMediaControl.bind(this)); - document.getElementById('fullscreen_expand').addEventListener('click', this.requestFullScreen.bind(this)); - document.getElementById('fullscreen_collapse').addEventListener('click', this.cancelFullScreen.bind(this)); - document.addEventListener('fullscreenchange', this.fullscreenChangeHandler.bind(this), false); - document.addEventListener('webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false); + document.getElementById('progress_bg').addEventListener('click', castPlayer.seekMedia.bind(castPlayer)); + document.getElementById('progress').addEventListener('click', castPlayer.seekMedia.bind(castPlayer)); + document.getElementById('progress_indicator').addEventListener('dragend', castPlayer.seekMedia.bind(castPlayer)); + document.getElementById('audio_on').addEventListener('click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler)); + document.getElementById('audio_off').addEventListener('click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler)); + document.getElementById('audio_bg').addEventListener('mouseover', castPlayer.showVolumeSlider.bind(castPlayer)); + document.getElementById('audio_on').addEventListener('mouseover', castPlayer.showVolumeSlider.bind(castPlayer)); + document.getElementById('audio_bg_level').addEventListener('mouseover', castPlayer.showVolumeSlider.bind(castPlayer)); + document.getElementById('audio_bg_track').addEventListener('mouseover', castPlayer.showVolumeSlider.bind(castPlayer)); + document.getElementById('audio_bg_level').addEventListener('click', castPlayer.setVolume.bind(castPlayer)); + document.getElementById('audio_bg_track').addEventListener('click', castPlayer.setVolume.bind(castPlayer)); + document.getElementById('audio_bg').addEventListener('mouseout', castPlayer.hideVolumeSlider.bind(castPlayer)); + document.getElementById('audio_on').addEventListener('mouseout', castPlayer.hideVolumeSlider.bind(castPlayer)); + document.getElementById('main_video').addEventListener('mouseover', castPlayer.showMediaControl.bind(castPlayer)); + document.getElementById('main_video').addEventListener('mouseout', castPlayer.hideMediaControl.bind(castPlayer)); + document.getElementById('media_control').addEventListener('mouseover', castPlayer.showMediaControl.bind(castPlayer)); + document.getElementById('media_control').addEventListener('mouseout', castPlayer.hideMediaControl.bind(castPlayer)); + document.getElementById('fullscreen_expand').addEventListener('click', castPlayer.requestFullScreen.bind(castPlayer)); + document.getElementById('fullscreen_collapse').addEventListener('click', castPlayer.cancelFullScreen.bind(castPlayer)); + document.addEventListener('fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false); + document.addEventListener('webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false); // Enable play/pause buttons - document.getElementById('play').addEventListener('click', this.playerHandler.play.bind(this.playerHandler)); - document.getElementById('pause').addEventListener('click', this.playerHandler.pause.bind(this.playerHandler)); + document.getElementById('play').addEventListener('click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler)); + document.getElementById('pause').addEventListener('click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler)); document.getElementById('progress_indicator').draggable = true; }; /** * Add video thumbnails div's to UI for media JSON contents */ CastPlayer.prototype.addVideoThumbs = function () { - if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) { - this.mediaContents = this.mediaJSON['categories'][0]['videos']; + if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) { + castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos']; var ni = document.getElementById('carousel'); var newdiv = null; var divIdName = null; - for (var i = 0; i < this.mediaContents.length; i++) { + for (var i = 0; i < castPlayer.mediaContents.length; i++) { newdiv = document.createElement('div'); divIdName = 'thumb' + i + 'Div'; newdiv.setAttribute('id', divIdName); newdiv.setAttribute('class', 'thumb'); newdiv.innerHTML = - ''; - newdiv.addEventListener('click', this.selectMedia.bind(this, i)); + newdiv.addEventListener('click', castPlayer.selectMedia.bind(this, i)); ni.appendChild(newdiv); } } }; CastPlayer.prototype.addMediaContents = function () { - if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) { - this.mediaContents = this.mediaJSON['categories'][0]['videos']; + if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) { + castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos']; + return castPlayer.mediaContents; + } + else { + return null; } }; /** diff --git a/dist/bundles/thinkam.net-ng-cast.umd.js.map b/dist/bundles/thinkam.net-ng-cast.umd.js.map index e2f8ac2..12fb099 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.js.map +++ b/dist/bundles/thinkam.net-ng-cast.umd.js.map @@ -1 +1 @@ -{"version":3,"file":"thinkam.net-ng-cast.umd.js","sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../CastVideos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n globalThis.CastPlayer.addMediaContents();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeUI();\n };\n\n play = () => { \n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n globalThis.CastPlayer.addMediaContents();\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = function () {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n this.remotePlayer = new cast.framework.RemotePlayer();\n this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer);\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n function (e) {\n this.switchPlayer(e.value);\n }.bind(this)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = function () {\n this.playerStateBeforeSwitch = this.playerState;\n\n this.stopProgressTimer();\n this.resetVolumeSlider();\n\n // Session is active\n if (cast && cast.framework && this.remotePlayer.isConnected) {\n // Pause local playback\n this.playerHandler.pause();\n this.setupRemotePlayer();\n } else {\n this.setupLocalPlayer();\n }\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n this.updateDurationDisplay = function () {\n this.target.updateDurationDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', this.onMediaLoadedLocally.bind(this));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function() {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function(mediaIndex) {\n localPlayer.src =\n this.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(this);\n\n playerTarget.getCurrentMediaTime = function() {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function() {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function(volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function() {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function() {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function() {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function(time) {\n localPlayer.currentTime = time;\n };\n\n this.playerHandler.setTarget(playerTarget);\n\n this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n this.showFullscreenButton();\n\n if (this.currentMediaTime > 0) {\n this.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n this.mediaInfo = media.media;\n\n if (this.mediaInfo) {\n this.isLiveContent = (this.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n this.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) {\n this.playerHandler.prepareToPlay();\n }\n\n this.removeAdMarkers();\n this.updateAdMarkers();\n\n this.playerHandler.updateDisplay();\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n this.enableProgressBar(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (this.remotePlayer.isPaused) {\n this.playerHandler.pause();\n } else if (this.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n this.playerHandler.play();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n } else {\n this.playerHandler.unMute();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n this.isPlayingBreak(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n this.onWhenSkippableChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n this.onCurrentBreakClipTimeChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n this.onBreakClipIdChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n this.liveSeekableRange = event.value;\n }.bind(this)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(this);\n\n playerTarget.pause = function () {\n if (!this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n }.bind(this);\n\n playerTarget.stop = function () {\n this.remotePlayerController.stop();\n }.bind(this);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n\n let mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;\n mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata();\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle'];\n mediaInfo.metadata.images = [{\n 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']\n }];\n\n let request = new chrome.cast.media.LoadRequest(mediaInfo);\n request.currentTime = this.currentMediaTime;\n\n if (ENABLE_ADS) {\n // Add sample breaks and breakClips.\n mediaInfo.breakClips = breakClipsJSON;\n mediaInfo.breaks = breaksJSON;\n } else if (ENABLE_LIVE) {\n // Change the streamType and add live specific metadata.\n mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;\n // TODO: Set the metadata on the receiver side in your implementation.\n // startAbsoluteTime and sectionStartTimeInMedia will be set for you.\n // See https://developers.google.com/cast/docs/caf_receiver/live.\n\n // TODO: Start time, is a fake timestamp. Use correct values for your implementation.\n let currentTime = new Date();\n // Convert from milliseconds to seconds.\n currentTime = currentTime / 1000;\n let sectionStartAbsoluteTime = currentTime;\n\n // Duration should be -1 for live streams.\n mediaInfo.duration = -1;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.startAbsoluteTime = currentTime;\n mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.metadata.sectionStartTimeInMedia = 0;\n mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration'];\n\n let item = new chrome.cast.media.QueueItem(mediaInfo);\n request.queueData = new chrome.cast.media.QueueData();\n request.queueData.items = [item];\n request.queueData.name = \"Sample Queue for Live\";\n }\n\n // Do not immediately start playing if the player was previously PAUSED.\n if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) {\n request.autoplay = false;\n } else {\n request.autoplay = true;\n }\n\n cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(\n function () {\n console.log('Remote media loaded');\n }.bind(this),\n function (errorCode) {\n this.playerState = PLAYER_STATE.IDLE;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n this.playerHandler.updateDisplay();\n }.bind(this));\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(this);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (this.isLiveContent && this.mediaInfo.metadata &&\n this.mediaInfo.metadata.sectionStartTimeInMedia) {\n return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return this.remotePlayer.currentTime;\n }\n }.bind(this);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (this.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (this.mediaInfo.metadata == undefined ||\n this.mediaInfo.metadata.sectionDuration == undefined ||\n this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return this.mediaInfo.metadata.sectionDuration;\n } else {\n return this.remotePlayer.duration;\n }\n }.bind(this);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n this.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(this);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime());\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration());\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n\n if (this.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = this.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n this.remotePlayer.volumeLevel = currentVolume;\n this.remotePlayerController.setVolumeLevel();\n }.bind(this);\n\n playerTarget.mute = function () {\n if (!this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.unMute = function () {\n if (this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.isMuted = function () {\n return this.remotePlayer.isMuted;\n }.bind(this);\n\n playerTarget.seekTo = function (time) {\n this.remotePlayer.currentTime = time;\n this.remotePlayerController.seek();\n }.bind(this);\n\n this.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n }\n this.enableProgressBar(this.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n this.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n this.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n this.removeAdMarkers();\n this.updateAdMarkers();\n } else {\n this.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = this.currentMediaTime;\n\n this.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n this.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n this.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n this.stopProgressTimer();\n this.currentMediaTime = 0;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n this.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (this.isLiveContent && !this.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (this.playerState === PLAYER_STATE.PLAYING ||\n this.playerState === PLAYER_STATE.PAUSED) {\n this.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (this.isLiveContent) {\n seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n this.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n this.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n this.stopProgressTimer();\n\n // Start progress timer\n this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n this.currentMediaTime = this.playerHandler.getCurrentMediaTime();\n this.mediaDuration = this.playerHandler.getMediaDuration();\n\n this.playerHandler.updateDurationDisplay();\n\n if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) {\n this.playerHandler.updateCurrentTimeDisplay();\n this.updateProgressBarByTimer();\n } else if (this.mediaDuration > 0) {\n this.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (this.mediaDuration == null) {\n if (!this.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n \n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n \n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (this.isLiveContent) {\n if (this.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) {\n this.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n this.currentMediaTime = 0;\n this.stopProgressTimer();\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n this.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n this.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (this.whenSkippable == undefined || this.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n this.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', this.seekMediaListener);\n seekable_window.addEventListener('click', this.seekMediaListener);\n progress_indicator.addEventListener('dragend', this.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', this.seekMediaListener);\n seekable_window.removeEventListener('click', this.seekMediaListener);\n progress_indicator.removeEventListener('dragend', this.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n this.fullscreen = !this.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (this.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block'; \n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!this.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = function () {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n this.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n this.mediaContents[this.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n this.mediaContents[this.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', this.seekMedia.bind(this));\n document.getElementById('progress').addEventListener(\n 'click', this.seekMedia.bind(this));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', this.seekMedia.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'click', this.playerHandler.mute.bind(this.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', this.playerHandler.unMute.bind(this.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('main_video').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('main_video').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', this.requestFullScreen.bind(this));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', this.cancelFullScreen.bind(this));\n document.addEventListener(\n 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n document.addEventListener(\n 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', this.playerHandler.play.bind(this.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', this.playerHandler.pause.bind(this.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) {\n this.mediaContents = this.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < this.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', this.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = function () {\n if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) {\n this.mediaContents = this.mediaJSON['categories'][0]['videos']; \n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["NgCastComponent","tslib_1.__decorate","Input","Component","NgCastService","Subject","Injectable","NgCastModule","NgModule","CUSTOM_ELEMENTS_SCHEMA","CommonModule"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"thinkam.net-ng-cast.umd.js","sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n castPlayer.mediaInfo = null;\n castPlayer.isLiveContent = false;\n castPlayer.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n castPlayer.mediaInfo = null;\n castPlayer.isLiveContent = false;\n castPlayer.playerHandler.updateDisplay();\n return;\n }\n\n castPlayer.mediaInfo = media.media;\n\n if (castPlayer.mediaInfo) {\n castPlayer.isLiveContent = (castPlayer.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n castPlayer.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && castPlayer.playerState !== PLAYER_STATE.PLAYING) {\n castPlayer.playerHandler.prepareToPlay();\n }\n\n castPlayer.removeAdMarkers();\n castPlayer.updateAdMarkers();\n\n castPlayer.playerHandler.updateDisplay();\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n castPlayer.enableProgressBar(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else if (castPlayer.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n castPlayer.isPlayingBreak(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n castPlayer.onWhenSkippableChanged(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n castPlayer.onCurrentBreakClipTimeChanged(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n castPlayer.onBreakClipIdChanged(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n castPlayer.liveSeekableRange = event.value;\n }.bind(castPlayer)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n this.playerHandler.loaded.bind(this.playerHandler),\n function (errorCode) {\n this.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(castPlayer);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (castPlayer.isLiveContent && castPlayer.mediaInfo.metadata &&\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia) {\n return castPlayer.remotePlayer.currentTime - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return castPlayer.remotePlayer.currentTime;\n }\n }.bind(castPlayer);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (castPlayer.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (castPlayer.mediaInfo.metadata == undefined ||\n castPlayer.mediaInfo.metadata.sectionDuration == undefined ||\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return castPlayer.mediaInfo.metadata.sectionDuration;\n } else {\n return castPlayer.remotePlayer.duration;\n }\n }.bind(castPlayer);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n castPlayer.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (castPlayer.liveSeekableRange && (Math.abs(media.getEstimatedTime() - castPlayer.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(castPlayer);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), castPlayer.playerHandler.getCurrentMediaTime());\n }.bind(castPlayer);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = castPlayer.getMediaTimeString(time);\n\n if (castPlayer.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (castPlayer.mediaInfo.metadata && castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = castPlayer.getClockTimeString(time + castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function () {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n castPlayer.enableProgressBar(castPlayer.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n castPlayer.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n castPlayer.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n castPlayer.removeAdMarkers();\n castPlayer.updateAdMarkers();\n } else {\n castPlayer.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.mediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n castPlayer.playerHandler.updateDurationDisplay();\n\n if (castPlayer.mediaDuration == null || castPlayer.currentMediaTime < castPlayer.mediaDuration || castPlayer.isLiveContent) {\n castPlayer.playerHandler.updateCurrentTimeDisplay();\n castPlayer.updateProgressBarByTimer();\n } else if (castPlayer.mediaDuration > 0) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (castPlayer.mediaDuration == null) {\n if (!castPlayer.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n\n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (castPlayer.isLiveContent) {\n if (castPlayer.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.end) -\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / castPlayer.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.start) -\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / castPlayer.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !castPlayer.isLiveContent) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["NgCastComponent","tslib_1.__decorate","Input","Component","NgCastService","Subject","Injectable","NgCastModule","NgModule","CUSTOM_ELEMENTS_SCHEMA","CommonModule"],"mappings":"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"} \ No newline at end of file diff --git a/dist/bundles/thinkam.net-ng-cast.umd.min.js b/dist/bundles/thinkam.net-ng-cast.umd.min.js index 0b2d3ba..3aec2f6 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.min.js +++ b/dist/bundles/thinkam.net-ng-cast.umd.min.js @@ -12,5 +12,5 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */function a(e,t,i,n){var a,s=arguments.length,r=s<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,i,n);else for(var o=e.length-1;o>=0;o--)(a=e[o])&&(r=(s<3?a(r):s>3?a(t,i,r):a(t,i))||r);return s>3&&r&&Object.defineProperty(t,i,r),r}e.ɵa=function(){function e(e){this.ngCastService=e,this.videoImage="",this.imageOffline=!1,this.srcImageOffline=""}return e.prototype.ngOnInit=function(){this.window=window;var e=this.ngCastService;this.window.__onGCastApiAvailable=function(t){t&&e.initializeCastApi()},this.castingStatus=this.ngCastService.getStatus()},e.prototype.openSession=function(){this.ngCastService.discoverDevices()},e.prototype.closeSession=function(){this.ngCastService.discoverDevices()},e}(),a([t.Input()],e.ɵa.prototype,"videoImage",void 0),a([t.Input()],e.ɵa.prototype,"imageOffline",void 0),a([t.Input()],e.ɵa.prototype,"srcImageOffline",void 0),e.ɵa=a([t.Component({selector:"ng-cast",template:'
\n
\x3c!-- Put Your Image Width --\x3e\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\nTV Offline\n',styles:[""]})],e.ɵa),e.NgCastService=function(){function e(){var e=this;this.window=window,this.status={casting:!1},this.onInitSuccess=function(){console.log("GCast initialization success")},this.onError=function(e){console.log("GCast initialization failed",e)},this.discoverDevices=function(){var t=e,i=new n.Subject;return e.cast.requestSession((function(e){t.session=e,t.setCasting(!0),i.next("CONNECTED")}),(function(e){t.setCasting(!1),"cancel"===e.code?(t.session=void 0,i.next("CANCEL")):console.error("Error selecting a cast device",e)})),i},this.onMediaDiscovered=function(e){var t=window.document.createElement("script");t.setAttribute("type","text/javascript"),t.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"),window.document.body.appendChild(t),globalThis.CastPlayer.mediaJSON.categories=e,globalThis.CastPlayer.addMediaContents(),globalThis.CastPlayer.setupLocalPlayer(),globalThis.CastPlayer.initializeUI()},this.play=function(){e.currentMedia.play(null)},this.pause=function(){e.currentMedia.pause(null)},this.stop=function(){e.currentMedia.stop(null)},this.onMediaError=function(e){console.error("Error launching media",e)},globalThis.CastPlayer.mediaJSON={categories:[]}}return e.prototype.initializeCastApi=function(){var e=this;this.cast=this.window.chrome.cast;var t=new this.cast.SessionRequest("4F8B3483"),i=new this.cast.ApiConfig(t,(function(){}),(function(t){e.cast.ReceiverAvailability.AVAILABLE}));this.cast.initialize(i,this.onInitSuccess,this.onError)},e.prototype.setCasting=function(e){globalThis.CastPlayer.addMediaContents(),this.status.casting=e},e.prototype.getStatus=function(){return this.status},e}(),e.NgCastService=a([t.Injectable()],e.NgCastService),e.NgCastModule=function(){},e.NgCastModule=a([t.NgModule({schemas:[t.CUSTOM_ELEMENTS_SCHEMA],imports:[i.CommonModule],exports:[e.ɵa],providers:[e.NgCastService],declarations:[e.ɵa]})],e.NgCastModule);var s=600,r=100,o="IDLE",d="BUFFERING",l="LOADED",u="PLAYING",c="PAUSED",m=function(){this.playerHandler=new y(this),this.playerState=o,this.playerStateBeforeSwitch=null,this.remotePlayer=null,this.remotePlayerController=null,this.currentMediaTime=0,this.mediaDuration=-1,this.timer=null,this.incrementMediaTimeHandler=this.incrementMediaTime.bind(this),this.seekMediaListener=this.seekMedia.bind(this),this.currentMediaIndex=0,this.mediaContents=null,this.fullscreen=!1,this.mediaInfo=null,this.whenSkippable=null,this.liveSeekableRange=null,this.isLiveContent=!1,this.mediaJSON={categories:[]}};m.prototype.initializeCastPlayer=function(){var e={receiverApplicationId:"4F8B3483"};e.autoJoinPolicy=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,cast.framework.CastContext.getInstance().setOptions(e),this.remotePlayer=new cast.framework.RemotePlayer,this.remotePlayerController=new cast.framework.RemotePlayerController(this.remotePlayer),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,function(e){this.switchPlayer(e.value)}.bind(this))},m.prototype.switchPlayer=function(){this.playerStateBeforeSwitch=this.playerState,this.stopProgressTimer(),this.resetVolumeSlider(),cast&&cast.framework&&this.remotePlayer.isConnected?(this.playerHandler.pause(),this.setupRemotePlayer()):this.setupLocalPlayer()};var y=function(e){this.target={},this.setTarget=function(e){this.target=e},this.play=function(){e.playerState!=o&&this.target.isMediaLoaded(e.currentMediaIndex)?(e.playerState=u,this.target.play(),document.getElementById("play").style.display="none",document.getElementById("pause").style.display="block"):this.load(e.currentMediaIndex)},this.pause=function(){this.target.pause(),e.playerState=c,document.getElementById("play").style.display="block",document.getElementById("pause").style.display="none"},this.stop=function(){e.playerState=o,this.target.stop()},this.load=function(t){void 0===t&&(t=null),t||(t=e.currentMediaIndex),e.playerState=d,this.target.load(t)},this.isMediaLoaded=function(e){return this.target.isMediaLoaded(e)},this.prepareToPlay=function(){e.mediaDuration=this.getMediaDuration(),e.playerHandler.updateDurationDisplay(),e.playerState=l,this.play(),e.startProgressTimer(),this.updateDisplay()},this.getCurrentMediaTime=function(){return this.target.getCurrentMediaTime()},this.getMediaDuration=function(){return this.target.getMediaDuration()},this.updateDisplay=function(){this.currentMediaTime=this.target.getCurrentMediaTime(),this.mediaDuration=this.target.getMediaDuration(),this.target.updateDisplay()},this.updateCurrentTimeDisplay=function(){this.target.updateCurrentTimeDisplay()},this.updateDurationDisplay=function(){this.target.updateDurationDisplay()},this.setTimeString=function(e,t){this.target.setTimeString(e,t)},this.setVolume=function(e){this.target.setVolume(e)},this.mute=function(){this.target.mute(),document.getElementById("audio_on").style.display="none",document.getElementById("audio_off").style.display="block"},this.unMute=function(){this.target.unMute(),document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},this.isMuted=function(){return this.target.isMuted()},this.seekTo=function(e){this.target.seekTo(e)}};m.prototype.setupLocalPlayer=function(){var e=document.getElementById("video_element");e.addEventListener("loadeddata",this.onMediaLoadedLocally.bind(this));var t={play:function(){e.play(),document.getElementById("video_image").style.display="none",e.style.display="block"},pause:function(){e.pause()},stop:function(){e.stop()}};t.load=function(t){e.src=this.mediaContents[t].sources[0],e.load()}.bind(this),t.getCurrentMediaTime=function(){return e.currentTime},t.getMediaDuration=function(){return e.duration},t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none"},t.setVolume=function(t){e.volume=t0&&this.playerHandler.play()},m.prototype.setupRemotePlayer=function(){this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,function(e){var t=cast.framework.CastContext.getInstance().getCurrentSession();if(!t)return this.mediaInfo=null,this.isLiveContent=!1,void this.playerHandler.updateDisplay();var i=t.getMediaSession();if(!i)return this.mediaInfo=null,this.isLiveContent=!1,void this.playerHandler.updateDisplay();this.mediaInfo=i.media,this.mediaInfo?this.isLiveContent=this.mediaInfo.streamType==chrome.cast.media.StreamType.LIVE:this.isLiveContent=!1,i.playerState==u&&this.playerState!==u&&this.playerHandler.prepareToPlay(),this.removeAdMarkers(),this.updateAdMarkers(),this.playerHandler.updateDisplay()}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,function(e){this.enableProgressBar(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,function(){this.remotePlayer.isPaused?this.playerHandler.pause():this.playerState!==u&&this.playerHandler.play()}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,function(){this.remotePlayer.isMuted?this.playerHandler.mute():this.playerHandler.unMute()}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,function(){var e=this.remotePlayer.volumeLevel*r,t=document.getElementById("audio_bg_level");t.style.height=e+"px",t.style.marginTop=-e+"px"}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,function(e){this.isPlayingBreak(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,function(e){this.onWhenSkippableChanged(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,function(e){this.onCurrentBreakClipTimeChanged(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,function(e){this.onBreakClipIdChanged(e.value)}.bind(this)),this.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,function(e){console.log("LIVE_SEEKABLE_RANGE_CHANGED"),this.liveSeekableRange=e.value}.bind(this));var e={};e.play=function(){this.remotePlayer.isPaused&&this.remotePlayerController.playOrPause(),document.getElementById("video_image").style.display="",document.getElementById("video_element").style.display="none"}.bind(this),e.pause=function(){this.remotePlayer.isPaused||this.remotePlayerController.playOrPause()}.bind(this),e.stop=function(){this.remotePlayerController.stop()}.bind(this),e.load=function(e){console.log("Loading..."+this.mediaContents[e].title);var t=new chrome.cast.media.MediaInfo(this.mediaContents[e].sources[0],"video/mp4");t.streamType=chrome.cast.media.StreamType.BUFFERED,t.metadata=new chrome.cast.media.TvShowMediaMetadata,t.metadata.title=this.mediaContents[e].title,t.metadata.subtitle=this.mediaContents[e].subtitle,t.metadata.images=[{url:""+this.mediaContents[e].thumb}];var i=new chrome.cast.media.LoadRequest(t);if(i.currentTime=this.currentMediaTime,ENABLE_ADS)t.breakClips=breakClipsJSON,t.breaks=breaksJSON;else if(ENABLE_LIVE){t.streamType=chrome.cast.media.StreamType.LIVE;var n=new Date,a=n/=1e3;t.duration=-1,t.startAbsoluteTime=n,t.metadata.sectionStartAbsoluteTime=a,t.metadata.sectionStartTimeInMedia=0,t.metadata.sectionDuration=this.mediaContents[e].duration;var s=new chrome.cast.media.QueueItem(t);i.queueData=new chrome.cast.media.QueueData,i.queueData.items=[s],i.queueData.name="Sample Queue for Live"}this.playerStateBeforeSwitch&&this.playerStateBeforeSwitch!=c?i.autoplay=!0:i.autoplay=!1,cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(i).then(function(){console.log("Remote media loaded")}.bind(this),function(e){this.playerState=o,console.log("Remote media load error: "+m.getErrorMessage(e)),this.playerHandler.updateDisplay()}.bind(this))}.bind(this),e.isMediaLoaded=function(e){var t=cast.framework.CastContext.getInstance().getCurrentSession();if(!t)return!1;var i=t.getMediaSession();return!!i&&i.playerState!=o}.bind(this),e.getCurrentMediaTime=function(){return this.isLiveContent&&this.mediaInfo.metadata&&this.mediaInfo.metadata.sectionStartTimeInMedia?this.remotePlayer.currentTime-this.mediaInfo.metadata.sectionStartTimeInMedia:this.remotePlayer.currentTime}.bind(this),e.getMediaDuration=function(){return this.isLiveContent?null==this.mediaInfo.metadata||null==this.mediaInfo.metadata.sectionDuration||null==this.mediaInfo.metadata.sectionStartTimeInMedia?null:this.mediaInfo.metadata.sectionDuration:this.remotePlayer.duration}.bind(this),e.updateDisplay=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e&&e.getMediaSession()&&e.getMediaSession().media){var t=e.getMediaSession(),i=t.media,n=document.getElementById("video_image");i.metadata&&i.metadata.images&&i.metadata.images.length>0&&(n.src=i.metadata.images[0].url),document.getElementById("playerstate").style.display="block",document.getElementById("playerstatebg").style.display="block",document.getElementById("video_image_overlay").style.display="block";var a="",s="",r="";if(i.metadata&&(a=i.metadata.title,a=(a=(s=i.metadata.episodeTitle)?a+": "+s:a)?a+" ":"",r=(r=i.metadata.subtitle)?r+" ":""),DEMO_MODE?(document.getElementById("playerstate").innerHTML=(ENABLE_LIVE?"Live Content ":"Sample Video ")+t.playerState+" on Chromecast",document.getElementById("media_title").innerHTML=ENABLE_LIVE?"Live Content":"Sample Video",document.getElementById("media_subtitle").innerHTML=""):(document.getElementById("playerstate").innerHTML=a+t.playerState+" on "+e.getCastDevice().friendlyName,document.getElementById("media_title").innerHTML=a,document.getElementById("media_subtitle").innerHTML=r),i.streamType==chrome.cast.media.StreamType.LIVE){this.liveSeekableRange=t.liveSeekableRange;var o=document.getElementById("live_indicator");o.style.display="block",this.liveSeekableRange&&Math.abs(t.getEstimatedTime()-this.liveSeekableRange.end)0&&this.endPlayback()},m.prototype.updateProgressBarByTimer=function(){var e=document.getElementById("progress"),t=document.getElementById("progress_indicator");if(null!=this.mediaDuration){t.style.display="",isNaN(parseInt(e.style.width,10))&&(e.style.width="0px");var i=Math.floor(s*this.currentMediaTime/this.mediaDuration);i>s?i=s:i<0&&(i=0),e.style.width=i+"px",t.style.marginLeft=i+"px";var n=document.getElementById("seekable_window"),a=document.getElementById("unseekable_overlay");if(this.isLiveContent)if(this.liveSeekableRange){var r=Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia,this.liveSeekableRange.end)-this.mediaInfo.metadata.sectionStartTimeInMedia,o=Math.floor(s*r/this.mediaDuration);o>s?o=s:o<0&&(o=0),n.style.width=o+"px";var d=Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia,this.liveSeekableRange.start)-this.mediaInfo.metadata.sectionStartTimeInMedia,l=Math.floor(s*d/this.mediaDuration);l>s?l=s:l<0&&(l=0),a.style.width=l+"px"}else n.style.width="0px",a.style.width="600px";else n.style.width="600px",a.style.width="0px";i>=s&&!this.isLiveContent&&this.endPlayback()}else{this.isLiveContent||console.log("Error - Duration is not defined for a VOD stream."),e.style.width="0px";var u=document.getElementById("skip");u&&u.style&&u.style.display&&(u.style.display="none"),t.style.display="none";var c=document.getElementById("seekable_window");c&&c.style&&c.style.width&&(c.style.width="0px");var m=document.getElementById("unseekable_overlay");m&&m.style&&m.style.width&&(m.style.width="0px")}},m.prototype.endPlayback=function(){this.currentMediaTime=0,this.stopProgressTimer(),this.playerState=o,this.playerHandler.updateDisplay();var e=document.getElementById("play");e&&e.style&&e.display&&(e.style.display="block");var t=document.getElementById("pause");t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.getMediaTimeString=function(e){if(null==e||null==e)return null;var t=!1;e<0&&(t=!0,e*=-1);var i=Math.floor(e/3600),n=Math.floor((e-3600*i)/60),a=Math.floor(e-3600*i-60*n);return i<10&&(i="0"+i),n<10&&(n="0"+n),a<10&&(a="0"+a),(t?"-":"")+i+":"+n+":"+a},m.prototype.getClockTimeString=function(e){if(!e)return"0:00:00";var t=new Date(1e3*e),i=t.getHours(),n=t.getMinutes(),a=t.getSeconds(),s=i>=12?"PM":"AM";return(i=(i%=12)||12)+":"+(n=("0"+n).slice(-2))+":"+(a=("0"+a).slice(-2))+" "+s},m.prototype.updateAdMarkers=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e){var t=e.getMediaSession();if(t){var i=t.media;if(i){var n=i.breaks,a=i.duration;if(n)for(var s=0;sa&&r.isEmbedded))if(!document.getElementById("ad"+r.position))document.getElementById("progress").innerHTML+='
'}}}}},m.prototype.removeAdMarkers=function(){document.querySelectorAll(".adMarker").forEach((function(e){e.remove()}))},m.prototype.adPositionToMargin=function(e,t){return-1==e||e>t?s:s*e/t},m.prototype.onBreakClipIdChanged=function(){var e=document.getElementById("skip");e&&e.style&&e.style.display&&(e.style.display="none")},m.prototype.isPlayingBreak=function(e){this.enableProgressBar(!e)},m.prototype.onWhenSkippableChanged=function(e){this.whenSkippable=e},m.prototype.onCurrentBreakClipTimeChanged=function(e){var t=document.getElementById("skip");null==this.whenSkippable||this.whenSkippable<0?t&&t.style&&t.style.display&&(t.style.display="none"):void 0!==this.whenSkippable||e>=this.whenSkippable?t&&t.style&&t.style.display&&(t.style.display="block"):t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.skipAd=function(){this.remotePlayerController.skipAd()},m.prototype.enableProgressBar=function(e){var t=document.getElementById("progress"),i=document.getElementById("progress_indicator"),n=document.getElementById("seekable_window");e?(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_progress.png')",t.style.cursor="pointer",n.style.cursor="pointer",i.style.cursor="pointer",i.draggable=!0,t.addEventListener("click",this.seekMediaListener),n.addEventListener("click",this.seekMediaListener),i.addEventListener("dragend",this.seekMediaListener)):(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_buffer.png')",t.style.cursor="default",n.style.cursor="default",i.style.cursor="default",i.draggable=!1,t.removeEventListener("click",this.seekMediaListener),n.removeEventListener("click",this.seekMediaListener),i.removeEventListener("dragend",this.seekMediaListener))},m.prototype.requestFullScreen=function(){var e=document.getElementById("video_element"),t=e.requestFullScreen||e.webkitRequestFullScreen;t&&(t.call(e),console.log("Requested fullscreen"))},m.prototype.cancelFullScreen=function(){var e=document.cancelFullScreen||document.webkitCancelFullScreen;e&&e.call(document)},m.prototype.fullscreenChangeHandler=function(){this.fullscreen=!this.fullscreen},m.prototype.showFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");this.fullscreen?(e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="block")):(e&&e.style&&e.style.display&&(e.style.display="block"),t&&t.style&&t.style.display&&(t.style.display="none"))},m.prototype.hideFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.showMediaControl=function(){var e=document.getElementById("media_control");e&&e.style&&e.opacity&&(e.style.opacity=.7)},m.prototype.hideMediaControl=function(){if("undefined"!=typeof cast){var e=cast.framework.CastContext.getInstance();e&&e.getCurrentSession()?document.getElementById("media_control").style.opacity=.7:document.getElementById("media_control").style.opacity=0}},m.prototype.showVolumeSlider=function(){this.playerHandler.isMuted()||(document.getElementById("audio_bg").style.opacity=1,document.getElementById("audio_bg_track").style.opacity=1,document.getElementById("audio_bg_level").style.opacity=1,document.getElementById("audio_indicator").style.opacity=1)},m.prototype.hideVolumeSlider=function(){document.getElementById("audio_bg").style.opacity=0,document.getElementById("audio_bg_track").style.opacity=0,document.getElementById("audio_bg_level").style.opacity=0,document.getElementById("audio_indicator").style.opacity=0},m.prototype.resetVolumeSlider=function(){var e=.5*document.getElementById("audio_bg_track").clientHeight;document.getElementById("audio_bg_level").style.height=e+"px",document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},m.prototype.initializeUI=function(){document.getElementById("media_title").innerHTML=this.mediaContents[0].title,document.getElementById("media_subtitle").innerHTML=this.mediaContents[this.currentMediaIndex].subtitle,document.getElementById("media_desc").innerHTML=this.mediaContents[this.currentMediaIndex].description,document.getElementById("progress_bg").addEventListener("click",this.seekMedia.bind(this)),document.getElementById("progress").addEventListener("click",this.seekMedia.bind(this)),document.getElementById("progress_indicator").addEventListener("dragend",this.seekMedia.bind(this)),document.getElementById("audio_on").addEventListener("click",this.playerHandler.mute.bind(this.playerHandler)),document.getElementById("audio_off").addEventListener("click",this.playerHandler.unMute.bind(this.playerHandler)),document.getElementById("audio_bg").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_on").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_bg_level").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_bg_track").addEventListener("mouseover",this.showVolumeSlider.bind(this)),document.getElementById("audio_bg_level").addEventListener("click",this.setVolume.bind(this)),document.getElementById("audio_bg_track").addEventListener("click",this.setVolume.bind(this)),document.getElementById("audio_bg").addEventListener("mouseout",this.hideVolumeSlider.bind(this)),document.getElementById("audio_on").addEventListener("mouseout",this.hideVolumeSlider.bind(this)),document.getElementById("main_video").addEventListener("mouseover",this.showMediaControl.bind(this)),document.getElementById("main_video").addEventListener("mouseout",this.hideMediaControl.bind(this)),document.getElementById("media_control").addEventListener("mouseover",this.showMediaControl.bind(this)),document.getElementById("media_control").addEventListener("mouseout",this.hideMediaControl.bind(this)),document.getElementById("fullscreen_expand").addEventListener("click",this.requestFullScreen.bind(this)),document.getElementById("fullscreen_collapse").addEventListener("click",this.cancelFullScreen.bind(this)),document.addEventListener("fullscreenchange",this.fullscreenChangeHandler.bind(this),!1),document.addEventListener("webkitfullscreenchange",this.fullscreenChangeHandler.bind(this),!1),document.getElementById("play").addEventListener("click",this.playerHandler.play.bind(this.playerHandler)),document.getElementById("pause").addEventListener("click",this.playerHandler.pause.bind(this.playerHandler)),document.getElementById("progress_indicator").draggable=!0},m.prototype.addVideoThumbs=function(){if(void 0!==this.mediaJSON&&this.mediaJSON.categories&&this.mediaJSON.categories.length>0){this.mediaContents=this.mediaJSON.categories[0].videos;for(var e=document.getElementById("carousel"),t=null,i=null,n=0;n',t.addEventListener("click",this.selectMedia.bind(this,n)),e.appendChild(t)}},m.prototype.addMediaContents=function(){void 0!==this.mediaJSON&&this.mediaJSON.categories&&this.mediaJSON.categories.length>0&&(this.mediaContents=this.mediaJSON.categories[0].videos)},m.getErrorMessage=function(e){switch(e.code){case chrome.cast.ErrorCode.API_NOT_INITIALIZED:return"The API is not initialized."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CANCEL:return"The operation was canceled by the user"+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CHANNEL_ERROR:return"A channel to the receiver is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.EXTENSION_MISSING:return"The Cast extension is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.INVALID_PARAMETER:return"The parameters to the operation were not valid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:return"No receiver was compatible with the session request."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.SESSION_ERROR:return"A session could not be created, or a session was invalid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.TIMEOUT:return"The operation timed out."+(e.description?" :"+e.description:"");default:return e}};var h=new m;window.__onGCastApiAvailable=function(e){e&&h.initializeCastPlayer()},window.CastPlayer=h,Object.defineProperty(e,"__esModule",{value:!0})})); + ***************************************************************************** */function a(e,t,i,n){var a,o=arguments.length,r=o<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,i,n);else for(var d=e.length-1;d>=0;d--)(a=e[d])&&(r=(o<3?a(r):o>3?a(t,i,r):a(t,i))||r);return o>3&&r&&Object.defineProperty(t,i,r),r}e.ɵa=function(){function e(e){this.ngCastService=e,this.videoImage="",this.imageOffline=!1,this.srcImageOffline=""}return e.prototype.ngOnInit=function(){this.window=window;var e=this.ngCastService;this.window.__onGCastApiAvailable=function(t){t&&e.initializeCastApi()},this.castingStatus=this.ngCastService.getStatus()},e.prototype.openSession=function(){this.ngCastService.discoverDevices()},e.prototype.closeSession=function(){this.ngCastService.discoverDevices()},e}(),a([t.Input()],e.ɵa.prototype,"videoImage",void 0),a([t.Input()],e.ɵa.prototype,"imageOffline",void 0),a([t.Input()],e.ɵa.prototype,"srcImageOffline",void 0),e.ɵa=a([t.Component({selector:"ng-cast",template:'
\n
\x3c!-- Put Your Image Width --\x3e\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\nTV Offline\n',styles:['body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:1100px}#video_image{height:536px;margin:20px auto 0 40px;width:960px}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin:0 0 0 40px;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;width:960px}#video_element{background-color:#000;margin:20px auto 0 40px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin:-4px 0 0 40px;opacity:.9;padding:10px;width:940px}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px;width:95%}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;left:8px;margin:-60px 0 0 40px;opacity:.7;padding:0;position:absolute;top:650px;transition:opacity 1s;width:960px;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}']})],e.ɵa),e.NgCastService=function(){function e(){var e=this;this.window=window,this.status={casting:!1},this.onInitSuccess=function(){console.log("GCast initialization success")},this.onError=function(e){console.log("GCast initialization failed",e)},this.discoverDevices=function(){var t=e,i=new n.Subject;return e.cast.requestSession((function(e){t.session=e,t.setCasting(!0),i.next("CONNECTED")}),(function(e){t.setCasting(!1),"cancel"===e.code?(t.session=void 0,i.next("CANCEL")):console.error("Error selecting a cast device",e)})),i},this.onMediaDiscovered=function(e){var t=window.document.createElement("script");return t.setAttribute("type","text/javascript"),t.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"),window.document.body.appendChild(t),globalThis.CastPlayer.mediaJSON.categories=e,globalThis.CastPlayer.addMediaContents()},this.play=function(){e.currentMedia.play(null)},this.pause=function(){e.currentMedia.pause(null)},this.stop=function(){e.currentMedia.stop(null)},this.onMediaError=function(e){console.error("Error launching media",e)},globalThis.CastPlayer.mediaJSON={categories:[]}}return e.prototype.initializeCastApi=function(){var e=this;this.cast=this.window.chrome.cast;var t=new this.cast.SessionRequest("4F8B3483"),i=new this.cast.ApiConfig(t,(function(){}),(function(t){e.cast.ReceiverAvailability.AVAILABLE}));this.cast.initialize(i,this.onInitSuccess,this.onError)},e.prototype.initialize=function(e){e&&(globalThis.CastPlayer.initializeUI(),globalThis.CastPlayer.setupLocalPlayer())},e.prototype.setCasting=function(e){this.status.casting=e},e.prototype.getStatus=function(){return this.status},e}(),e.NgCastService=a([t.Injectable()],e.NgCastService),e.NgCastModule=function(){},e.NgCastModule=a([t.NgModule({schemas:[t.CUSTOM_ELEMENTS_SCHEMA],imports:[i.CommonModule],exports:[e.ɵa],providers:[e.NgCastService],declarations:[e.ɵa]})],e.NgCastModule);var o=600,r=100,d="IDLE",l="BUFFERING",s="LOADED",c="PLAYING",u="PAUSED",m="ERROR",p=function(){this.playerHandler=new g(this),this.playerState=d,this.playerStateBeforeSwitch=null,this.remotePlayer=null,this.remotePlayerController=null,this.currentMediaTime=0,this.mediaDuration=-1,this.timer=null,this.incrementMediaTimeHandler=this.incrementMediaTime.bind(this),this.seekMediaListener=this.seekMedia.bind(this),this.currentMediaIndex=0,this.mediaContents=null,this.fullscreen=!1,this.mediaInfo=null,this.whenSkippable=null,this.liveSeekableRange=null,this.isLiveContent=!1,this.mediaJSON={categories:[]}};p.prototype.initializeCastPlayer=function(){var e={receiverApplicationId:"4F8B3483"};e.autoJoinPolicy=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,cast.framework.CastContext.getInstance().setOptions(e),y.remotePlayer=new cast.framework.RemotePlayer,y.remotePlayerController=new cast.framework.RemotePlayerController(y.remotePlayer),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,y.switchPlayer.bind(y))},p.prototype.switchPlayer=function(){y.stopProgressTimer(),y.resetVolumeSlider(),y.playerHandler.stop(),y.playerState=d,cast&&cast.framework&&y.remotePlayer.isConnected?y.setupRemotePlayer():y.setupLocalPlayer()};var g=function(e){this.target={},this.setTarget=function(e){this.target=e},this.play=function(){e.playerState!=d&&this.target.isMediaLoaded(e.currentMediaIndex)?(e.playerState=c,this.target.play(),document.getElementById("play").style.display="none",document.getElementById("pause").style.display="block"):this.load(e.currentMediaIndex)},this.pause=function(){this.target.pause(),e.playerState=u,document.getElementById("play").style.display="block",document.getElementById("pause").style.display="none"},this.stop=function(){e.playerState=d,this.target.stop()},this.load=function(t){void 0===t&&(t=null),t||(t=e.currentMediaIndex),e.playerState=l,this.target.load(t)},this.isMediaLoaded=function(e){return this.target.isMediaLoaded(e)},this.prepareToPlay=function(){e.mediaDuration=this.getMediaDuration(),e.playerHandler.updateDurationDisplay(),e.playerState=s,this.play(),e.startProgressTimer(),this.updateDisplay()},this.getCurrentMediaTime=function(){return this.target.getCurrentMediaTime()},this.getMediaDuration=function(){return this.target.getMediaDuration()},this.updateDisplay=function(){this.currentMediaTime=this.target.getCurrentMediaTime(),this.mediaDuration=this.target.getMediaDuration(),this.target.updateDisplay()},this.updateCurrentTimeDisplay=function(){this.target.updateCurrentTimeDisplay()},this.setTimeString=function(e,t){this.target.setTimeString(e,t)},this.setVolume=function(e){this.target.setVolume(e)},this.mute=function(){this.target.mute(),document.getElementById("audio_on").style.display="none",document.getElementById("audio_off").style.display="block"},this.unMute=function(){this.target.unMute(),document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},this.isMuted=function(){return this.target.isMuted()},this.seekTo=function(e){this.target.seekTo(e)}};p.prototype.setupLocalPlayer=function(){var e=document.getElementById("video_element");e.addEventListener("loadeddata",y.onMediaLoadedLocally.bind(y));var t={play:function(){e.play(),document.getElementById("video_image").style.display="none",e.style.display="block"},pause:function(){e.pause()},stop:function(){e.stop()}};t.load=function(t){e.src=y.mediaContents[t].sources[0],e.load()}.bind(y),t.getCurrentMediaTime=function(){return e.currentTime},t.getMediaDuration=function(){return e.duration},t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none"},t.setVolume=function(t){e.volume=t0&&y.playerHandler.play()},p.prototype.setupRemotePlayer=function(){y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,function(e){var t=cast.framework.CastContext.getInstance().getCurrentSession();if(!t)return y.mediaInfo=null,y.isLiveContent=!1,void y.playerHandler.updateDisplay();var i=t.getMediaSession();if(!i)return y.mediaInfo=null,y.isLiveContent=!1,void y.playerHandler.updateDisplay();y.mediaInfo=i.media,y.mediaInfo?y.isLiveContent=y.mediaInfo.streamType==chrome.cast.media.StreamType.LIVE:y.isLiveContent=!1,i.playerState==c&&y.playerState!==c&&y.playerHandler.prepareToPlay(),y.removeAdMarkers(),y.updateAdMarkers(),y.playerHandler.updateDisplay()}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,function(e){y.enableProgressBar(e.value)}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,function(){y.remotePlayer.isPaused?y.playerHandler.pause():y.playerState!==c&&y.playerHandler.play()}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,function(){y.remotePlayer.isMuted?y.playerHandler.mute():y.playerHandler.unMute()}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,function(){var e=y.remotePlayer.volumeLevel*r,t=document.getElementById("audio_bg_level");t.style.height=e+"px",t.style.marginTop=-e+"px"}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,function(e){y.isPlayingBreak(e.value)}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,function(e){y.onWhenSkippableChanged(e.value)}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,function(e){y.onCurrentBreakClipTimeChanged(e.value)}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,function(e){y.onBreakClipIdChanged(e.value)}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,function(e){console.log("LIVE_SEEKABLE_RANGE_CHANGED"),y.liveSeekableRange=e.value}.bind(y));var e={};e.play=function(){y.remotePlayer.isPaused&&y.remotePlayerController.playOrPause(),document.getElementById("video_image").style.display="",document.getElementById("video_element").style.display="none"}.bind(y),e.pause=function(){y.remotePlayer.isPaused||y.remotePlayerController.playOrPause()}.bind(y),e.stop=function(){y.remotePlayerController.stop()}.bind(y),e.load=function(e){console.log("Loading..."+this.mediaContents[e].title);var t=new chrome.cast.media.MediaInfo(this.mediaContents[e].sources[0],"video/mp4");t.metadata=new chrome.cast.media.GenericMediaMetadata,t.metadata.metadataType=chrome.cast.media.MetadataType.GENERIC,t.metadata.title=this.mediaContents[e].title,t.metadata.images=[{url:""+this.mediaContents[e].thumb}];var i=new chrome.cast.media.LoadRequest(t);castSession.loadMedia(i).then(this.playerHandler.loaded.bind(this.playerHandler),function(e){this.playerState=m,console.log("Remote media load error: "+p.getErrorMessage(e))}.bind(y))}.bind(y),e.isMediaLoaded=function(e){var t=cast.framework.CastContext.getInstance().getCurrentSession();if(!t)return!1;var i=t.getMediaSession();return!!i&&i.playerState!=d}.bind(y),e.getCurrentMediaTime=function(){return y.isLiveContent&&y.mediaInfo.metadata&&y.mediaInfo.metadata.sectionStartTimeInMedia?y.remotePlayer.currentTime-y.mediaInfo.metadata.sectionStartTimeInMedia:y.remotePlayer.currentTime}.bind(y),e.getMediaDuration=function(){return y.isLiveContent?null==y.mediaInfo.metadata||null==y.mediaInfo.metadata.sectionDuration||null==y.mediaInfo.metadata.sectionStartTimeInMedia?null:y.mediaInfo.metadata.sectionDuration:y.remotePlayer.duration}.bind(y),e.updateDisplay=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e&&e.getMediaSession()&&e.getMediaSession().media){var t=e.getMediaSession(),i=t.media,n=document.getElementById("video_image");i.metadata&&i.metadata.images&&i.metadata.images.length>0&&(n.src=i.metadata.images[0].url),document.getElementById("playerstate").style.display="block",document.getElementById("playerstatebg").style.display="block",document.getElementById("video_image_overlay").style.display="block";var a="",o="",r="";if(i.metadata&&(a=i.metadata.title,a=(a=(o=i.metadata.episodeTitle)?a+": "+o:a)?a+" ":"",r=(r=i.metadata.subtitle)?r+" ":""),DEMO_MODE?(document.getElementById("playerstate").innerHTML=(ENABLE_LIVE?"Live Content ":"Sample Video ")+t.playerState+" on Chromecast",document.getElementById("media_title").innerHTML=ENABLE_LIVE?"Live Content":"Sample Video",document.getElementById("media_subtitle").innerHTML=""):(document.getElementById("playerstate").innerHTML=a+t.playerState+" on "+e.getCastDevice().friendlyName,document.getElementById("media_title").innerHTML=a,document.getElementById("media_subtitle").innerHTML=r),i.streamType==chrome.cast.media.StreamType.LIVE){y.liveSeekableRange=t.liveSeekableRange;var d=document.getElementById("live_indicator");d.style.display="block",y.liveSeekableRange&&Math.abs(t.getEstimatedTime()-y.liveSeekableRange.end)0&&y.endPlayback()},p.prototype.updateProgressBarByTimer=function(){var e=document.getElementById("progress"),t=document.getElementById("progress_indicator");if(null!=y.mediaDuration){t.style.display="",isNaN(parseInt(e.style.width,10))&&(e.style.width="0px");var i=Math.floor(o*y.currentMediaTime/y.mediaDuration);i>o?i=o:i<0&&(i=0),e.style.width=i+"px",t.style.marginLeft=i+"px";var n=document.getElementById("seekable_window"),a=document.getElementById("unseekable_overlay");if(y.isLiveContent)if(y.liveSeekableRange){var r=Math.max(y.mediaInfo.metadata.sectionStartTimeInMedia,y.liveSeekableRange.end)-y.mediaInfo.metadata.sectionStartTimeInMedia,d=Math.floor(o*r/y.mediaDuration);d>o?d=o:d<0&&(d=0),n.style.width=d+"px";var l=Math.max(y.mediaInfo.metadata.sectionStartTimeInMedia,y.liveSeekableRange.start)-y.mediaInfo.metadata.sectionStartTimeInMedia,s=Math.floor(o*l/y.mediaDuration);s>o?s=o:s<0&&(s=0),a.style.width=s+"px"}else n.style.width="0px",a.style.width="600px";else n.style.width="600px",a.style.width="0px";i>=o&&!y.isLiveContent&&y.endPlayback()}else{y.isLiveContent||console.log("Error - Duration is not defined for a VOD stream."),e.style.width="0px";var c=document.getElementById("skip");c&&c.style&&c.style.display&&(c.style.display="none"),t.style.display="none";var u=document.getElementById("seekable_window");u&&u.style&&u.style.width&&(u.style.width="0px");var m=document.getElementById("unseekable_overlay");m&&m.style&&m.style.width&&(m.style.width="0px")}},p.prototype.endPlayback=function(){y.currentMediaTime=0,y.stopProgressTimer(),y.playerState=d,y.playerHandler.updateDisplay();var e=document.getElementById("play");e&&e.style&&e.display&&(e.style.display="block");var t=document.getElementById("pause");t&&t.style&&t.style.display&&(t.style.display="none")},p.prototype.getMediaTimeString=function(e){if(null==e||null==e)return null;var t=!1;e<0&&(t=!0,e*=-1);var i=Math.floor(e/3600),n=Math.floor((e-3600*i)/60),a=Math.floor(e-3600*i-60*n);return i<10&&(i="0"+i),n<10&&(n="0"+n),a<10&&(a="0"+a),(t?"-":"")+i+":"+n+":"+a},p.prototype.getClockTimeString=function(e){if(!e)return"0:00:00";var t=new Date(1e3*e),i=t.getHours(),n=t.getMinutes(),a=t.getSeconds(),o=i>=12?"PM":"AM";return(i=(i%=12)||12)+":"+(n=("0"+n).slice(-2))+":"+(a=("0"+a).slice(-2))+" "+o},p.prototype.updateAdMarkers=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e){var t=e.getMediaSession();if(t){var i=t.media;if(i){var n=i.breaks,a=i.duration;if(n)for(var o=0;oa&&r.isEmbedded))if(!document.getElementById("ad"+r.position))document.getElementById("progress").innerHTML+='
'}}}}},p.prototype.removeAdMarkers=function(){document.querySelectorAll(".adMarker").forEach((function(e){e.remove()}))},p.prototype.adPositionToMargin=function(e,t){return-1==e||e>t?o:o*e/t},p.prototype.onBreakClipIdChanged=function(){var e=document.getElementById("skip");e&&e.style&&e.style.display&&(e.style.display="none")},p.prototype.isPlayingBreak=function(e){y.enableProgressBar(!e)},p.prototype.onWhenSkippableChanged=function(e){y.whenSkippable=e},p.prototype.onCurrentBreakClipTimeChanged=function(e){var t=document.getElementById("skip");null==y.whenSkippable||y.whenSkippable<0?t&&t.style&&t.style.display&&(t.style.display="none"):void 0!==y.whenSkippable||e>=y.whenSkippable?t&&t.style&&t.style.display&&(t.style.display="block"):t&&t.style&&t.style.display&&(t.style.display="none")},p.prototype.skipAd=function(){y.remotePlayerController.skipAd()},p.prototype.enableProgressBar=function(e){var t=document.getElementById("progress"),i=document.getElementById("progress_indicator"),n=document.getElementById("seekable_window");e?(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_progress.png')",t.style.cursor="pointer",n.style.cursor="pointer",i.style.cursor="pointer",i.draggable=!0,t.addEventListener("click",y.seekMediaListener),n.addEventListener("click",y.seekMediaListener),i.addEventListener("dragend",y.seekMediaListener)):(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_buffer.png')",t.style.cursor="default",n.style.cursor="default",i.style.cursor="default",i.draggable=!1,t.removeEventListener("click",y.seekMediaListener),n.removeEventListener("click",y.seekMediaListener),i.removeEventListener("dragend",y.seekMediaListener))},p.prototype.requestFullScreen=function(){var e=document.getElementById("video_element"),t=e.requestFullScreen||e.webkitRequestFullScreen;t&&(t.call(e),console.log("Requested fullscreen"))},p.prototype.cancelFullScreen=function(){var e=document.cancelFullScreen||document.webkitCancelFullScreen;e&&e.call(document)},p.prototype.fullscreenChangeHandler=function(){y.fullscreen=!y.fullscreen},p.prototype.showFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");y.fullscreen?(e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="block")):(e&&e.style&&e.style.display&&(e.style.display="block"),t&&t.style&&t.style.display&&(t.style.display="none"))},p.prototype.hideFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="none")},p.prototype.showMediaControl=function(){var e=document.getElementById("media_control");e&&e.style&&e.opacity&&(e.style.opacity=.7)},p.prototype.hideMediaControl=function(){if("undefined"!=typeof cast){var e=cast.framework.CastContext.getInstance();e&&e.getCurrentSession()?document.getElementById("media_control").style.opacity=.7:document.getElementById("media_control").style.opacity=0}},p.prototype.showVolumeSlider=function(){y.playerHandler.isMuted()||(document.getElementById("audio_bg").style.opacity=1,document.getElementById("audio_bg_track").style.opacity=1,document.getElementById("audio_bg_level").style.opacity=1,document.getElementById("audio_indicator").style.opacity=1)},p.prototype.hideVolumeSlider=function(){document.getElementById("audio_bg").style.opacity=0,document.getElementById("audio_bg_track").style.opacity=0,document.getElementById("audio_bg_level").style.opacity=0,document.getElementById("audio_indicator").style.opacity=0},p.prototype.resetVolumeSlider=function(){var e=.5*document.getElementById("audio_bg_track").clientHeight;document.getElementById("audio_bg_level").style.height=e+"px",document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},p.prototype.initializeUI=function(){document.getElementById("media_title").innerHTML=y.mediaContents[0].title,document.getElementById("media_subtitle").innerHTML=y.mediaContents[y.currentMediaIndex].subtitle,document.getElementById("media_desc").innerHTML=y.mediaContents[y.currentMediaIndex].description,document.getElementById("progress_bg").addEventListener("click",y.seekMedia.bind(y)),document.getElementById("progress").addEventListener("click",y.seekMedia.bind(y)),document.getElementById("progress_indicator").addEventListener("dragend",y.seekMedia.bind(y)),document.getElementById("audio_on").addEventListener("click",y.playerHandler.mute.bind(y.playerHandler)),document.getElementById("audio_off").addEventListener("click",y.playerHandler.unMute.bind(y.playerHandler)),document.getElementById("audio_bg").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_on").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_level").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_track").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_level").addEventListener("click",y.setVolume.bind(y)),document.getElementById("audio_bg_track").addEventListener("click",y.setVolume.bind(y)),document.getElementById("audio_bg").addEventListener("mouseout",y.hideVolumeSlider.bind(y)),document.getElementById("audio_on").addEventListener("mouseout",y.hideVolumeSlider.bind(y)),document.getElementById("main_video").addEventListener("mouseover",y.showMediaControl.bind(y)),document.getElementById("main_video").addEventListener("mouseout",y.hideMediaControl.bind(y)),document.getElementById("media_control").addEventListener("mouseover",y.showMediaControl.bind(y)),document.getElementById("media_control").addEventListener("mouseout",y.hideMediaControl.bind(y)),document.getElementById("fullscreen_expand").addEventListener("click",y.requestFullScreen.bind(y)),document.getElementById("fullscreen_collapse").addEventListener("click",y.cancelFullScreen.bind(y)),document.addEventListener("fullscreenchange",y.fullscreenChangeHandler.bind(y),!1),document.addEventListener("webkitfullscreenchange",y.fullscreenChangeHandler.bind(y),!1),document.getElementById("play").addEventListener("click",y.playerHandler.play.bind(y.playerHandler)),document.getElementById("pause").addEventListener("click",y.playerHandler.pause.bind(y.playerHandler)),document.getElementById("progress_indicator").draggable=!0},p.prototype.addVideoThumbs=function(){if(void 0!==y.mediaJSON&&y.mediaJSON.categories&&y.mediaJSON.categories.length>0){y.mediaContents=y.mediaJSON.categories[0].videos;for(var e=document.getElementById("carousel"),t=null,i=null,n=0;n',t.addEventListener("click",y.selectMedia.bind(this,n)),e.appendChild(t)}},p.prototype.addMediaContents=function(){return void 0!==y.mediaJSON&&y.mediaJSON.categories&&y.mediaJSON.categories.length>0?(y.mediaContents=y.mediaJSON.categories[0].videos,y.mediaContents):null},p.getErrorMessage=function(e){switch(e.code){case chrome.cast.ErrorCode.API_NOT_INITIALIZED:return"The API is not initialized."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CANCEL:return"The operation was canceled by the user"+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CHANNEL_ERROR:return"A channel to the receiver is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.EXTENSION_MISSING:return"The Cast extension is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.INVALID_PARAMETER:return"The parameters to the operation were not valid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:return"No receiver was compatible with the session request."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.SESSION_ERROR:return"A session could not be created, or a session was invalid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.TIMEOUT:return"The operation timed out."+(e.description?" :"+e.description:"");default:return e}};var y=new p;window.__onGCastApiAvailable=function(e){e&&y.initializeCastPlayer()},window.CastPlayer=y,Object.defineProperty(e,"__esModule",{value:!0})})); //# sourceMappingURL=thinkam.net-ng-cast.umd.min.js.map \ No newline at end of file diff --git a/dist/bundles/thinkam.net-ng-cast.umd.min.js.map b/dist/bundles/thinkam.net-ng-cast.umd.min.js.map index 7c078a3..bf721d4 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.min.js.map +++ b/dist/bundles/thinkam.net-ng-cast.umd.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../CastVideos.js"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","NgCastComponent","ngCastService","this","videoImage","imageOffline","srcImageOffline","prototype","ngOnInit","window","isAvailable","initializeCastApi","castingStatus","getStatus","openSession","discoverDevices","closeSession","tslib_1.__decorate","Input","Component","selector","template","NgCastService","_this","status","casting","onInitSuccess","console","log","onError","err","self","subj","Subject","cast","requestSession","s","session","setCasting","next","code","undefined","error","onMediaDiscovered","categories","script","createElement","setAttribute","body","appendChild","globalThis","CastPlayer","mediaJSON","addMediaContents","setupLocalPlayer","initializeUI","play","currentMedia","pause","stop","onMediaError","sessionRequest","SessionRequest","apiConfig","ApiConfig","ReceiverAvailability","AVAILABLE","initialize","value","Injectable","NgCastModule","NgModule","schemas","CUSTOM_ELEMENTS_SCHEMA","imports","CommonModule","exports","providers","declarations","PROGRESS_BAR_WIDTH","FULL_VOLUME_HEIGHT","PLAYER_STATE","playerHandler","PlayerHandler","playerState","playerStateBeforeSwitch","remotePlayer","remotePlayerController","currentMediaTime","mediaDuration","timer","incrementMediaTimeHandler","incrementMediaTime","bind","seekMediaListener","seekMedia","currentMediaIndex","mediaContents","fullscreen","mediaInfo","whenSkippable","liveSeekableRange","isLiveContent","initializeCastPlayer","options","receiverApplicationId","autoJoinPolicy","chrome","AutoJoinPolicy","ORIGIN_SCOPED","framework","CastContext","getInstance","setOptions","RemotePlayer","RemotePlayerController","addEventListener","RemotePlayerEventType","IS_CONNECTED_CHANGED","e","switchPlayer","stopProgressTimer","resetVolumeSlider","isConnected","setupRemotePlayer","castPlayer","setTarget","isMediaLoaded","document","getElementById","style","display","load","mediaIndex","prepareToPlay","getMediaDuration","updateDurationDisplay","startProgressTimer","updateDisplay","getCurrentMediaTime","updateCurrentTimeDisplay","setTimeString","element","time","setVolume","volumeSliderPosition","mute","unMute","isMuted","seekTo","localPlayer","onMediaLoadedLocally","playerTarget","src","currentTime","duration","updateDisplayMessage","volume","p","height","marginTop","muted","DEFAULT_VOLUME","showFullscreenButton","MEDIA_INFO_CHANGED","event","getCurrentSession","media","getMediaSession","streamType","StreamType","LIVE","removeAdMarkers","updateAdMarkers","CAN_SEEK_CHANGED","enableProgressBar","IS_PAUSED_CHANGED","isPaused","IS_MUTED_CHANGED","VOLUME_LEVEL_CHANGED","newVolume","volumeLevel","IS_PLAYING_BREAK_CHANGED","isPlayingBreak","WHEN_SKIPPABLE_CHANGED","onWhenSkippableChanged","CURRENT_BREAK_CLIP_TIME_CHANGED","onCurrentBreakClipTimeChanged","BREAK_CLIP_ID_CHANGED","onBreakClipIdChanged","LIVE_SEEKABLE_RANGE_CHANGED","playOrPause","MediaInfo","BUFFERED","metadata","TvShowMediaMetadata","title","subtitle","images","url","request","LoadRequest","ENABLE_ADS","breakClips","breakClipsJSON","breaks","breaksJSON","ENABLE_LIVE","Date","sectionStartAbsoluteTime","startAbsoluteTime","sectionStartTimeInMedia","sectionDuration","item","QueueItem","queueData","QueueData","items","name","autoplay","loadMedia","then","errorCode","getErrorMessage","castSession","vi","mediaTitle","mediaEpisodeTitle","mediaSubtitle","episodeTitle","DEMO_MODE","innerHTML","getCastDevice","friendlyName","live_indicator","Math","abs","getEstimatedTime","end","LIVE_INDICATOR_BUFFER","currentTimeString","getMediaTimeString","getClockTimeString","currentVolume","setVolumeLevel","muteOrUnmute","seek","canSeek","opacity","hideFullscreenButton","getSessionState","SessionState","SESSION_RESUMED","selectMedia","currentMediaInfo","marginLeft","width","seekable_window","unseekable_overlay","position","parseInt","offsetX","pi","progress","seekTime","pp","pw","currentTarget","id","mouseEvent","pos","offsetY","clientHeight","setInterval","clearInterval","updateProgressBarByTimer","endPlayback","progressBar","isNaN","floor","seekableMediaPosition","max","seekableWidth","unseekableMediaPosition","start","unseekableWidth","skip","seekable_window_1","unseekable_overlay_1","timestamp","isNegative","hours","minutes","seconds","date","getHours","getMinutes","getSeconds","ampm","slice","contentDuration","adBreak","isEmbedded","adPositionToMargin","querySelectorAll","forEach","adMarker","remove","currentBreakClipTime","skipAd","enable","progress_indicator","backgroundImage","cursor","draggable","removeEventListener","requestFullScreen","requestMethod","call","cancelFullScreen","fullscreenChangeHandler","fullscreen_expand","fullscreen_collapse","showMediaControl","media_control","hideMediaControl","context","showVolumeSlider","hideVolumeSlider","defaultVolumeSliderHeight","addVideoThumbs","ni","newdiv","divIdName","ErrorCode","API_NOT_INITIALIZED","description","CANCEL","CHANNEL_ERROR","EXTENSION_MISSING","INVALID_PARAMETER","RECEIVER_UNAVAILABLE","SESSION_ERROR","TIMEOUT"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n globalThis.CastPlayer.addMediaContents();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeUI();\n };\n\n play = () => { \n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n globalThis.CastPlayer.addMediaContents();\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = function () {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n this.remotePlayer = new cast.framework.RemotePlayer();\n this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer);\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n function (e) {\n this.switchPlayer(e.value);\n }.bind(this)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = function () {\n this.playerStateBeforeSwitch = this.playerState;\n\n this.stopProgressTimer();\n this.resetVolumeSlider();\n\n // Session is active\n if (cast && cast.framework && this.remotePlayer.isConnected) {\n // Pause local playback\n this.playerHandler.pause();\n this.setupRemotePlayer();\n } else {\n this.setupLocalPlayer();\n }\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n this.updateDurationDisplay = function () {\n this.target.updateDurationDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', this.onMediaLoadedLocally.bind(this));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function() {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function(mediaIndex) {\n localPlayer.src =\n this.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(this);\n\n playerTarget.getCurrentMediaTime = function() {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function() {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function(volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function() {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function() {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function() {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function(time) {\n localPlayer.currentTime = time;\n };\n\n this.playerHandler.setTarget(playerTarget);\n\n this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n this.showFullscreenButton();\n\n if (this.currentMediaTime > 0) {\n this.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n this.mediaInfo = media.media;\n\n if (this.mediaInfo) {\n this.isLiveContent = (this.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n this.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) {\n this.playerHandler.prepareToPlay();\n }\n\n this.removeAdMarkers();\n this.updateAdMarkers();\n\n this.playerHandler.updateDisplay();\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n this.enableProgressBar(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (this.remotePlayer.isPaused) {\n this.playerHandler.pause();\n } else if (this.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n this.playerHandler.play();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n } else {\n this.playerHandler.unMute();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n this.isPlayingBreak(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n this.onWhenSkippableChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n this.onCurrentBreakClipTimeChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n this.onBreakClipIdChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n this.liveSeekableRange = event.value;\n }.bind(this)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(this);\n\n playerTarget.pause = function () {\n if (!this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n }.bind(this);\n\n playerTarget.stop = function () {\n this.remotePlayerController.stop();\n }.bind(this);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n\n let mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;\n mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata();\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle'];\n mediaInfo.metadata.images = [{\n 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']\n }];\n\n let request = new chrome.cast.media.LoadRequest(mediaInfo);\n request.currentTime = this.currentMediaTime;\n\n if (ENABLE_ADS) {\n // Add sample breaks and breakClips.\n mediaInfo.breakClips = breakClipsJSON;\n mediaInfo.breaks = breaksJSON;\n } else if (ENABLE_LIVE) {\n // Change the streamType and add live specific metadata.\n mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;\n // TODO: Set the metadata on the receiver side in your implementation.\n // startAbsoluteTime and sectionStartTimeInMedia will be set for you.\n // See https://developers.google.com/cast/docs/caf_receiver/live.\n\n // TODO: Start time, is a fake timestamp. Use correct values for your implementation.\n let currentTime = new Date();\n // Convert from milliseconds to seconds.\n currentTime = currentTime / 1000;\n let sectionStartAbsoluteTime = currentTime;\n\n // Duration should be -1 for live streams.\n mediaInfo.duration = -1;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.startAbsoluteTime = currentTime;\n mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.metadata.sectionStartTimeInMedia = 0;\n mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration'];\n\n let item = new chrome.cast.media.QueueItem(mediaInfo);\n request.queueData = new chrome.cast.media.QueueData();\n request.queueData.items = [item];\n request.queueData.name = \"Sample Queue for Live\";\n }\n\n // Do not immediately start playing if the player was previously PAUSED.\n if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) {\n request.autoplay = false;\n } else {\n request.autoplay = true;\n }\n\n cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(\n function () {\n console.log('Remote media loaded');\n }.bind(this),\n function (errorCode) {\n this.playerState = PLAYER_STATE.IDLE;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n this.playerHandler.updateDisplay();\n }.bind(this));\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(this);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (this.isLiveContent && this.mediaInfo.metadata &&\n this.mediaInfo.metadata.sectionStartTimeInMedia) {\n return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return this.remotePlayer.currentTime;\n }\n }.bind(this);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (this.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (this.mediaInfo.metadata == undefined ||\n this.mediaInfo.metadata.sectionDuration == undefined ||\n this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return this.mediaInfo.metadata.sectionDuration;\n } else {\n return this.remotePlayer.duration;\n }\n }.bind(this);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n this.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(this);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime());\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration());\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n\n if (this.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = this.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n this.remotePlayer.volumeLevel = currentVolume;\n this.remotePlayerController.setVolumeLevel();\n }.bind(this);\n\n playerTarget.mute = function () {\n if (!this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.unMute = function () {\n if (this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.isMuted = function () {\n return this.remotePlayer.isMuted;\n }.bind(this);\n\n playerTarget.seekTo = function (time) {\n this.remotePlayer.currentTime = time;\n this.remotePlayerController.seek();\n }.bind(this);\n\n this.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n }\n this.enableProgressBar(this.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n this.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n this.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n this.removeAdMarkers();\n this.updateAdMarkers();\n } else {\n this.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = this.currentMediaTime;\n\n this.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n this.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n this.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n this.stopProgressTimer();\n this.currentMediaTime = 0;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n this.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (this.isLiveContent && !this.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (this.playerState === PLAYER_STATE.PLAYING ||\n this.playerState === PLAYER_STATE.PAUSED) {\n this.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (this.isLiveContent) {\n seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n this.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n this.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n this.stopProgressTimer();\n\n // Start progress timer\n this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n this.currentMediaTime = this.playerHandler.getCurrentMediaTime();\n this.mediaDuration = this.playerHandler.getMediaDuration();\n\n this.playerHandler.updateDurationDisplay();\n\n if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) {\n this.playerHandler.updateCurrentTimeDisplay();\n this.updateProgressBarByTimer();\n } else if (this.mediaDuration > 0) {\n this.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (this.mediaDuration == null) {\n if (!this.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n \n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n \n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (this.isLiveContent) {\n if (this.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) {\n this.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n this.currentMediaTime = 0;\n this.stopProgressTimer();\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n this.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n this.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (this.whenSkippable == undefined || this.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n this.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', this.seekMediaListener);\n seekable_window.addEventListener('click', this.seekMediaListener);\n progress_indicator.addEventListener('dragend', this.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', this.seekMediaListener);\n seekable_window.removeEventListener('click', this.seekMediaListener);\n progress_indicator.removeEventListener('dragend', this.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n this.fullscreen = !this.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (this.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block'; \n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!this.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = function () {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n this.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n this.mediaContents[this.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n this.mediaContents[this.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', this.seekMedia.bind(this));\n document.getElementById('progress').addEventListener(\n 'click', this.seekMedia.bind(this));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', this.seekMedia.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'click', this.playerHandler.mute.bind(this.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', this.playerHandler.unMute.bind(this.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('main_video').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('main_video').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', this.requestFullScreen.bind(this));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', this.cancelFullScreen.bind(this));\n document.addEventListener(\n 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n document.addEventListener(\n 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', this.playerHandler.play.bind(this.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', this.playerHandler.pause.bind(this.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) {\n this.mediaContents = this.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < this.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', this.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = function () {\n if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) {\n this.mediaContents = this.mediaJSON['categories'][0]['videos']; \n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n"]} \ No newline at end of file +{"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","NgCastComponent","ngCastService","this","videoImage","imageOffline","srcImageOffline","prototype","ngOnInit","window","isAvailable","initializeCastApi","castingStatus","getStatus","openSession","discoverDevices","closeSession","tslib_1.__decorate","Input","Component","selector","template","NgCastService","_this","status","casting","onInitSuccess","console","log","onError","err","self","subj","Subject","cast","requestSession","s","session","setCasting","next","code","undefined","error","onMediaDiscovered","categories","script","createElement","setAttribute","body","appendChild","globalThis","CastPlayer","mediaJSON","addMediaContents","play","currentMedia","pause","stop","onMediaError","sessionRequest","SessionRequest","apiConfig","ApiConfig","ReceiverAvailability","AVAILABLE","initialize","mediaContents","initializeUI","setupLocalPlayer","value","Injectable","NgCastModule","NgModule","schemas","CUSTOM_ELEMENTS_SCHEMA","imports","CommonModule","exports","providers","declarations","PROGRESS_BAR_WIDTH","FULL_VOLUME_HEIGHT","PLAYER_STATE","playerHandler","PlayerHandler","playerState","playerStateBeforeSwitch","remotePlayer","remotePlayerController","currentMediaTime","mediaDuration","timer","incrementMediaTimeHandler","incrementMediaTime","bind","seekMediaListener","seekMedia","currentMediaIndex","fullscreen","mediaInfo","whenSkippable","liveSeekableRange","isLiveContent","initializeCastPlayer","options","receiverApplicationId","autoJoinPolicy","chrome","AutoJoinPolicy","ORIGIN_SCOPED","framework","CastContext","getInstance","setOptions","castPlayer","RemotePlayer","RemotePlayerController","addEventListener","RemotePlayerEventType","IS_CONNECTED_CHANGED","switchPlayer","stopProgressTimer","resetVolumeSlider","isConnected","setupRemotePlayer","setTarget","isMediaLoaded","document","getElementById","style","display","load","mediaIndex","prepareToPlay","getMediaDuration","updateDurationDisplay","startProgressTimer","updateDisplay","getCurrentMediaTime","updateCurrentTimeDisplay","setTimeString","element","time","setVolume","volumeSliderPosition","mute","unMute","isMuted","seekTo","localPlayer","onMediaLoadedLocally","playerTarget","src","currentTime","duration","updateDisplayMessage","volume","p","height","marginTop","muted","DEFAULT_VOLUME","showFullscreenButton","MEDIA_INFO_CHANGED","event","getCurrentSession","media","getMediaSession","streamType","StreamType","LIVE","removeAdMarkers","updateAdMarkers","CAN_SEEK_CHANGED","enableProgressBar","IS_PAUSED_CHANGED","isPaused","IS_MUTED_CHANGED","VOLUME_LEVEL_CHANGED","newVolume","volumeLevel","IS_PLAYING_BREAK_CHANGED","isPlayingBreak","WHEN_SKIPPABLE_CHANGED","onWhenSkippableChanged","CURRENT_BREAK_CLIP_TIME_CHANGED","onCurrentBreakClipTimeChanged","BREAK_CLIP_ID_CHANGED","onBreakClipIdChanged","LIVE_SEEKABLE_RANGE_CHANGED","playOrPause","MediaInfo","metadata","GenericMediaMetadata","metadataType","MetadataType","GENERIC","title","images","url","request","LoadRequest","castSession","loadMedia","then","loaded","errorCode","getErrorMessage","sectionStartTimeInMedia","sectionDuration","vi","mediaTitle","mediaEpisodeTitle","mediaSubtitle","episodeTitle","subtitle","DEMO_MODE","innerHTML","ENABLE_LIVE","getCastDevice","friendlyName","live_indicator","Math","abs","getEstimatedTime","end","LIVE_INDICATOR_BUFFER","currentTimeString","getMediaTimeString","sectionStartAbsoluteTime","getClockTimeString","currentVolume","setVolumeLevel","muteOrUnmute","seek","canSeek","opacity","hideFullscreenButton","getSessionState","SessionState","SESSION_RESUMED","selectMedia","currentMediaInfo","marginLeft","width","seekable_window","unseekable_overlay","position","parseInt","offsetX","pi","progress","seekTime","pp","pw","currentTarget","id","mouseEvent","pos","offsetY","clientHeight","setInterval","clearInterval","updateProgressBarByTimer","endPlayback","progressBar","isNaN","floor","seekableMediaPosition","max","seekableWidth","unseekableMediaPosition","start","unseekableWidth","skip","seekable_window_1","unseekable_overlay_1","timestamp","isNegative","hours","minutes","seconds","date","Date","getHours","getMinutes","getSeconds","ampm","slice","breaks","contentDuration","adBreak","isEmbedded","adPositionToMargin","querySelectorAll","forEach","adMarker","remove","currentBreakClipTime","skipAd","enable","progress_indicator","backgroundImage","cursor","draggable","removeEventListener","requestFullScreen","requestMethod","call","cancelFullScreen","fullscreenChangeHandler","fullscreen_expand","fullscreen_collapse","showMediaControl","media_control","hideMediaControl","context","showVolumeSlider","hideVolumeSlider","defaultVolumeSliderHeight","addVideoThumbs","ni","newdiv","divIdName","ErrorCode","API_NOT_INITIALIZED","description","CANCEL","CHANNEL_ERROR","EXTENSION_MISSING","INVALID_PARAMETER","RECEIVER_UNAVAILABLE","SESSION_ERROR","TIMEOUT"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n castPlayer.mediaInfo = null;\n castPlayer.isLiveContent = false;\n castPlayer.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n castPlayer.mediaInfo = null;\n castPlayer.isLiveContent = false;\n castPlayer.playerHandler.updateDisplay();\n return;\n }\n\n castPlayer.mediaInfo = media.media;\n\n if (castPlayer.mediaInfo) {\n castPlayer.isLiveContent = (castPlayer.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n castPlayer.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && castPlayer.playerState !== PLAYER_STATE.PLAYING) {\n castPlayer.playerHandler.prepareToPlay();\n }\n\n castPlayer.removeAdMarkers();\n castPlayer.updateAdMarkers();\n\n castPlayer.playerHandler.updateDisplay();\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n castPlayer.enableProgressBar(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else if (castPlayer.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n castPlayer.isPlayingBreak(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n castPlayer.onWhenSkippableChanged(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n castPlayer.onCurrentBreakClipTimeChanged(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n castPlayer.onBreakClipIdChanged(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n castPlayer.liveSeekableRange = event.value;\n }.bind(castPlayer)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n this.playerHandler.loaded.bind(this.playerHandler),\n function (errorCode) {\n this.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(castPlayer);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (castPlayer.isLiveContent && castPlayer.mediaInfo.metadata &&\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia) {\n return castPlayer.remotePlayer.currentTime - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return castPlayer.remotePlayer.currentTime;\n }\n }.bind(castPlayer);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (castPlayer.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (castPlayer.mediaInfo.metadata == undefined ||\n castPlayer.mediaInfo.metadata.sectionDuration == undefined ||\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return castPlayer.mediaInfo.metadata.sectionDuration;\n } else {\n return castPlayer.remotePlayer.duration;\n }\n }.bind(castPlayer);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n castPlayer.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (castPlayer.liveSeekableRange && (Math.abs(media.getEstimatedTime() - castPlayer.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(castPlayer);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), castPlayer.playerHandler.getCurrentMediaTime());\n }.bind(castPlayer);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = castPlayer.getMediaTimeString(time);\n\n if (castPlayer.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (castPlayer.mediaInfo.metadata && castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = castPlayer.getClockTimeString(time + castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function () {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n castPlayer.enableProgressBar(castPlayer.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n castPlayer.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n castPlayer.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n castPlayer.removeAdMarkers();\n castPlayer.updateAdMarkers();\n } else {\n castPlayer.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.mediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n castPlayer.playerHandler.updateDurationDisplay();\n\n if (castPlayer.mediaDuration == null || castPlayer.currentMediaTime < castPlayer.mediaDuration || castPlayer.isLiveContent) {\n castPlayer.playerHandler.updateCurrentTimeDisplay();\n castPlayer.updateProgressBarByTimer();\n } else if (castPlayer.mediaDuration > 0) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (castPlayer.mediaDuration == null) {\n if (!castPlayer.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n\n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (castPlayer.isLiveContent) {\n if (castPlayer.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.end) -\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / castPlayer.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.start) -\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / castPlayer.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !castPlayer.isLiveContent) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n"]} \ No newline at end of file diff --git a/dist/esm2015/index.js b/dist/esm2015/index.js index 67e0e97..99d31db 100644 --- a/dist/esm2015/index.js +++ b/dist/esm2015/index.js @@ -1,5 +1,5 @@ export * from './ng.cast.module'; export * from './shared/ng-cast.service'; // ------ project path -------- | --- lib --- -import "/home/thinker/dev/thinkam/ngCast/CastVideos.js"; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsMEJBQTBCLENBQUM7QUFFekMsNkNBQTZDO0FBQzdDLE9BQU8sZ0RBQWdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL25nLmNhc3QubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vc2hhcmVkL25nLWNhc3Quc2VydmljZSc7XG5cbi8vIC0tLS0tLSBwcm9qZWN0IHBhdGggLS0tLS0tLS0gfCAtLS0gbGliIC0tLVxuaW1wb3J0IFwiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvQ2FzdFZpZGVvcy5qc1wiO1xuIl19 \ No newline at end of file +import "/home/thinker/dev/thinkam/ngCast/cast-videos.js"; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsMEJBQTBCLENBQUM7QUFFakMsNkNBQTZDO0FBQ3JELE9BQU8saURBQWlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL25nLmNhc3QubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vc2hhcmVkL25nLWNhc3Quc2VydmljZSc7XG5cbiAgICAgICAgLy8gLS0tLS0tIHByb2plY3QgcGF0aCAtLS0tLS0tLSB8IC0tLSBsaWIgLS0tXG5pbXBvcnQgXCIvaG9tZS90aGlua2VyL2Rldi90aGlua2FtL25nQ2FzdC9jYXN0LXZpZGVvcy5qc1wiO1xuIl19 \ No newline at end of file diff --git a/dist/esm2015/ng-cast.component.js b/dist/esm2015/ng-cast.component.js index 43fe3ca..a2254a2 100644 --- a/dist/esm2015/ng-cast.component.js +++ b/dist/esm2015/ng-cast.component.js @@ -37,8 +37,8 @@ NgCastComponent = tslib_1.__decorate([ Component({ selector: 'ng-cast', template: "
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", - styles: [""] + styles: ["body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:1100px}#video_image{height:536px;margin:20px auto 0 40px;width:960px}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin:0 0 0 40px;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;width:960px}#video_element{background-color:#000;margin:20px auto 0 40px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin:-4px 0 0 40px;opacity:.9;padding:10px;width:940px}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px;width:95%}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;left:8px;margin:-60px 0 0 40px;opacity:.7;padding:0;position:absolute;top:650px;transition:opacity 1s;width:960px;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] }) ], NgCastComponent); export { NgCastComponent }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJuZy1jYXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFXekQsSUFBYSxlQUFlLEdBQTVCLE1BQWEsZUFBZTtJQVExQixZQUNVLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBTDdCLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsb0JBQWUsR0FBRyxFQUFFLENBQUM7SUFJMUIsQ0FBQztJQUVMLFFBQVE7UUFDTixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsR0FBRyxVQUFVLFdBQW9CO1lBQ25FLElBQUksV0FBVyxFQUFFO2dCQUNmLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ25DO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkMsQ0FBQztDQUVGLENBQUE7QUE3QlU7SUFBUixLQUFLLEVBQUU7bURBQWlCO0FBQ2hCO0lBQVIsS0FBSyxFQUFFO3FEQUFzQjtBQUNyQjtJQUFSLEtBQUssRUFBRTt3REFBc0I7QUFObkIsZUFBZTtJQVAzQixTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsU0FBUztRQUNuQixvMkNBQXVDOztLQUl4QyxDQUFDO0dBQ1csZUFBZSxDQWlDM0I7U0FqQ1ksZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBOZ0Nhc3RTZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvbmctY2FzdC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctY2FzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZy1jYXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXG4gICAgJy4vbmctY2FzdC5jb21wb25lbnQuc2NzcydcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ0Nhc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBjYXN0aW5nU3RhdHVzOiBhbnk7XG4gIHdpbmRvdzogYW55O1xuXG4gIEBJbnB1dCgpIHZpZGVvSW1hZ2UgPSAnJztcbiAgQElucHV0KCkgaW1hZ2VPZmZsaW5lID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNyY0ltYWdlT2ZmbGluZSA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbmdDYXN0U2VydmljZTogTmdDYXN0U2VydmljZVxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMud2luZG93ID0gd2luZG93O1xuXG4gICAgbGV0IG5nQ2FzdFNlcnZpY2UgPSB0aGlzLm5nQ2FzdFNlcnZpY2U7XG4gICAgdGhpcy53aW5kb3dbJ19fb25HQ2FzdEFwaUF2YWlsYWJsZSddID0gZnVuY3Rpb24gKGlzQXZhaWxhYmxlOiBib29sZWFuKSB7XG4gICAgICBpZiAoaXNBdmFpbGFibGUpIHtcbiAgICAgICAgbmdDYXN0U2VydmljZS5pbml0aWFsaXplQ2FzdEFwaSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmNhc3RpbmdTdGF0dXMgPSB0aGlzLm5nQ2FzdFNlcnZpY2UuZ2V0U3RhdHVzKCk7XG4gIH1cblxuICBvcGVuU2Vzc2lvbigpIHtcbiAgICB0aGlzLm5nQ2FzdFNlcnZpY2UuZGlzY292ZXJEZXZpY2VzKCk7XG4gIH1cblxuICBjbG9zZVNlc3Npb24oKSB7XG4gICAgdGhpcy5uZ0Nhc3RTZXJ2aWNlLmRpc2NvdmVyRGV2aWNlcygpO1xuICB9XG5cbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJuZy1jYXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFXekQsSUFBYSxlQUFlLEdBQTVCLE1BQWEsZUFBZTtJQVExQixZQUNVLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBTDdCLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsb0JBQWUsR0FBRyxFQUFFLENBQUM7SUFJMUIsQ0FBQztJQUVMLFFBQVE7UUFDTixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsR0FBRyxVQUFVLFdBQW9CO1lBQ25FLElBQUksV0FBVyxFQUFFO2dCQUNmLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ25DO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkMsQ0FBQztDQUNGLENBQUE7QUE1QlU7SUFBUixLQUFLLEVBQUU7bURBQWlCO0FBQ2hCO0lBQVIsS0FBSyxFQUFFO3FEQUFzQjtBQUNyQjtJQUFSLEtBQUssRUFBRTt3REFBc0I7QUFObkIsZUFBZTtJQVAzQixTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsU0FBUztRQUNuQixvMkNBQXVDOztLQUl4QyxDQUFDO0dBQ1csZUFBZSxDQWdDM0I7U0FoQ1ksZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBOZ0Nhc3RTZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvbmctY2FzdC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctY2FzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZy1jYXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXG4gICAgJy4vbmctY2FzdC5jb21wb25lbnQuc2NzcydcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ0Nhc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBjYXN0aW5nU3RhdHVzOiBhbnk7XG4gIHdpbmRvdzogYW55O1xuXG4gIEBJbnB1dCgpIHZpZGVvSW1hZ2UgPSAnJztcbiAgQElucHV0KCkgaW1hZ2VPZmZsaW5lID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNyY0ltYWdlT2ZmbGluZSA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbmdDYXN0U2VydmljZTogTmdDYXN0U2VydmljZVxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMud2luZG93ID0gd2luZG93O1xuXG4gICAgbGV0IG5nQ2FzdFNlcnZpY2UgPSB0aGlzLm5nQ2FzdFNlcnZpY2U7XG4gICAgdGhpcy53aW5kb3dbJ19fb25HQ2FzdEFwaUF2YWlsYWJsZSddID0gZnVuY3Rpb24gKGlzQXZhaWxhYmxlOiBib29sZWFuKSB7XG4gICAgICBpZiAoaXNBdmFpbGFibGUpIHtcbiAgICAgICAgbmdDYXN0U2VydmljZS5pbml0aWFsaXplQ2FzdEFwaSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmNhc3RpbmdTdGF0dXMgPSB0aGlzLm5nQ2FzdFNlcnZpY2UuZ2V0U3RhdHVzKCk7XG4gIH1cblxuICBvcGVuU2Vzc2lvbigpIHtcbiAgICB0aGlzLm5nQ2FzdFNlcnZpY2UuZGlzY292ZXJEZXZpY2VzKCk7XG4gIH1cblxuICBjbG9zZVNlc3Npb24oKSB7XG4gICAgdGhpcy5uZ0Nhc3RTZXJ2aWNlLmRpc2NvdmVyRGV2aWNlcygpO1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/dist/esm2015/shared/ng-cast.service.js b/dist/esm2015/shared/ng-cast.service.js index 64c3a2c..b1bf242 100644 --- a/dist/esm2015/shared/ng-cast.service.js +++ b/dist/esm2015/shared/ng-cast.service.js @@ -38,9 +38,7 @@ let NgCastService = class NgCastService { script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1'); window['document'].body.appendChild(script); globalThis.CastPlayer.mediaJSON.categories = categories; - globalThis.CastPlayer.addMediaContents(); - globalThis.CastPlayer.setupLocalPlayer(); - globalThis.CastPlayer.initializeUI(); + return globalThis.CastPlayer.addMediaContents(); }; this.play = () => { this.currentMedia.play(null); @@ -65,8 +63,13 @@ let NgCastService = class NgCastService { let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError); } ; + initialize(mediaContents) { + if (mediaContents) { + globalThis.CastPlayer.initializeUI(); + globalThis.CastPlayer.setupLocalPlayer(); + } + } setCasting(value) { - globalThis.CastPlayer.addMediaContents(); this.status.casting = value; } getStatus() { @@ -77,4 +80,4 @@ NgCastService = tslib_1.__decorate([ Injectable() ], NgCastService); export { NgCastService }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3RoaW5rZXIvZGV2L3RoaW5rYW0vbmdDYXN0LyIsInNvdXJjZXMiOlsic2hhcmVkL25nLWNhc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTy9CLElBQWEsYUFBYSxHQUExQixNQUFhLGFBQWE7SUFTeEI7UUFOUSxXQUFNLEdBQVEsTUFBTSxDQUFDO1FBRXRCLFdBQU0sR0FBRztZQUNkLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztRQWtCRixrQkFBYSxHQUFHO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQztRQUVGLFlBQU8sR0FBRyxVQUFVLEdBQVE7WUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUM7UUFFRixvQkFBZSxHQUFHLEdBQUcsRUFBRTtZQUNyQixJQUFJLElBQUksR0FBUSxJQUFJLENBQUM7WUFDckIsSUFBSSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QixDQUFDLEVBQUUsVUFBVSxHQUFRO2dCQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO29C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O0FBekZZLGFBQWE7SUFEekIsVUFBVSxFQUFFO0dBQ0EsYUFBYSxDQXlGekI7U0F6RlksYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIHZhciBDYXN0UGxheWVyOiBhbnk7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ0Nhc3RTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjYXN0OiBhbnk7XG4gIHByaXZhdGUgY3VycmVudE1lZGlhOiBhbnk7XG4gIHByaXZhdGUgd2luZG93OiBhbnkgPSB3aW5kb3c7XG5cbiAgcHVibGljIHN0YXR1cyA9IHtcbiAgICBjYXN0aW5nOiBmYWxzZVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5tZWRpYUpTT04gPSB7XG4gICAgICBjYXRlZ29yaWVzOiBbXVxuICAgIH07XG4gIH1cblxuICBpbml0aWFsaXplQ2FzdEFwaSgpIHtcbiAgICB0aGlzLmNhc3QgPSB0aGlzLndpbmRvd1snY2hyb21lJ10uY2FzdDtcbiAgICBsZXQgc2Vzc2lvblJlcXVlc3QgPSBuZXcgdGhpcy5jYXN0LlNlc3Npb25SZXF1ZXN0KCc0RjhCMzQ4MycpO1xuICAgIGxldCBhcGlDb25maWcgPSBuZXcgdGhpcy5jYXN0LkFwaUNvbmZpZyhzZXNzaW9uUmVxdWVzdCxcbiAgICAgICgpID0+IHsgfSxcbiAgICAgIChzdGF0dXM6IGFueSkgPT4geyBpZiAoc3RhdHVzID09PSB0aGlzLmNhc3QuUmVjZWl2ZXJBdmFpbGFiaWxpdHkuQVZBSUxBQkxFKSB7IH0gfVxuICAgICk7XG4gICAgbGV0IHggPSB0aGlzLmNhc3QuaW5pdGlhbGl6ZShhcGlDb25maWcsIHRoaXMub25Jbml0U3VjY2VzcywgdGhpcy5vbkVycm9yKTtcbiAgfTtcblxuICBvbkluaXRTdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUubG9nKCdHQ2FzdCBpbml0aWFsaXphdGlvbiBzdWNjZXNzJyk7XG4gIH07XG5cbiAgb25FcnJvciA9IGZ1bmN0aW9uIChlcnI6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCdHQ2FzdCBpbml0aWFsaXphdGlvbiBmYWlsZWQnLCBlcnIpO1xuICB9O1xuXG4gIGRpc2NvdmVyRGV2aWNlcyA9ICgpID0+IHtcbiAgICBsZXQgc2VsZjogYW55ID0gdGhpcztcbiAgICBsZXQgc3ViaiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgdGhpcy5jYXN0LnJlcXVlc3RTZXNzaW9uKChzOiBhbnkpID0+IHtcbiAgICAgIHNlbGYuc2Vzc2lvbiA9IHM7XG4gICAgICBzZWxmLnNldENhc3RpbmcodHJ1ZSk7XG4gICAgICBzdWJqLm5leHQoJ0NPTk5FQ1RFRCcpO1xuICAgIH0sIGZ1bmN0aW9uIChlcnI6IGFueSkge1xuICAgICAgc2VsZi5zZXRDYXN0aW5nKGZhbHNlKTtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ2NhbmNlbCcpIHtcbiAgICAgICAgc2VsZi5zZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBzdWJqLm5leHQoJ0NBTkNFTCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc2VsZWN0aW5nIGEgY2FzdCBkZXZpY2UnLCBlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzdWJqO1xuICB9O1xuXG4gIG9uTWVkaWFEaXNjb3ZlcmVkID0gKGNhdGVnb3JpZXM6IGFueVtdKSA9PiB7XG4gICAgbGV0IHNjcmlwdCA9IHdpbmRvd1snZG9jdW1lbnQnXS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvamF2YXNjcmlwdCcpO1xuICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3NyYycsICdodHRwczovL3d3dy5nc3RhdGljLmNvbS9jdi9qcy9zZW5kZXIvdjEvY2FzdF9zZW5kZXIuanM/bG9hZENhc3RGcmFtZXdvcms9MScpO1xuICAgIHdpbmRvd1snZG9jdW1lbnQnXS5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIubWVkaWFKU09OLmNhdGVnb3JpZXMgPSBjYXRlZ29yaWVzO1xuXG4gICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLmFkZE1lZGlhQ29udGVudHMoKTtcbiAgICBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIuc2V0dXBMb2NhbFBsYXllcigpO1xuICAgIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5pbml0aWFsaXplVUkoKTtcbiAgfTtcblxuICBwbGF5ID0gKCkgPT4geyAgICBcbiAgICB0aGlzLmN1cnJlbnRNZWRpYS5wbGF5KG51bGwpO1xuICB9O1xuXG4gIHBhdXNlID0gKCkgPT4ge1xuICAgIHRoaXMuY3VycmVudE1lZGlhLnBhdXNlKG51bGwpO1xuICB9O1xuXG4gIHN0b3AgPSAoKSA9PiB7XG4gICAgdGhpcy5jdXJyZW50TWVkaWEuc3RvcChudWxsKTtcbiAgfTtcblxuICBvbk1lZGlhRXJyb3IgPSAoZXJyOiBhbnkpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsYXVuY2hpbmcgbWVkaWEnLCBlcnIpO1xuICB9O1xuXG4gIHNldENhc3RpbmcodmFsdWU6IGFueSkge1xuICAgIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5hZGRNZWRpYUNvbnRlbnRzKCk7XG4gICAgdGhpcy5zdGF0dXMuY2FzdGluZyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0U3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXR1c1xuICB9XG59XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3RoaW5rZXIvZGV2L3RoaW5rYW0vbmdDYXN0LyIsInNvdXJjZXMiOlsic2hhcmVkL25nLWNhc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTy9CLElBQWEsYUFBYSxHQUExQixNQUFhLGFBQWE7SUFTeEI7UUFOUSxXQUFNLEdBQVEsTUFBTSxDQUFDO1FBRXRCLFdBQU0sR0FBRztZQUNkLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztRQWtCRixrQkFBYSxHQUFHO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQztRQUVGLFlBQU8sR0FBRyxVQUFVLEdBQVE7WUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUM7UUFFRixvQkFBZSxHQUFHLEdBQUcsRUFBRTtZQUNyQixJQUFJLElBQUksR0FBUSxJQUFJLENBQUM7WUFDckIsSUFBSSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QixDQUFDLEVBQUUsVUFBVSxHQUFRO2dCQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO29C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O0lBQ3BCLENBQUM7Q0FDRixDQUFBO0FBN0ZZLGFBQWE7SUFEekIsVUFBVSxFQUFFO0dBQ0EsYUFBYSxDQTZGekI7U0E3RlksYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIHZhciBDYXN0UGxheWVyOiBhbnk7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ0Nhc3RTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjYXN0OiBhbnk7XG4gIHByaXZhdGUgY3VycmVudE1lZGlhOiBhbnk7XG4gIHByaXZhdGUgd2luZG93OiBhbnkgPSB3aW5kb3c7XG5cbiAgcHVibGljIHN0YXR1cyA9IHtcbiAgICBjYXN0aW5nOiBmYWxzZVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5tZWRpYUpTT04gPSB7XG4gICAgICBjYXRlZ29yaWVzOiBbXVxuICAgIH07XG4gIH1cblxuICBpbml0aWFsaXplQ2FzdEFwaSgpIHtcbiAgICB0aGlzLmNhc3QgPSB0aGlzLndpbmRvd1snY2hyb21lJ10uY2FzdDtcbiAgICBsZXQgc2Vzc2lvblJlcXVlc3QgPSBuZXcgdGhpcy5jYXN0LlNlc3Npb25SZXF1ZXN0KCc0RjhCMzQ4MycpO1xuICAgIGxldCBhcGlDb25maWcgPSBuZXcgdGhpcy5jYXN0LkFwaUNvbmZpZyhzZXNzaW9uUmVxdWVzdCxcbiAgICAgICgpID0+IHsgfSxcbiAgICAgIChzdGF0dXM6IGFueSkgPT4geyBpZiAoc3RhdHVzID09PSB0aGlzLmNhc3QuUmVjZWl2ZXJBdmFpbGFiaWxpdHkuQVZBSUxBQkxFKSB7IH0gfVxuICAgICk7XG4gICAgbGV0IHggPSB0aGlzLmNhc3QuaW5pdGlhbGl6ZShhcGlDb25maWcsIHRoaXMub25Jbml0U3VjY2VzcywgdGhpcy5vbkVycm9yKTtcbiAgfTtcblxuICBvbkluaXRTdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUubG9nKCdHQ2FzdCBpbml0aWFsaXphdGlvbiBzdWNjZXNzJyk7XG4gIH07XG5cbiAgb25FcnJvciA9IGZ1bmN0aW9uIChlcnI6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCdHQ2FzdCBpbml0aWFsaXphdGlvbiBmYWlsZWQnLCBlcnIpO1xuICB9O1xuXG4gIGRpc2NvdmVyRGV2aWNlcyA9ICgpID0+IHtcbiAgICBsZXQgc2VsZjogYW55ID0gdGhpcztcbiAgICBsZXQgc3ViaiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgdGhpcy5jYXN0LnJlcXVlc3RTZXNzaW9uKChzOiBhbnkpID0+IHtcbiAgICAgIHNlbGYuc2Vzc2lvbiA9IHM7XG4gICAgICBzZWxmLnNldENhc3RpbmcodHJ1ZSk7XG4gICAgICBzdWJqLm5leHQoJ0NPTk5FQ1RFRCcpO1xuICAgIH0sIGZ1bmN0aW9uIChlcnI6IGFueSkge1xuICAgICAgc2VsZi5zZXRDYXN0aW5nKGZhbHNlKTtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ2NhbmNlbCcpIHtcbiAgICAgICAgc2VsZi5zZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBzdWJqLm5leHQoJ0NBTkNFTCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc2VsZWN0aW5nIGEgY2FzdCBkZXZpY2UnLCBlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzdWJqO1xuICB9O1xuXG4gIG9uTWVkaWFEaXNjb3ZlcmVkID0gKGNhdGVnb3JpZXM6IGFueVtdKSA9PiB7XG4gICAgbGV0IHNjcmlwdCA9IHdpbmRvd1snZG9jdW1lbnQnXS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvamF2YXNjcmlwdCcpO1xuICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3NyYycsICdodHRwczovL3d3dy5nc3RhdGljLmNvbS9jdi9qcy9zZW5kZXIvdjEvY2FzdF9zZW5kZXIuanM/bG9hZENhc3RGcmFtZXdvcms9MScpO1xuICAgIHdpbmRvd1snZG9jdW1lbnQnXS5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIubWVkaWFKU09OLmNhdGVnb3JpZXMgPSBjYXRlZ29yaWVzO1xuXG4gICAgcmV0dXJuIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5hZGRNZWRpYUNvbnRlbnRzKCk7XG4gIH07XG5cbiAgaW5pdGlhbGl6ZShtZWRpYUNvbnRlbnRzOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAobWVkaWFDb250ZW50cykge1xuICAgICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLmluaXRpYWxpemVVSSgpO1xuICAgICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLnNldHVwTG9jYWxQbGF5ZXIoKTtcbiAgICB9XG4gIH1cblxuICBwbGF5ID0gKCkgPT4ge1xuICAgIHRoaXMuY3VycmVudE1lZGlhLnBsYXkobnVsbCk7XG4gIH07XG5cbiAgcGF1c2UgPSAoKSA9PiB7XG4gICAgdGhpcy5jdXJyZW50TWVkaWEucGF1c2UobnVsbCk7XG4gIH07XG5cbiAgc3RvcCA9ICgpID0+IHtcbiAgICB0aGlzLmN1cnJlbnRNZWRpYS5zdG9wKG51bGwpO1xuICB9O1xuXG4gIG9uTWVkaWFFcnJvciA9IChlcnI6IGFueSkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxhdW5jaGluZyBtZWRpYScsIGVycik7XG4gIH07XG5cbiAgc2V0Q2FzdGluZyh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5zdGF0dXMuY2FzdGluZyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0U3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXR1c1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/dist/fesm2015/thinkam.net-ng-cast.js b/dist/fesm2015/thinkam.net-ng-cast.js index cdf7ad2..b7767c7 100644 --- a/dist/fesm2015/thinkam.net-ng-cast.js +++ b/dist/fesm2015/thinkam.net-ng-cast.js @@ -40,7 +40,7 @@ NgCastComponent = __decorate([ Component({ selector: 'ng-cast', template: "
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", - styles: [""] + styles: ["body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:1100px}#video_image{height:536px;margin:20px auto 0 40px;width:960px}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin:0 0 0 40px;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;width:960px}#video_element{background-color:#000;margin:20px auto 0 40px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin:-4px 0 0 40px;opacity:.9;padding:10px;width:940px}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px;width:95%}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;left:8px;margin:-60px 0 0 40px;opacity:.7;padding:0;position:absolute;top:650px;transition:opacity 1s;width:960px;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] }) ], NgCastComponent); @@ -81,9 +81,7 @@ let NgCastService = class NgCastService { script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1'); window['document'].body.appendChild(script); globalThis.CastPlayer.mediaJSON.categories = categories; - globalThis.CastPlayer.addMediaContents(); - globalThis.CastPlayer.setupLocalPlayer(); - globalThis.CastPlayer.initializeUI(); + return globalThis.CastPlayer.addMediaContents(); }; this.play = () => { this.currentMedia.play(null); @@ -108,8 +106,13 @@ let NgCastService = class NgCastService { let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError); } ; + initialize(mediaContents) { + if (mediaContents) { + globalThis.CastPlayer.initializeUI(); + globalThis.CastPlayer.setupLocalPlayer(); + } + } setCasting(value) { - globalThis.CastPlayer.addMediaContents(); this.status.casting = value; } getStatus() { @@ -248,7 +251,7 @@ var CastPlayer = function () { }; }; -CastPlayer.prototype.initializeCastPlayer = function () { +CastPlayer.prototype.initializeCastPlayer = () => { var options = {}; // Set the receiver application ID to your own (created in the @@ -264,33 +267,29 @@ CastPlayer.prototype.initializeCastPlayer = function () { cast.framework.CastContext.getInstance().setOptions(options); - this.remotePlayer = new cast.framework.RemotePlayer(); - this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer); - this.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, - function (e) { - this.switchPlayer(e.value); - }.bind(this) + castPlayer.remotePlayer = new cast.framework.RemotePlayer(); + castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer); + castPlayer.remotePlayerController.addEventListener( + cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, + castPlayer.switchPlayer.bind(castPlayer) ); }; /** * Switch between the remote and local players. */ -CastPlayer.prototype.switchPlayer = function () { - this.playerStateBeforeSwitch = this.playerState; - - this.stopProgressTimer(); - this.resetVolumeSlider(); - - // Session is active - if (cast && cast.framework && this.remotePlayer.isConnected) { - // Pause local playback - this.playerHandler.pause(); - this.setupRemotePlayer(); - } else { - this.setupLocalPlayer(); +CastPlayer.prototype.switchPlayer = () => { + castPlayer.stopProgressTimer(); + castPlayer.resetVolumeSlider(); + castPlayer.playerHandler.stop(); + castPlayer.playerState = PLAYER_STATE.IDLE; + if (cast && cast.framework) { + if (castPlayer.remotePlayer.isConnected) { + castPlayer.setupRemotePlayer(); + return; + } } + castPlayer.setupLocalPlayer(); }; /** @@ -411,10 +410,6 @@ var PlayerHandler = function (castPlayer) { this.target.updateCurrentTimeDisplay(); }; - this.updateDurationDisplay = function () { - this.target.updateDurationDisplay(); - }; - /** * Determines the correct time string (media or clock) and sets it for the given element. */ @@ -450,82 +445,82 @@ var PlayerHandler = function (castPlayer) { /** * Set the PlayerHandler target to use the video-element player */ -CastPlayer.prototype.setupLocalPlayer = function () { +CastPlayer.prototype.setupLocalPlayer = () => { var localPlayer = document.getElementById('video_element'); localPlayer.addEventListener( - 'loadeddata', this.onMediaLoadedLocally.bind(this)); + 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer)); // This object will implement PlayerHandler callbacks with localPlayer var playerTarget = {}; - playerTarget.play = function() { - localPlayer.play(); + playerTarget.play = function () { + localPlayer.play(); - var vi = document.getElementById('video_image'); - vi.style.display = 'none'; - localPlayer.style.display = 'block'; + var vi = document.getElementById('video_image'); + vi.style.display = 'none'; + localPlayer.style.display = 'block'; }; playerTarget.pause = function () { - localPlayer.pause(); + localPlayer.pause(); }; playerTarget.stop = function () { - localPlayer.stop(); + localPlayer.stop(); }; - playerTarget.load = function(mediaIndex) { - localPlayer.src = - this.mediaContents[mediaIndex]['sources'][0]; - localPlayer.load(); - }.bind(this); + playerTarget.load = function (mediaIndex) { + localPlayer.src = + castPlayer.mediaContents[mediaIndex]['sources'][0]; + localPlayer.load(); + }.bind(castPlayer); - playerTarget.getCurrentMediaTime = function() { - return localPlayer.currentTime; + playerTarget.getCurrentMediaTime = function () { + return localPlayer.currentTime; }; - playerTarget.getMediaDuration = function() { - return localPlayer.duration; + playerTarget.getMediaDuration = function () { + return localPlayer.duration; }; playerTarget.updateDisplayMessage = function () { - document.getElementById('playerstate').style.display = 'none'; - document.getElementById('playerstatebg').style.display = 'none'; - document.getElementById('video_image_overlay').style.display = 'none'; + document.getElementById('playerstate').style.display = 'none'; + document.getElementById('playerstatebg').style.display = 'none'; + document.getElementById('video_image_overlay').style.display = 'none'; }; - playerTarget.setVolume = function(volumeSliderPosition) { - localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ? - volumeSliderPosition / FULL_VOLUME_HEIGHT : 1; - var p = document.getElementById('audio_bg_level'); - p.style.height = volumeSliderPosition + 'px'; - p.style.marginTop = -volumeSliderPosition + 'px'; + playerTarget.setVolume = function (volumeSliderPosition) { + localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ? + volumeSliderPosition / FULL_VOLUME_HEIGHT : 1; + var p = document.getElementById('audio_bg_level'); + p.style.height = volumeSliderPosition + 'px'; + p.style.marginTop = -volumeSliderPosition + 'px'; }; - playerTarget.mute = function() { - localPlayer.muted = true; + playerTarget.mute = function () { + localPlayer.muted = true; }; - playerTarget.unMute = function() { - localPlayer.muted = false; + playerTarget.unMute = function () { + localPlayer.muted = false; }; - playerTarget.isMuted = function() { - return localPlayer.muted; + playerTarget.isMuted = function () { + return localPlayer.muted; }; - playerTarget.seekTo = function(time) { - localPlayer.currentTime = time; + playerTarget.seekTo = function (time) { + localPlayer.currentTime = time; }; - this.playerHandler.setTarget(playerTarget); + castPlayer.playerHandler.setTarget(playerTarget); - this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT); + castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT); - this.showFullscreenButton(); + castPlayer.showFullscreenButton(); - if (this.currentMediaTime > 0) { - this.playerHandler.play(); + if (castPlayer.currentMediaTime > 0) { + castPlayer.playerHandler.play(); } }; @@ -535,121 +530,121 @@ CastPlayer.prototype.setupLocalPlayer = function () { */ CastPlayer.prototype.setupRemotePlayer = function () { // Triggers when the media info or the player state changes - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED, function (event) { let session = cast.framework.CastContext.getInstance().getCurrentSession(); if (!session) { - this.mediaInfo = null; - this.isLiveContent = false; - this.playerHandler.updateDisplay(); + castPlayer.mediaInfo = null; + castPlayer.isLiveContent = false; + castPlayer.playerHandler.updateDisplay(); return; } let media = session.getMediaSession(); if (!media) { - this.mediaInfo = null; - this.isLiveContent = false; - this.playerHandler.updateDisplay(); + castPlayer.mediaInfo = null; + castPlayer.isLiveContent = false; + castPlayer.playerHandler.updateDisplay(); return; } - this.mediaInfo = media.media; + castPlayer.mediaInfo = media.media; - if (this.mediaInfo) { - this.isLiveContent = (this.mediaInfo.streamType == + if (castPlayer.mediaInfo) { + castPlayer.isLiveContent = (castPlayer.mediaInfo.streamType == chrome.cast.media.StreamType.LIVE); } else { - this.isLiveContent = false; + castPlayer.isLiveContent = false; } - if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) { - this.playerHandler.prepareToPlay(); + if (media.playerState == PLAYER_STATE.PLAYING && castPlayer.playerState !== PLAYER_STATE.PLAYING) { + castPlayer.playerHandler.prepareToPlay(); } - this.removeAdMarkers(); - this.updateAdMarkers(); + castPlayer.removeAdMarkers(); + castPlayer.updateAdMarkers(); - this.playerHandler.updateDisplay(); - }.bind(this) + castPlayer.playerHandler.updateDisplay(); + }.bind(castPlayer) ); - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED, function (event) { - this.enableProgressBar(event.value); - }.bind(this) + castPlayer.enableProgressBar(event.value); + }.bind(castPlayer) ); - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, function () { - if (this.remotePlayer.isPaused) { - this.playerHandler.pause(); - } else if (this.playerState !== PLAYER_STATE.PLAYING) { + if (castPlayer.remotePlayer.isPaused) { + castPlayer.playerHandler.pause(); + } else if (castPlayer.playerState !== PLAYER_STATE.PLAYING) { // If currently not playing, start to play. // This occurs if starting to play from local, but this check is // required if the state is changed remotely. - this.playerHandler.play(); + castPlayer.playerHandler.play(); } - }.bind(this) + }.bind(castPlayer) ); - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED, function () { - if (this.remotePlayer.isMuted) { - this.playerHandler.mute(); + if (castPlayer.remotePlayer.isMuted) { + castPlayer.playerHandler.mute(); } else { - this.playerHandler.unMute(); + castPlayer.playerHandler.unMute(); } - }.bind(this) + }.bind(castPlayer) ); - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED, function () { - var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; + var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; var p = document.getElementById('audio_bg_level'); p.style.height = newVolume + 'px'; p.style.marginTop = -newVolume + 'px'; - }.bind(this) + }.bind(castPlayer) ); - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED, function (event) { - this.isPlayingBreak(event.value); - }.bind(this) + castPlayer.isPlayingBreak(event.value); + }.bind(castPlayer) ); - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED, function (event) { - this.onWhenSkippableChanged(event.value); - }.bind(this) + castPlayer.onWhenSkippableChanged(event.value); + }.bind(castPlayer) ); - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED, function (event) { - this.onCurrentBreakClipTimeChanged(event.value); - }.bind(this) + castPlayer.onCurrentBreakClipTimeChanged(event.value); + }.bind(castPlayer) ); - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED, function (event) { - this.onBreakClipIdChanged(event.value); - }.bind(this) + castPlayer.onBreakClipIdChanged(event.value); + }.bind(castPlayer) ); - this.remotePlayerController.addEventListener( + castPlayer.remotePlayerController.addEventListener( cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED, function (event) { console.log('LIVE_SEEKABLE_RANGE_CHANGED'); - this.liveSeekableRange = event.value; - }.bind(this) + castPlayer.liveSeekableRange = event.value; + }.bind(castPlayer) ); // This object will implement PlayerHandler callbacks with @@ -658,92 +653,47 @@ CastPlayer.prototype.setupRemotePlayer = function () { var playerTarget = {}; playerTarget.play = function () { - if (this.remotePlayer.isPaused) { - this.remotePlayerController.playOrPause(); + if (castPlayer.remotePlayer.isPaused) { + castPlayer.remotePlayerController.playOrPause(); } var vi = document.getElementById('video_image'); vi.style.display = ''; var localPlayer = document.getElementById('video_element'); localPlayer.style.display = 'none'; - }.bind(this); + }.bind(castPlayer); playerTarget.pause = function () { - if (!this.remotePlayer.isPaused) { - this.remotePlayerController.playOrPause(); + if (!castPlayer.remotePlayer.isPaused) { + castPlayer.remotePlayerController.playOrPause(); } - }.bind(this); + }.bind(castPlayer); playerTarget.stop = function () { - this.remotePlayerController.stop(); - }.bind(this); + castPlayer.remotePlayerController.stop(); + }.bind(castPlayer); // Load request for local -> remote playerTarget.load = function (mediaIndex) { console.log('Loading...' + this.mediaContents[mediaIndex]['title']); + var mediaInfo = new chrome.cast.media.MediaInfo( + this.mediaContents[mediaIndex]['sources'][0], 'video/mp4'); - let mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4'); - mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED; - mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata(); + mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata(); + mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC; mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title']; - mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle']; - mediaInfo.metadata.images = [{ - 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'] - }]; - - let request = new chrome.cast.media.LoadRequest(mediaInfo); - request.currentTime = this.currentMediaTime; - - if (ENABLE_ADS) { - // Add sample breaks and breakClips. - mediaInfo.breakClips = breakClipsJSON; - mediaInfo.breaks = breaksJSON; - } else if (ENABLE_LIVE) { - // Change the streamType and add live specific metadata. - mediaInfo.streamType = chrome.cast.media.StreamType.LIVE; - // TODO: Set the metadata on the receiver side in your implementation. - // startAbsoluteTime and sectionStartTimeInMedia will be set for you. - // See https://developers.google.com/cast/docs/caf_receiver/live. - - // TODO: Start time, is a fake timestamp. Use correct values for your implementation. - let currentTime = new Date(); - // Convert from milliseconds to seconds. - currentTime = currentTime / 1000; - let sectionStartAbsoluteTime = currentTime; - - // Duration should be -1 for live streams. - mediaInfo.duration = -1; - // TODO: Set on the receiver for your implementation. - mediaInfo.startAbsoluteTime = currentTime; - mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime; - // TODO: Set on the receiver for your implementation. - mediaInfo.metadata.sectionStartTimeInMedia = 0; - mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration']; - - let item = new chrome.cast.media.QueueItem(mediaInfo); - request.queueData = new chrome.cast.media.QueueData(); - request.queueData.items = [item]; - request.queueData.name = "Sample Queue for Live"; - } - - // Do not immediately start playing if the player was previously PAUSED. - if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) { - request.autoplay = false; - } else { - request.autoplay = true; - } - - cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then( - function () { - console.log('Remote media loaded'); - }.bind(this), - function (errorCode) { - this.playerState = PLAYER_STATE.IDLE; - console.log('Remote media load error: ' + - CastPlayer.getErrorMessage(errorCode)); - this.playerHandler.updateDisplay(); - }.bind(this)); - }.bind(this); + mediaInfo.metadata.images = [ + {'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']}]; + + var request = new chrome.cast.media.LoadRequest(mediaInfo); + castSession.loadMedia(request).then( + this.playerHandler.loaded.bind(this.playerHandler), + function (errorCode) { + this.playerState = PLAYER_STATE.ERROR; + console.log('Remote media load error: ' + + CastPlayer.getErrorMessage(errorCode)); + }.bind(castPlayer)); + }.bind(castPlayer); playerTarget.isMediaLoaded = function (mediaIndex) { let session = cast.framework.CastContext.getInstance().getCurrentSession(); @@ -758,40 +708,40 @@ CastPlayer.prototype.setupRemotePlayer = function () { // No need to verify local mediaIndex content. return true; - }.bind(this); + }.bind(castPlayer); /** * @return {number?} Current media time for the content. Always returns * media time even if in clock time (conversion done when displaying). */ playerTarget.getCurrentMediaTime = function () { - if (this.isLiveContent && this.mediaInfo.metadata && - this.mediaInfo.metadata.sectionStartTimeInMedia) { - return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia; + if (castPlayer.isLiveContent && castPlayer.mediaInfo.metadata && + castPlayer.mediaInfo.metadata.sectionStartTimeInMedia) { + return castPlayer.remotePlayer.currentTime - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; } else { // VOD and live scenerios where live metadata is not provided. - return this.remotePlayer.currentTime; + return castPlayer.remotePlayer.currentTime; } - }.bind(this); + }.bind(castPlayer); /** * @return {number?} media time duration for the content. Always returns * media time even if in clock time (conversion done when displaying). */ playerTarget.getMediaDuration = function () { - if (this.isLiveContent) { + if (castPlayer.isLiveContent) { // Scenerios when live metadata is not provided. - if (this.mediaInfo.metadata == undefined || - this.mediaInfo.metadata.sectionDuration == undefined || - this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) { + if (castPlayer.mediaInfo.metadata == undefined || + castPlayer.mediaInfo.metadata.sectionDuration == undefined || + castPlayer.mediaInfo.metadata.sectionStartTimeInMedia == undefined) { return null; } - return this.mediaInfo.metadata.sectionDuration; + return castPlayer.mediaInfo.metadata.sectionDuration; } else { - return this.remotePlayer.duration; + return castPlayer.remotePlayer.duration; } - }.bind(this); + }.bind(castPlayer); playerTarget.updateDisplay = function () { let castSession = cast.framework.CastContext.getInstance().getCurrentSession(); @@ -845,14 +795,14 @@ CastPlayer.prototype.setupRemotePlayer = function () { // live information if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) { - this.liveSeekableRange = media.liveSeekableRange; + castPlayer.liveSeekableRange = media.liveSeekableRange; let live_indicator = document.getElementById('live_indicator'); live_indicator.style.display = 'block'; // Display indicator if current time is close to the end of // the seekable range. - if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) { + if (castPlayer.liveSeekableRange && (Math.abs(media.getEstimatedTime() - castPlayer.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) { live_indicator.src = "imagefiles/live_indicator_active.png"; } else { live_indicator.src = "imagefiles/live_indicator_inactive.png"; @@ -870,29 +820,25 @@ CastPlayer.prototype.setupRemotePlayer = function () { document.getElementById('media_title').innerHTML = ""; document.getElementById('media_subtitle').innerHTML = ""; } - }.bind(this); + }.bind(castPlayer); playerTarget.updateCurrentTimeDisplay = function () { - this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime()); - }.bind(this); - - playerTarget.updateDurationDisplay = function () { - this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration()); - }.bind(this); + castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), castPlayer.playerHandler.getCurrentMediaTime()); + }.bind(castPlayer); playerTarget.setTimeString = function (element, time) { - let currentTimeString = this.getMediaTimeString(time); + let currentTimeString = castPlayer.getMediaTimeString(time); - if (this.isLiveContent) { + if (castPlayer.isLiveContent) { if (currentTimeString == null) { element.style.display = 'none'; return; } // clock time - if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) { + if (castPlayer.mediaInfo.metadata && castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) { element.style.display = 'flex'; - element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime); + element.innerHTML = castPlayer.getClockTimeString(time + castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime); } else { // media time element.style.display = 'flex'; @@ -906,10 +852,10 @@ CastPlayer.prototype.setupRemotePlayer = function () { element.style.display = 'none'; } } - }.bind(this); + }.bind(castPlayer); playerTarget.setVolume = function (volumeSliderPosition) { - var currentVolume = this.remotePlayer.volumeLevel; + var currentVolume = castPlayer.remotePlayer.volumeLevel; var p = document.getElementById('audio_bg_level'); if (volumeSliderPosition < FULL_VOLUME_HEIGHT) { p.style.height = volumeSliderPosition + 'px'; @@ -918,40 +864,40 @@ CastPlayer.prototype.setupRemotePlayer = function () { } else { currentVolume = 1; } - this.remotePlayer.volumeLevel = currentVolume; - this.remotePlayerController.setVolumeLevel(); - }.bind(this); + castPlayer.remotePlayer.volumeLevel = currentVolume; + castPlayer.remotePlayerController.setVolumeLevel(); + }.bind(castPlayer); playerTarget.mute = function () { - if (!this.remotePlayer.isMuted) { - this.remotePlayerController.muteOrUnmute(); + if (!castPlayer.remotePlayer.isMuted) { + castPlayer.remotePlayerController.muteOrUnmute(); } - }.bind(this); + }.bind(castPlayer); playerTarget.unMute = function () { - if (this.remotePlayer.isMuted) { - this.remotePlayerController.muteOrUnmute(); + if (castPlayer.remotePlayer.isMuted) { + castPlayer.remotePlayerController.muteOrUnmute(); } - }.bind(this); + }.bind(castPlayer); playerTarget.isMuted = function () { - return this.remotePlayer.isMuted; - }.bind(this); + return castPlayer.remotePlayer.isMuted; + }.bind(castPlayer); playerTarget.seekTo = function (time) { - this.remotePlayer.currentTime = time; - this.remotePlayerController.seek(); - }.bind(this); + castPlayer.remotePlayer.currentTime = time; + castPlayer.remotePlayerController.seek(); + }.bind(castPlayer); - this.playerHandler.setTarget(playerTarget); + castPlayer.playerHandler.setTarget(playerTarget); // Setup remote player properties on setup - if (this.remotePlayer.isMuted) { - this.playerHandler.mute(); + if (castPlayer.remotePlayer.isMuted) { + castPlayer.playerHandler.mute(); } - this.enableProgressBar(this.remotePlayer.canSeek); + castPlayer.enableProgressBar(castPlayer.remotePlayer.canSeek); // The remote player may have had a volume set from previous playback - var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; + var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; var p = document.getElementById('audio_bg_level'); p.style.height = currentVolume + 'px'; p.style.marginTop = -currentVolume + 'px'; @@ -959,21 +905,21 @@ CastPlayer.prototype.setupRemotePlayer = function () { // Show media_control document.getElementById('media_control').style.opacity = 0.7; - this.hideFullscreenButton(); + castPlayer.hideFullscreenButton(); // If resuming a session, take the remote properties and continue the existing // playback. Otherwise, load local content. if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() == cast.framework.SessionState.SESSION_RESUMED) { console.log('Resuming session'); - this.playerHandler.prepareToPlay(); + castPlayer.playerHandler.prepareToPlay(); // New media has been loaded so the previous ad markers should // be removed. - this.removeAdMarkers(); - this.updateAdMarkers(); + castPlayer.removeAdMarkers(); + castPlayer.updateAdMarkers(); } else { - this.playerHandler.load(); + castPlayer.playerHandler.load(); } }; @@ -982,9 +928,9 @@ CastPlayer.prototype.setupRemotePlayer = function () { */ CastPlayer.prototype.onMediaLoadedLocally = function () { var localPlayer = document.getElementById('video_element'); - localPlayer.currentTime = this.currentMediaTime; + localPlayer.currentTime = castPlayer.currentMediaTime; - this.playerHandler.prepareToPlay(); + castPlayer.playerHandler.prepareToPlay(); }; /** @@ -994,13 +940,13 @@ CastPlayer.prototype.onMediaLoadedLocally = function () { CastPlayer.prototype.selectMedia = function (mediaIndex) { console.log('Media index selected: ' + mediaIndex); - this.currentMediaIndex = mediaIndex; + castPlayer.currentMediaIndex = mediaIndex; // Clear currentMediaInfo when playing content from the sender. - this.playerHandler.currentMediaInfo = undefined; + castPlayer.playerHandler.currentMediaInfo = undefined; // Set video image var vi = document.getElementById('video_image'); - vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']; + vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']; // Reset progress bar var pi = document.getElementById('progress_indicator'); @@ -1014,13 +960,13 @@ CastPlayer.prototype.selectMedia = function (mediaIndex) { unseekable_overlay.style.width = '0px'; // Stop timer and reset time displays - this.stopProgressTimer(); - this.currentMediaTime = 0; - this.playerHandler.setTimeString(document.getElementById('currentTime'), 0); - this.playerHandler.setTimeString(document.getElementById('duration'), 0); + castPlayer.stopProgressTimer(); + castPlayer.currentMediaTime = 0; + castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0); + castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0); - this.playerState = PLAYER_STATE.IDLE; - this.playerHandler.play(); + castPlayer.playerState = PLAYER_STATE.IDLE; + castPlayer.playerHandler.play(); }; /** @@ -1028,12 +974,12 @@ CastPlayer.prototype.selectMedia = function (mediaIndex) { * @param {Event} event An event object from seek */ CastPlayer.prototype.seekMedia = function (event) { - if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) { + if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) { console.log('Error - Not seekable'); return; } - if (this.isLiveContent && !this.liveSeekableRange) { + if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) { console.log('Live content has no seekable range.'); return; } @@ -1045,28 +991,28 @@ CastPlayer.prototype.seekMedia = function (event) { let pp = 0; let pw = 0; if (event.currentTarget.id == 'progress_indicator') { - seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position / + seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position / PROGRESS_BAR_WIDTH, 10); pp = parseInt(pi.style.marginLeft, 10) + position; pw = parseInt(progress.style.width, 10) + position; } else { - seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10); + seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10); pp = position; pw = position; } - if (this.playerState === PLAYER_STATE.PLAYING || - this.playerState === PLAYER_STATE.PAUSED) { - this.currentMediaTime = seekTime; + if (castPlayer.playerState === PLAYER_STATE.PLAYING || + castPlayer.playerState === PLAYER_STATE.PAUSED) { + castPlayer.currentMediaTime = seekTime; progress.style.width = pw + 'px'; pi.style.marginLeft = pp + 'px'; } - if (this.isLiveContent) { - seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia; + if (castPlayer.isLiveContent) { + seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; } - this.playerHandler.seekTo(seekTime); + castPlayer.playerHandler.seekTo(seekTime); }; /** @@ -1081,26 +1027,26 @@ CastPlayer.prototype.setVolume = function (mouseEvent) { } else { pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10); } - this.playerHandler.setVolume(pos); + castPlayer.playerHandler.setVolume(pos); }; /** * Starts the timer to increment the media progress bar */ CastPlayer.prototype.startProgressTimer = function () { - this.stopProgressTimer(); + castPlayer.stopProgressTimer(); // Start progress timer - this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP); + castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP); }; /** * Stops the timer to increment the media progress bar */ CastPlayer.prototype.stopProgressTimer = function () { - if (this.timer) { - clearInterval(this.timer); - this.timer = null; + if (castPlayer.timer) { + clearInterval(castPlayer.timer); + castPlayer.timer = null; } }; @@ -1109,16 +1055,16 @@ CastPlayer.prototype.stopProgressTimer = function () { */ CastPlayer.prototype.incrementMediaTime = function () { // First sync with the current player's time - this.currentMediaTime = this.playerHandler.getCurrentMediaTime(); - this.mediaDuration = this.playerHandler.getMediaDuration(); + castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime(); + castPlayer.mediaDuration = castPlayer.playerHandler.getMediaDuration(); - this.playerHandler.updateDurationDisplay(); + castPlayer.playerHandler.updateDurationDisplay(); - if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) { - this.playerHandler.updateCurrentTimeDisplay(); - this.updateProgressBarByTimer(); - } else if (this.mediaDuration > 0) { - this.endPlayback(); + if (castPlayer.mediaDuration == null || castPlayer.currentMediaTime < castPlayer.mediaDuration || castPlayer.isLiveContent) { + castPlayer.playerHandler.updateCurrentTimeDisplay(); + castPlayer.updateProgressBarByTimer(); + } else if (castPlayer.mediaDuration > 0) { + castPlayer.endPlayback(); } }; @@ -1130,20 +1076,20 @@ CastPlayer.prototype.updateProgressBarByTimer = function () { var pi = document.getElementById('progress_indicator'); // Live situation where the progress and duration is unknown. - if (this.mediaDuration == null) { - if (!this.isLiveContent) { + if (castPlayer.mediaDuration == null) { + if (!castPlayer.isLiveContent) { console.log('Error - Duration is not defined for a VOD stream.'); } progressBar.style.width = '0px'; - + let skip = document.getElementById('skip'); if (skip && skip.style && skip.style.display) { skip.style.display = 'none'; } pi.style.display = 'none'; - + let seekable_window = document.getElementById('seekable_window'); if (seekable_window && seekable_window.style && seekable_window.style.width) seekable_window.style.width = '0px'; @@ -1163,7 +1109,7 @@ CastPlayer.prototype.updateProgressBarByTimer = function () { // Prevent indicator from exceeding the max width. Happens during // short media when each progress step is large - var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration); + var pp = Math.floor(PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.mediaDuration); if (pp > PROGRESS_BAR_WIDTH) { pp = PROGRESS_BAR_WIDTH; } else if (pp < 0) { @@ -1175,12 +1121,12 @@ CastPlayer.prototype.updateProgressBarByTimer = function () { let seekable_window = document.getElementById('seekable_window'); let unseekable_overlay = document.getElementById('unseekable_overlay'); - if (this.isLiveContent) { - if (this.liveSeekableRange) { + if (castPlayer.isLiveContent) { + if (castPlayer.liveSeekableRange) { // Use the liveSeekableRange to draw the seekable and unseekable windows - let seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) - - this.mediaInfo.metadata.sectionStartTimeInMedia; - let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration); + let seekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.end) - + castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; + let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / castPlayer.mediaDuration); if (seekableWidth > PROGRESS_BAR_WIDTH) { seekableWidth = PROGRESS_BAR_WIDTH; } else if (seekableWidth < 0) { @@ -1188,9 +1134,9 @@ CastPlayer.prototype.updateProgressBarByTimer = function () { } seekable_window.style.width = seekableWidth + 'px'; - let unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) - - this.mediaInfo.metadata.sectionStartTimeInMedia; - let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration); + let unseekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.start) - + castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; + let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / castPlayer.mediaDuration); if (unseekableWidth > PROGRESS_BAR_WIDTH) { unseekableWidth = PROGRESS_BAR_WIDTH; } else if (unseekableWidth < 0) { @@ -1208,8 +1154,8 @@ CastPlayer.prototype.updateProgressBarByTimer = function () { unseekable_overlay.style.width = '0px'; } - if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) { - this.endPlayback(); + if (pp >= PROGRESS_BAR_WIDTH && !castPlayer.isLiveContent) { + castPlayer.endPlayback(); } }; @@ -1217,10 +1163,10 @@ CastPlayer.prototype.updateProgressBarByTimer = function () { * End playback. Called when media ends. */ CastPlayer.prototype.endPlayback = function () { - this.currentMediaTime = 0; - this.stopProgressTimer(); - this.playerState = PLAYER_STATE.IDLE; - this.playerHandler.updateDisplay(); + castPlayer.currentMediaTime = 0; + castPlayer.stopProgressTimer(); + castPlayer.playerState = PLAYER_STATE.IDLE; + castPlayer.playerHandler.updateDisplay(); let play = document.getElementById('play'); if (play && play.style && play.display) @@ -1312,7 +1258,7 @@ CastPlayer.prototype.updateAdMarkers = function () { var div = document.getElementById('progress'); div.innerHTML += '
'; + castPlayer.adPositionToMargin(adBreak.position, contentDuration) + 'px">'; } } }; @@ -1359,14 +1305,14 @@ CastPlayer.prototype.onBreakClipIdChanged = function () { * Disable progress bar if playing a break. */ CastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) { - this.enableProgressBar(!isPlayingBreak); + castPlayer.enableProgressBar(!isPlayingBreak); }; /** * Handle WHEN_SKIPPABLE_CHANGED event */ CastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) { - this.whenSkippable = whenSkippable; + castPlayer.whenSkippable = whenSkippable; }; /** @@ -1376,13 +1322,13 @@ CastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipT let skip = document.getElementById('skip'); // Unskippable - if (this.whenSkippable == undefined || this.whenSkippable < 0) { + if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) { // Hide skip button if (skip && skip.style && skip.style.display) skip.style.display = 'none'; } // Skippable - else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) { + else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) { // Show skip button if (skip && skip.style && skip.style.display) skip.style.display = 'block'; @@ -1399,7 +1345,7 @@ CastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipT * Skip the current Ad */ CastPlayer.prototype.skipAd = function () { - this.remotePlayerController.skipAd(); + castPlayer.remotePlayerController.skipAd(); }; /** @@ -1419,9 +1365,9 @@ CastPlayer.prototype.enableProgressBar = function (enable) { progress_indicator.draggable = true; // Add listeners - progress.addEventListener('click', this.seekMediaListener); - seekable_window.addEventListener('click', this.seekMediaListener); - progress_indicator.addEventListener('dragend', this.seekMediaListener); + progress.addEventListener('click', castPlayer.seekMediaListener); + seekable_window.addEventListener('click', castPlayer.seekMediaListener); + progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener); } else { // Disable UI progress.style.backgroundImage = "url('./assets/imagefiles/timeline_bg_buffer.png')"; @@ -1431,9 +1377,9 @@ CastPlayer.prototype.enableProgressBar = function (enable) { progress_indicator.draggable = false; // Remove listeners - progress.removeEventListener('click', this.seekMediaListener); - seekable_window.removeEventListener('click', this.seekMediaListener); - progress_indicator.removeEventListener('dragend', this.seekMediaListener); + progress.removeEventListener('click', castPlayer.seekMediaListener); + seekable_window.removeEventListener('click', castPlayer.seekMediaListener); + progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener); } }; @@ -1470,7 +1416,7 @@ CastPlayer.prototype.cancelFullScreen = function () { * Exit fullscreen mode by escape */ CastPlayer.prototype.fullscreenChangeHandler = function () { - this.fullscreen = !this.fullscreen; + castPlayer.fullscreen = !castPlayer.fullscreen; }; /** @@ -1480,12 +1426,12 @@ CastPlayer.prototype.showFullscreenButton = function () { let fullscreen_expand = document.getElementById('fullscreen_expand'); let fullscreen_collapse = document.getElementById('fullscreen_collapse'); - if (this.fullscreen) { + if (castPlayer.fullscreen) { if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) fullscreen_expand.style.display = 'none'; if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display) - fullscreen_collapse.style.display = 'block'; + fullscreen_collapse.style.display = 'block'; } else { if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) fullscreen_expand.style.display = 'block'; @@ -1503,10 +1449,10 @@ CastPlayer.prototype.hideFullscreenButton = function () { let fullscreen_collapse = document.getElementById('fullscreen_collapse'); if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display) - fullscreen_expand.style.display = 'none'; + fullscreen_expand.style.display = 'none'; if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display) - fullscreen_collapse.style.display = 'none'; + fullscreen_collapse.style.display = 'none'; }; /** @@ -1537,7 +1483,7 @@ CastPlayer.prototype.hideMediaControl = function () { * Show the volume slider */ CastPlayer.prototype.showVolumeSlider = function () { - if (!this.playerHandler.isMuted()) { + if (!castPlayer.playerHandler.isMuted()) { document.getElementById('audio_bg').style.opacity = 1; document.getElementById('audio_bg_track').style.opacity = 1; document.getElementById('audio_bg_level').style.opacity = 1; @@ -1570,93 +1516,96 @@ CastPlayer.prototype.resetVolumeSlider = function () { /** * Initialize UI components and add event listeners */ -CastPlayer.prototype.initializeUI = function () { - // Set initial values for title, subtitle, and description - document.getElementById('media_title').innerHTML = - this.mediaContents[0]['title']; - document.getElementById('media_subtitle').innerHTML = - this.mediaContents[this.currentMediaIndex]['subtitle']; - document.getElementById('media_desc').innerHTML = - this.mediaContents[this.currentMediaIndex]['description']; - - // Add event handlers to UI components - document.getElementById('progress_bg').addEventListener( - 'click', this.seekMedia.bind(this)); - document.getElementById('progress').addEventListener( - 'click', this.seekMedia.bind(this)); - document.getElementById('progress_indicator').addEventListener( - 'dragend', this.seekMedia.bind(this)); - document.getElementById('audio_on').addEventListener( - 'click', this.playerHandler.mute.bind(this.playerHandler)); - document.getElementById('audio_off').addEventListener( - 'click', this.playerHandler.unMute.bind(this.playerHandler)); - document.getElementById('audio_bg').addEventListener( - 'mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_on').addEventListener( - 'mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_level').addEventListener( - 'mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_track').addEventListener( - 'mouseover', this.showVolumeSlider.bind(this)); - document.getElementById('audio_bg_level').addEventListener( - 'click', this.setVolume.bind(this)); - document.getElementById('audio_bg_track').addEventListener( - 'click', this.setVolume.bind(this)); - document.getElementById('audio_bg').addEventListener( - 'mouseout', this.hideVolumeSlider.bind(this)); - document.getElementById('audio_on').addEventListener( - 'mouseout', this.hideVolumeSlider.bind(this)); - document.getElementById('main_video').addEventListener( - 'mouseover', this.showMediaControl.bind(this)); - document.getElementById('main_video').addEventListener( - 'mouseout', this.hideMediaControl.bind(this)); - document.getElementById('media_control').addEventListener( - 'mouseover', this.showMediaControl.bind(this)); - document.getElementById('media_control').addEventListener( - 'mouseout', this.hideMediaControl.bind(this)); - document.getElementById('fullscreen_expand').addEventListener( - 'click', this.requestFullScreen.bind(this)); - document.getElementById('fullscreen_collapse').addEventListener( - 'click', this.cancelFullScreen.bind(this)); - document.addEventListener( - 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false); - document.addEventListener( - 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false); - - // Enable play/pause buttons - document.getElementById('play').addEventListener( - 'click', this.playerHandler.play.bind(this.playerHandler)); - document.getElementById('pause').addEventListener( - 'click', this.playerHandler.pause.bind(this.playerHandler)); - document.getElementById('progress_indicator').draggable = true; +CastPlayer.prototype.initializeUI = () => { + // Set initial values for title, subtitle, and description + document.getElementById('media_title').innerHTML = + castPlayer.mediaContents[0]['title']; + document.getElementById('media_subtitle').innerHTML = + castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle']; + document.getElementById('media_desc').innerHTML = + castPlayer.mediaContents[castPlayer.currentMediaIndex]['description']; + + // Add event handlers to UI components + document.getElementById('progress_bg').addEventListener( + 'click', castPlayer.seekMedia.bind(castPlayer)); + document.getElementById('progress').addEventListener( + 'click', castPlayer.seekMedia.bind(castPlayer)); + document.getElementById('progress_indicator').addEventListener( + 'dragend', castPlayer.seekMedia.bind(castPlayer)); + document.getElementById('audio_on').addEventListener( + 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler)); + document.getElementById('audio_off').addEventListener( + 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler)); + document.getElementById('audio_bg').addEventListener( + 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer)); + document.getElementById('audio_on').addEventListener( + 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer)); + document.getElementById('audio_bg_level').addEventListener( + 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer)); + document.getElementById('audio_bg_track').addEventListener( + 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer)); + document.getElementById('audio_bg_level').addEventListener( + 'click', castPlayer.setVolume.bind(castPlayer)); + document.getElementById('audio_bg_track').addEventListener( + 'click', castPlayer.setVolume.bind(castPlayer)); + document.getElementById('audio_bg').addEventListener( + 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer)); + document.getElementById('audio_on').addEventListener( + 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer)); + document.getElementById('main_video').addEventListener( + 'mouseover', castPlayer.showMediaControl.bind(castPlayer)); + document.getElementById('main_video').addEventListener( + 'mouseout', castPlayer.hideMediaControl.bind(castPlayer)); + document.getElementById('media_control').addEventListener( + 'mouseover', castPlayer.showMediaControl.bind(castPlayer)); + document.getElementById('media_control').addEventListener( + 'mouseout', castPlayer.hideMediaControl.bind(castPlayer)); + document.getElementById('fullscreen_expand').addEventListener( + 'click', castPlayer.requestFullScreen.bind(castPlayer)); + document.getElementById('fullscreen_collapse').addEventListener( + 'click', castPlayer.cancelFullScreen.bind(castPlayer)); + document.addEventListener( + 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false); + document.addEventListener( + 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false); + + // Enable play/pause buttons + document.getElementById('play').addEventListener( + 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler)); + document.getElementById('pause').addEventListener( + 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler)); + document.getElementById('progress_indicator').draggable = true; }; /** * Add video thumbnails div's to UI for media JSON contents */ CastPlayer.prototype.addVideoThumbs = function () { - if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) { - this.mediaContents = this.mediaJSON['categories'][0]['videos']; + if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) { + castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos']; var ni = document.getElementById('carousel'); var newdiv = null; var divIdName = null; - for (var i = 0; i < this.mediaContents.length; i++) { + for (var i = 0; i < castPlayer.mediaContents.length; i++) { newdiv = document.createElement('div'); divIdName = 'thumb' + i + 'Div'; newdiv.setAttribute('id', divIdName); newdiv.setAttribute('class', 'thumb'); newdiv.innerHTML = - ''; - newdiv.addEventListener('click', this.selectMedia.bind(this, i)); + newdiv.addEventListener('click', castPlayer.selectMedia.bind(this, i)); ni.appendChild(newdiv); } } }; -CastPlayer.prototype.addMediaContents = function () { - if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) { - this.mediaContents = this.mediaJSON['categories'][0]['videos']; +CastPlayer.prototype.addMediaContents = () => { + if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) { + castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos']; + return castPlayer.mediaContents; + } else { + return null; } }; diff --git a/dist/fesm2015/thinkam.net-ng-cast.js.map b/dist/fesm2015/thinkam.net-ng-cast.js.map index f65aeff..a9f72d8 100644 --- a/dist/fesm2015/thinkam.net-ng-cast.js.map +++ b/dist/fesm2015/thinkam.net-ng-cast.js.map @@ -1 +1 @@ -{"version":3,"file":"thinkam.net-ng-cast.js","sources":["../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../CastVideos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n globalThis.CastPlayer.addMediaContents();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeUI();\n };\n\n play = () => { \n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n globalThis.CastPlayer.addMediaContents();\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = function () {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n this.remotePlayer = new cast.framework.RemotePlayer();\n this.remotePlayerController = new cast.framework.RemotePlayerController(this.remotePlayer);\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n function (e) {\n this.switchPlayer(e.value);\n }.bind(this)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = function () {\n this.playerStateBeforeSwitch = this.playerState;\n\n this.stopProgressTimer();\n this.resetVolumeSlider();\n\n // Session is active\n if (cast && cast.framework && this.remotePlayer.isConnected) {\n // Pause local playback\n this.playerHandler.pause();\n this.setupRemotePlayer();\n } else {\n this.setupLocalPlayer();\n }\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n this.updateDurationDisplay = function () {\n this.target.updateDurationDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', this.onMediaLoadedLocally.bind(this));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function() {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function(mediaIndex) {\n localPlayer.src =\n this.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(this);\n\n playerTarget.getCurrentMediaTime = function() {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function() {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function(volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function() {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function() {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function() {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function(time) {\n localPlayer.currentTime = time;\n };\n\n this.playerHandler.setTarget(playerTarget);\n\n this.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n this.showFullscreenButton();\n\n if (this.currentMediaTime > 0) {\n this.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n this.mediaInfo = null;\n this.isLiveContent = false;\n this.playerHandler.updateDisplay();\n return;\n }\n\n this.mediaInfo = media.media;\n\n if (this.mediaInfo) {\n this.isLiveContent = (this.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n this.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && this.playerState !== PLAYER_STATE.PLAYING) {\n this.playerHandler.prepareToPlay();\n }\n\n this.removeAdMarkers();\n this.updateAdMarkers();\n\n this.playerHandler.updateDisplay();\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n this.enableProgressBar(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (this.remotePlayer.isPaused) {\n this.playerHandler.pause();\n } else if (this.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n this.playerHandler.play();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n } else {\n this.playerHandler.unMute();\n }\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n this.isPlayingBreak(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n this.onWhenSkippableChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n this.onCurrentBreakClipTimeChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n this.onBreakClipIdChanged(event.value);\n }.bind(this)\n );\n\n this.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n this.liveSeekableRange = event.value;\n }.bind(this)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(this);\n\n playerTarget.pause = function () {\n if (!this.remotePlayer.isPaused) {\n this.remotePlayerController.playOrPause();\n }\n }.bind(this);\n\n playerTarget.stop = function () {\n this.remotePlayerController.stop();\n }.bind(this);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n\n let mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n mediaInfo.streamType = chrome.cast.media.StreamType.BUFFERED;\n mediaInfo.metadata = new chrome.cast.media.TvShowMediaMetadata();\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.subtitle = this.mediaContents[mediaIndex]['subtitle'];\n mediaInfo.metadata.images = [{\n 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']\n }];\n\n let request = new chrome.cast.media.LoadRequest(mediaInfo);\n request.currentTime = this.currentMediaTime;\n\n if (ENABLE_ADS) {\n // Add sample breaks and breakClips.\n mediaInfo.breakClips = breakClipsJSON;\n mediaInfo.breaks = breaksJSON;\n } else if (ENABLE_LIVE) {\n // Change the streamType and add live specific metadata.\n mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;\n // TODO: Set the metadata on the receiver side in your implementation.\n // startAbsoluteTime and sectionStartTimeInMedia will be set for you.\n // See https://developers.google.com/cast/docs/caf_receiver/live.\n\n // TODO: Start time, is a fake timestamp. Use correct values for your implementation.\n let currentTime = new Date();\n // Convert from milliseconds to seconds.\n currentTime = currentTime / 1000;\n let sectionStartAbsoluteTime = currentTime;\n\n // Duration should be -1 for live streams.\n mediaInfo.duration = -1;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.startAbsoluteTime = currentTime;\n mediaInfo.metadata.sectionStartAbsoluteTime = sectionStartAbsoluteTime;\n // TODO: Set on the receiver for your implementation.\n mediaInfo.metadata.sectionStartTimeInMedia = 0;\n mediaInfo.metadata.sectionDuration = this.mediaContents[mediaIndex]['duration'];\n\n let item = new chrome.cast.media.QueueItem(mediaInfo);\n request.queueData = new chrome.cast.media.QueueData();\n request.queueData.items = [item];\n request.queueData.name = \"Sample Queue for Live\";\n }\n\n // Do not immediately start playing if the player was previously PAUSED.\n if (!this.playerStateBeforeSwitch || this.playerStateBeforeSwitch == PLAYER_STATE.PAUSED) {\n request.autoplay = false;\n } else {\n request.autoplay = true;\n }\n\n cast.framework.CastContext.getInstance().getCurrentSession().loadMedia(request).then(\n function () {\n console.log('Remote media loaded');\n }.bind(this),\n function (errorCode) {\n this.playerState = PLAYER_STATE.IDLE;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n this.playerHandler.updateDisplay();\n }.bind(this));\n }.bind(this);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(this);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (this.isLiveContent && this.mediaInfo.metadata &&\n this.mediaInfo.metadata.sectionStartTimeInMedia) {\n return this.remotePlayer.currentTime - this.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return this.remotePlayer.currentTime;\n }\n }.bind(this);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (this.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (this.mediaInfo.metadata == undefined ||\n this.mediaInfo.metadata.sectionDuration == undefined ||\n this.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return this.mediaInfo.metadata.sectionDuration;\n } else {\n return this.remotePlayer.duration;\n }\n }.bind(this);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n this.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (this.liveSeekableRange && (Math.abs(media.getEstimatedTime() - this.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(this);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('currentTime'), this.playerHandler.getCurrentMediaTime());\n }.bind(this);\n\n playerTarget.updateDurationDisplay = function () {\n this.playerHandler.setTimeString(document.getElementById('duration'), this.playerHandler.getMediaDuration());\n }.bind(this);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = this.getMediaTimeString(time);\n\n if (this.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (this.mediaInfo.metadata && this.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = this.getClockTimeString(time + this.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(this);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = this.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n this.remotePlayer.volumeLevel = currentVolume;\n this.remotePlayerController.setVolumeLevel();\n }.bind(this);\n\n playerTarget.mute = function () {\n if (!this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.unMute = function () {\n if (this.remotePlayer.isMuted) {\n this.remotePlayerController.muteOrUnmute();\n }\n }.bind(this);\n\n playerTarget.isMuted = function () {\n return this.remotePlayer.isMuted;\n }.bind(this);\n\n playerTarget.seekTo = function (time) {\n this.remotePlayer.currentTime = time;\n this.remotePlayerController.seek();\n }.bind(this);\n\n this.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (this.remotePlayer.isMuted) {\n this.playerHandler.mute();\n }\n this.enableProgressBar(this.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = this.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n this.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n this.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n this.removeAdMarkers();\n this.updateAdMarkers();\n } else {\n this.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = this.currentMediaTime;\n\n this.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n this.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n this.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n this.stopProgressTimer();\n this.currentMediaTime = 0;\n this.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n this.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (this.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !this.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (this.isLiveContent && !this.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(this.currentMediaTime + this.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * this.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (this.playerState === PLAYER_STATE.PLAYING ||\n this.playerState === PLAYER_STATE.PAUSED) {\n this.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (this.isLiveContent) {\n seekTime += this.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n this.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n this.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n this.stopProgressTimer();\n\n // Start progress timer\n this.timer = setInterval(this.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n this.currentMediaTime = this.playerHandler.getCurrentMediaTime();\n this.mediaDuration = this.playerHandler.getMediaDuration();\n\n this.playerHandler.updateDurationDisplay();\n\n if (this.mediaDuration == null || this.currentMediaTime < this.mediaDuration || this.isLiveContent) {\n this.playerHandler.updateCurrentTimeDisplay();\n this.updateProgressBarByTimer();\n } else if (this.mediaDuration > 0) {\n this.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (this.mediaDuration == null) {\n if (!this.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n \n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n \n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * this.currentMediaTime / this.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (this.isLiveContent) {\n if (this.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.end) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / this.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(this.mediaInfo.metadata.sectionStartTimeInMedia, this.liveSeekableRange.start) -\n this.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / this.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !this.isLiveContent) {\n this.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n this.currentMediaTime = 0;\n this.stopProgressTimer();\n this.playerState = PLAYER_STATE.IDLE;\n this.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n this.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n this.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (this.whenSkippable == undefined || this.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (this.whenSkippable !== undefined || currentBreakClipTime >= this.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n this.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', this.seekMediaListener);\n seekable_window.addEventListener('click', this.seekMediaListener);\n progress_indicator.addEventListener('dragend', this.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', this.seekMediaListener);\n seekable_window.removeEventListener('click', this.seekMediaListener);\n progress_indicator.removeEventListener('dragend', this.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n this.fullscreen = !this.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (this.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block'; \n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!this.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = function () {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n this.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n this.mediaContents[this.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n this.mediaContents[this.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', this.seekMedia.bind(this));\n document.getElementById('progress').addEventListener(\n 'click', this.seekMedia.bind(this));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', this.seekMedia.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'click', this.playerHandler.mute.bind(this.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', this.playerHandler.unMute.bind(this.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', this.showVolumeSlider.bind(this));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', this.setVolume.bind(this));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', this.hideVolumeSlider.bind(this));\n document.getElementById('main_video').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('main_video').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseover', this.showMediaControl.bind(this));\n document.getElementById('media_control').addEventListener(\n 'mouseout', this.hideMediaControl.bind(this));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', this.requestFullScreen.bind(this));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', this.cancelFullScreen.bind(this));\n document.addEventListener(\n 'fullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n document.addEventListener(\n 'webkitfullscreenchange', this.fullscreenChangeHandler.bind(this), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', this.playerHandler.play.bind(this.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', this.playerHandler.pause.bind(this.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) {\n this.mediaContents = this.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < this.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', this.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = function () {\n if (typeof this.mediaJSON !== 'undefined' && this.mediaJSON['categories'] && this.mediaJSON['categories'].length > 0) {\n this.mediaContents = this.mediaJSON['categories'][0]['videos']; \n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["tslib_1.__decorate"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"thinkam.net-ng-cast.js","sources":["../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n castPlayer.mediaInfo = null;\n castPlayer.isLiveContent = false;\n castPlayer.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n castPlayer.mediaInfo = null;\n castPlayer.isLiveContent = false;\n castPlayer.playerHandler.updateDisplay();\n return;\n }\n\n castPlayer.mediaInfo = media.media;\n\n if (castPlayer.mediaInfo) {\n castPlayer.isLiveContent = (castPlayer.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n castPlayer.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && castPlayer.playerState !== PLAYER_STATE.PLAYING) {\n castPlayer.playerHandler.prepareToPlay();\n }\n\n castPlayer.removeAdMarkers();\n castPlayer.updateAdMarkers();\n\n castPlayer.playerHandler.updateDisplay();\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n castPlayer.enableProgressBar(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else if (castPlayer.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n castPlayer.isPlayingBreak(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n castPlayer.onWhenSkippableChanged(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n castPlayer.onCurrentBreakClipTimeChanged(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n castPlayer.onBreakClipIdChanged(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n castPlayer.liveSeekableRange = event.value;\n }.bind(castPlayer)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n this.playerHandler.loaded.bind(this.playerHandler),\n function (errorCode) {\n this.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(castPlayer);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (castPlayer.isLiveContent && castPlayer.mediaInfo.metadata &&\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia) {\n return castPlayer.remotePlayer.currentTime - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return castPlayer.remotePlayer.currentTime;\n }\n }.bind(castPlayer);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (castPlayer.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (castPlayer.mediaInfo.metadata == undefined ||\n castPlayer.mediaInfo.metadata.sectionDuration == undefined ||\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return castPlayer.mediaInfo.metadata.sectionDuration;\n } else {\n return castPlayer.remotePlayer.duration;\n }\n }.bind(castPlayer);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n castPlayer.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (castPlayer.liveSeekableRange && (Math.abs(media.getEstimatedTime() - castPlayer.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(castPlayer);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), castPlayer.playerHandler.getCurrentMediaTime());\n }.bind(castPlayer);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = castPlayer.getMediaTimeString(time);\n\n if (castPlayer.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (castPlayer.mediaInfo.metadata && castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = castPlayer.getClockTimeString(time + castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function () {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n castPlayer.enableProgressBar(castPlayer.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n castPlayer.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n castPlayer.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n castPlayer.removeAdMarkers();\n castPlayer.updateAdMarkers();\n } else {\n castPlayer.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.mediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n castPlayer.playerHandler.updateDurationDisplay();\n\n if (castPlayer.mediaDuration == null || castPlayer.currentMediaTime < castPlayer.mediaDuration || castPlayer.isLiveContent) {\n castPlayer.playerHandler.updateCurrentTimeDisplay();\n castPlayer.updateProgressBarByTimer();\n } else if (castPlayer.mediaDuration > 0) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (castPlayer.mediaDuration == null) {\n if (!castPlayer.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n\n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (castPlayer.isLiveContent) {\n if (castPlayer.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.end) -\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / castPlayer.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.start) -\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / castPlayer.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !castPlayer.isLiveContent) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["tslib_1.__decorate"],"mappings":";;;;;IAWa,eAAe,GAA5B,MAAa,eAAe;IAQ1B,YACU,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;QAL7B,eAAU,GAAG,EAAE,CAAC;QAChB,iBAAY,GAAG,KAAK,CAAC;QACrB,oBAAe,GAAG,EAAE,CAAC;KAIzB;IAEL,QAAQ;QACN,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,GAAG,UAAU,WAAoB;YACnE,IAAI,WAAW,EAAE;gBACf,aAAa,CAAC,iBAAiB,EAAE,CAAC;aACnC;SACF,CAAC;QAEF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;KACrD;IAED,WAAW;QACT,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;KACtC;IAED,YAAY;QACV,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;KACtC;EACF;AA5BUA;IAAR,KAAK,EAAE;mDAAiB;AAChBA;IAAR,KAAK,EAAE;qDAAsB;AACrBA;IAAR,KAAK,EAAE;wDAAsB;AANnB,eAAe;IAP3B,SAAS,CAAC;QACT,QAAQ,EAAE,SAAS;QACnB,o2CAAuC;;KAIxC,CAAC;GACW,eAAe,CAgC3B;;IClCY,aAAa,GAA1B,MAAa,aAAa;IASxB;QANQ,WAAM,GAAQ,MAAM,CAAC;QAEtB,WAAM,GAAG;YACd,OAAO,EAAE,KAAK;SACf,CAAC;QAkBF,kBAAa,GAAG;YACd,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;SAC7C,CAAC;QAEF,YAAO,GAAG,UAAU,GAAQ;YAC1B,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;SACjD,CAAC;QAEF,oBAAe,GAAG;YAChB,IAAI,IAAI,GAAQ,IAAI,CAAC;YACrB,IAAI,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAM;gBAC9B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;gBACjB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aACxB,EAAE,UAAU,GAAQ;gBACnB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACvB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;oBACzB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;oBACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBACrB;qBAAM;oBACL,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;iBACrD;aACF,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;SACb,CAAC;QAEF,sBAAiB,GAAG,CAAC,UAAiB;YACpC,IAAI,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxD,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YAC/C,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,4EAA4E,CAAC,CAAC;YACzG,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAE5C,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,UAAU,CAAC;YAExD,OAAO,UAAU,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;SACjD,CAAC;QASF,SAAI,GAAG;YACL,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC9B,CAAC;QAEF,UAAK,GAAG;YACN,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC/B,CAAC;QAEF,SAAI,GAAG;YACL,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC9B,CAAC;QAEF,iBAAY,GAAG,CAAC,GAAQ;YACtB,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;SAC7C,CAAC;QA1EA,UAAU,CAAC,UAAU,CAAC,SAAS,GAAG;YAChC,UAAU,EAAE,EAAE;SACf,CAAC;KACH;IAED,iBAAiB;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;QACvC,IAAI,cAAc,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAC9D,IAAI,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EACpD,SAAS,EACT,CAAC,MAAW,OAAO,IAAI,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,CAClF,CAAC;QACF,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;KAC3E;;IAwCD,UAAU,CAAC,aAAkB;QAC3B,IAAI,aAAa,EAAE;YACjB,UAAU,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;YACrC,UAAU,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;SAC1C;KACF;IAkBD,UAAU,CAAC,KAAU;QACnB,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;KAC7B;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;KACnB;EACF;AA7FY,aAAa;IADzB,UAAU,EAAE;GACA,aAAa,CA6FzB;;ICvFY,YAAY,GAAzB,MAAa,YAAY;EAAI;AAAhB,YAAY;IATxB,QAAQ,CAAC;QACR,OAAO,EAAE,CAAE,sBAAsB,CAAE;QACnC,OAAO,EAAE;YACP,YAAY;SACb;QACD,OAAO,EAAE,CAAC,eAAe,CAAC;QAC1B,SAAS,EAAE,CAAC,aAAa,CAAC;QAC1B,YAAY,EAAE,CAAC,eAAe,CAAC;KAChC,CAAC;GACW,YAAY,CAAI;;ACf7B,YAAY,CAAC;AACb;AACA;AACA,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B;AACA;AACA;AACA;AACA;AACA,IAAI,kBAAkB,GAAG,GAAG,CAAC;AAC7B;AACA;AACA,IAAI,UAAU,GAAG,IAAI,CAAC;AACtB;AACA;AACA,IAAI,cAAc,GAAG,GAAG,CAAC;AACzB;AACA;AACA,IAAI,kBAAkB,GAAG,GAAG,CAAC;AAC7B;AACA;AACA,MAAM,YAAY,GAAG;AACrB;AACA;AACA,EAAE,IAAI,EAAE,MAAM;AACd,EAAE,OAAO,EAAE,SAAS;AACpB;AACA;AACA,EAAE,SAAS,EAAE,WAAW;AACxB;AACA,EAAE,MAAM,EAAE,QAAQ;AAClB;AACA,EAAE,OAAO,EAAE,SAAS;AACpB;AACA,EAAE,MAAM,EAAE,QAAQ;AAClB,EAAE,OAAO,EAAE,SAAS;AACpB,EAAE,KAAK,EAAE,OAAO;AAChB,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,UAAU,GAAG,YAAY;AAC7B;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;AAC/C;AACA;AACA,EAAE,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AACvC;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;AACtC;AACA;AACA;AACA,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AAC3B;AACA,EAAE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;AACrC;AACA;AACA;AACA,EAAE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;AAC5B;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;AAC1B;AACA;AACA,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AACpB;AACA,EAAE,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtE;AACA,EAAE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrD;AACA;AACA;AACA,EAAE,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;AAC7B;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC5B;AACA,EAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;AAC1B;AACA;AACA;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC5B;AACA;AACA;AACA,EAAE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAChC;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;AAC7B;AACA,EAAE,IAAI,CAAC,SAAS,GAAG;AACnB,IAAI,YAAY,EAAE,EAAE;AACpB,GAAG,CAAC;AACJ,CAAC,CAAC;AACF;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,MAAM;AAClD,EAAE,IAAI,OAAO,GAAG,EAAE,CAAC;AACnB;AACA;AACA;AACA;AACA,EAAE,OAAO,CAAC,qBAAqB,GAAG,UAAU,CAAC;AAC7C;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;AACpE;AACA,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAC/D;AACA,EAAE,UAAU,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;AAC9D,EAAE,UAAU,CAAC,sBAAsB,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACzG,EAAE,UAAU,CAAC,sBAAsB,CAAC,gBAAgB;AACpD,MAAM,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,oBAAoB;AAC/D,MAAM,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;AAC9C,GAAG,CAAC;AACJ,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,YAAY,GAAG,MAAM;AAC1C,EAAE,UAAU,CAAC,iBAAiB,EAAE,CAAC;AACjC,EAAE,UAAU,CAAC,iBAAiB,EAAE,CAAC;AACjC,EAAE,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAClC,EAAE,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AAC7C,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;AAC9B,MAAM,IAAI,UAAU,CAAC,YAAY,CAAC,WAAW,EAAE;AAC/C,QAAQ,UAAU,CAAC,iBAAiB,EAAE,CAAC;AACvC,UAAU,OAAO;AACjB,OAAO;AACP,GAAG;AACH,EAAE,UAAU,CAAC,gBAAgB,EAAE,CAAC;AAChC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,aAAa,GAAG,UAAU,UAAU,EAAE;AAC1C,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;AACnB;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,UAAU,MAAM,EAAE;AACrC,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACzB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,YAAY;AAC1B,IAAI,IAAI,UAAU,CAAC,WAAW,IAAI,YAAY,CAAC,IAAI;AACnD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE;AAChE,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AAC9C,MAAM,OAAO;AACb,KAAK;AACL;AACA,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC;AAClD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB;AACA,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC3D,IAAI,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC7D,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,KAAK,GAAG,YAAY;AAC3B,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;AACxB,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;AACjD,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC5D,IAAI,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC5D,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,YAAY;AAC1B,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AAC/C,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,UAAU,UAAU,GAAG,IAAI,EAAE;AAC3C,IAAI,IAAI,CAAC,UAAU,EAAE;AACrB,MAAM,UAAU,GAAG,UAAU,CAAC,iBAAiB,CAAC;AAChD,KAAK;AACL,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC;AACpD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACjC,GAAG,CAAC;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,UAAU,UAAU,EAAE;AAC7C,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;AACjD,GAAG,CAAC;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,YAAY;AACnC,IAAI,UAAU,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACvD,IAAI,UAAU,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;AACrD,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;AACjD;AACA,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AAChB,IAAI,UAAU,CAAC,kBAAkB,EAAE,CAAC;AACpC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;AACzB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,mBAAmB,GAAG,YAAY;AACzC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;AAC7C,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,gBAAgB,GAAG,YAAY;AACtC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;AAC1C,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,YAAY;AACnC;AACA,IAAI,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;AAC9D,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;AACxD;AACA,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;AAChC,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,wBAAwB,GAAG,YAAY;AAC9C,IAAI,IAAI,CAAC,MAAM,CAAC,wBAAwB,EAAE,CAAC;AAC3C,GAAG,CAAC;AACJ;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,UAAU,OAAO,EAAE,IAAI,EAAE;AAChD,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC7C,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,UAAU,oBAAoB,EAAE;AACnD,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;AAChD,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,YAAY;AAC1B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,IAAI,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC/D,IAAI,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACjE,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,YAAY;AAC5B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;AACzB,IAAI,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAChE,IAAI,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAChE,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,OAAO,GAAG,YAAY;AAC7B,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;AACjC,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,UAAU,IAAI,EAAE;AAChC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,GAAG,CAAC;AACJ,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,MAAM;AAC9C,EAAE,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AAC7D,EAAE,WAAW,CAAC,gBAAgB;AAC9B,IAAI,YAAY,EAAE,UAAU,CAAC,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACpE;AACA;AACA,EAAE,IAAI,YAAY,GAAG,EAAE,CAAC;AACxB;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;AACvB;AACA,IAAI,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AACpD,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC9B,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACxC,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,KAAK,GAAG,YAAY;AACnC,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;AACxB,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;AACvB,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,UAAU,UAAU,EAAE;AAC5C,IAAI,WAAW,CAAC,GAAG;AACnB,MAAM,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;AACvB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,mBAAmB,GAAG,YAAY;AACjD,IAAI,OAAO,WAAW,CAAC,WAAW,CAAC;AACnC,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,gBAAgB,GAAG,YAAY;AAC9C,IAAI,OAAO,WAAW,CAAC,QAAQ,CAAC;AAChC,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,oBAAoB,GAAG,YAAY;AAClD,IAAI,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAClE,IAAI,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACpE,IAAI,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC1E,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,SAAS,GAAG,UAAU,oBAAoB,EAAE;AAC3D,IAAI,WAAW,CAAC,MAAM,GAAG,oBAAoB,GAAG,kBAAkB;AAClE,MAAM,oBAAoB,GAAG,kBAAkB,GAAG,CAAC,CAAC;AACpD,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACtD,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAC;AACjD,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,oBAAoB,GAAG,IAAI,CAAC;AACrD,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;AAC7B,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,MAAM,GAAG,YAAY;AACpC,IAAI,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC;AAC9B,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,OAAO,GAAG,YAAY;AACrC,IAAI,OAAO,WAAW,CAAC,KAAK,CAAC;AAC7B,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,MAAM,GAAG,UAAU,IAAI,EAAE;AACxC,IAAI,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC;AACnC,GAAG,CAAC;AACJ;AACA,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;AACnD;AACA,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,GAAG,kBAAkB,CAAC,CAAC;AAC1E;AACA,EAAE,UAAU,CAAC,oBAAoB,EAAE,CAAC;AACpC;AACA,EAAE,IAAI,UAAU,CAAC,gBAAgB,GAAG,CAAC,EAAE;AACvC,IAAI,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AACpC,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACrD;AACA,EAAE,UAAU,CAAC,sBAAsB,CAAC,gBAAgB;AACpD,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,kBAAkB;AAC3D,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;AACjF,MAAM,IAAI,CAAC,OAAO,EAAE;AACpB,QAAQ,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC;AACpC,QAAQ,UAAU,CAAC,aAAa,GAAG,KAAK,CAAC;AACzC,QAAQ,UAAU,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AACjD,QAAQ,OAAO;AACf,OAAO;AACP;AACA,MAAM,IAAI,KAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;AAC5C,MAAM,IAAI,CAAC,KAAK,EAAE;AAClB,QAAQ,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC;AACpC,QAAQ,UAAU,CAAC,aAAa,GAAG,KAAK,CAAC;AACzC,QAAQ,UAAU,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AACjD,QAAQ,OAAO;AACf,OAAO;AACP;AACA,MAAM,UAAU,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;AACzC;AACA,MAAM,IAAI,UAAU,CAAC,SAAS,EAAE;AAChC,QAAQ,UAAU,CAAC,aAAa,IAAI,UAAU,CAAC,SAAS,CAAC,UAAU;AACnE,UAAU,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAC7C,OAAO,MAAM;AACb,QAAQ,UAAU,CAAC,aAAa,GAAG,KAAK,CAAC;AACzC,OAAO;AACP;AACA,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,YAAY,CAAC,OAAO,IAAI,UAAU,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO,EAAE;AACxG,QAAQ,UAAU,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AACjD,OAAO;AACP;AACA,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC;AACnC,MAAM,UAAU,CAAC,eAAe,EAAE,CAAC;AACnC;AACA,MAAM,UAAU,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AAC/C,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;AACtB,GAAG,CAAC;AACJ;AACA,EAAE,UAAU,CAAC,sBAAsB,CAAC,gBAAgB;AACpD,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,gBAAgB;AACzD,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAChD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;AACtB,GAAG,CAAC;AACJ;AACA,EAAE,UAAU,CAAC,sBAAsB,CAAC,gBAAgB;AACpD,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,iBAAiB;AAC1D,IAAI,YAAY;AAChB,MAAM,IAAI,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE;AAC5C,QAAQ,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;AACzC,OAAO,MAAM,IAAI,UAAU,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO,EAAE;AAClE;AACA;AACA;AACA,QAAQ,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AACxC,OAAO;AACP,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;AACtB,GAAG,CAAC;AACJ;AACA,EAAE,UAAU,CAAC,sBAAsB,CAAC,gBAAgB;AACpD,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,gBAAgB;AACzD,IAAI,YAAY;AAChB,MAAM,IAAI,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE;AAC3C,QAAQ,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AACxC,OAAO,MAAM;AACb,QAAQ,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;AAC1C,OAAO;AACP,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;AACtB,GAAG,CAAC;AACJ;AACA,EAAE,UAAU,CAAC,sBAAsB,CAAC,gBAAgB;AACpD,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,oBAAoB;AAC7D,IAAI,YAAY;AAChB,MAAM,IAAI,SAAS,GAAG,UAAU,CAAC,YAAY,CAAC,WAAW,GAAG,kBAAkB,CAAC;AAC/E,MAAM,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACxD,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;AACxC,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;AAC5C,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;AACtB,GAAG,CAAC;AACJ;AACA,EAAE,UAAU,CAAC,sBAAsB,CAAC,gBAAgB;AACpD,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,wBAAwB;AACjE,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7C,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;AACtB,GAAG,CAAC;AACJ;AACA,EAAE,UAAU,CAAC,sBAAsB,CAAC,gBAAgB;AACpD,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,sBAAsB;AAC/D,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,UAAU,CAAC,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACrD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;AACtB,GAAG,CAAC;AACJ;AACA,EAAE,UAAU,CAAC,sBAAsB,CAAC,gBAAgB;AACpD,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,+BAA+B;AACxE,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,UAAU,CAAC,6BAA6B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC5D,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;AACtB,GAAG,CAAC;AACJ;AACA,EAAE,UAAU,CAAC,sBAAsB,CAAC,gBAAgB;AACpD,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,qBAAqB;AAC9D,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,UAAU,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACnD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;AACtB,GAAG,CAAC;AACJ;AACA,EAAE,UAAU,CAAC,sBAAsB,CAAC,gBAAgB;AACpD,IAAI,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,2BAA2B;AACpE,IAAI,UAAU,KAAK,EAAE;AACrB,MAAM,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AACjD,MAAM,UAAU,CAAC,iBAAiB,GAAG,KAAK,CAAC,KAAK,CAAC;AACjD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;AACtB,GAAG,CAAC;AACJ;AACA;AACA;AACA;AACA,EAAE,IAAI,YAAY,GAAG,EAAE,CAAC;AACxB;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,IAAI,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE;AAC1C,MAAM,UAAU,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC;AACtD,KAAK;AACL;AACA,IAAI,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AACpD,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;AAC1B,IAAI,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AAC/D,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,KAAK,GAAG,YAAY;AACnC,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE;AAC3C,MAAM,UAAU,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC;AACtD,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,UAAU,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;AAC7C,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,UAAU,UAAU,EAAE;AAC5C,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACxE,IAAI,IAAI,SAAS,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS;AACnD,QAAQ,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AACnE;AACA,IAAI,SAAS,CAAC,QAAQ,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC;AACtE,IAAI,SAAS,CAAC,QAAQ,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC;AAC7E,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;AACvE,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG;AAChC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC9E;AACA,IAAI,IAAI,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AAC/D,IAAI,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI;AACvC,QAAQ,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;AAC1D,QAAQ,UAAU,SAAS,EAAE;AAC7B,YAAY,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC;AAClD,YAAY,OAAO,CAAC,GAAG,CAAC,2BAA2B;AACnD,gBAAgB,UAAU,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;AACvD,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC5B,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,aAAa,GAAG,UAAU,UAAU,EAAE;AACrD,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;AAC/E,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,KAAK,CAAC;AAC/B;AACA,IAAI,IAAI,KAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;AAC1C,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC;AAC7B;AACA,IAAI,IAAI,KAAK,CAAC,WAAW,IAAI,YAAY,CAAC,IAAI,EAAE;AAChD,MAAM,OAAO,KAAK,CAAC;AACnB,KAAK;AACL;AACA;AACA,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA;AACA;AACA;AACA;AACA,EAAE,YAAY,CAAC,mBAAmB,GAAG,YAAY;AACjD,IAAI,IAAI,UAAU,CAAC,aAAa,IAAI,UAAU,CAAC,SAAS,CAAC,QAAQ;AACjE,MAAM,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,EAAE;AAC7D,MAAM,OAAO,UAAU,CAAC,YAAY,CAAC,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;AACzG,KAAK,MAAM;AACX;AACA,MAAM,OAAO,UAAU,CAAC,YAAY,CAAC,WAAW,CAAC;AACjD,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA;AACA;AACA;AACA;AACA,EAAE,YAAY,CAAC,gBAAgB,GAAG,YAAY;AAC9C,IAAI,IAAI,UAAU,CAAC,aAAa,EAAE;AAClC;AACA,MAAM,IAAI,UAAU,CAAC,SAAS,CAAC,QAAQ,IAAI,SAAS;AACpD,QAAQ,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,IAAI,SAAS;AAClE,QAAQ,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,IAAI,SAAS,EAAE;AAC5E,QAAQ,OAAO,IAAI,CAAC;AACpB,OAAO;AACP;AACA,MAAM,OAAO,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC;AAC3D,KAAK,MAAM;AACX,MAAM,OAAO,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC;AAC9C,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,aAAa,GAAG,YAAY;AAC3C,IAAI,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;AACnF,IAAI,IAAI,WAAW,IAAI,WAAW,CAAC,eAAe,EAAE,IAAI,WAAW,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE;AAC7F,MAAM,IAAI,KAAK,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;AAChD,MAAM,IAAI,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;AAClC;AACA;AACA,MAAM,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AACtD,MAAM,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM;AACzD,QAAQ,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9C,QAAQ,EAAE,CAAC,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAClD,OAAO;AACP;AACA;AACA,MAAM,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACrE,MAAM,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACvE,MAAM,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC7E;AACA,MAAM,IAAI,UAAU,GAAG,EAAE,CAAC;AAC1B,MAAM,IAAI,iBAAiB,GAAG,EAAE,CAAC;AACjC,MAAM,IAAI,aAAa,GAAG,EAAE,CAAC;AAC7B;AACA,MAAM,IAAI,SAAS,CAAC,QAAQ,EAAE;AAC9B,QAAQ,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC9C,QAAQ,iBAAiB,GAAG,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC;AAC5D;AACA,QAAQ,UAAU,GAAG,iBAAiB,GAAG,UAAU,GAAG,IAAI,GAAG,iBAAiB,GAAG,UAAU,CAAC;AAC5F;AACA,QAAQ,UAAU,GAAG,CAAC,UAAU,IAAI,UAAU,GAAG,GAAG,GAAG,EAAE,CAAC;AAC1D,QAAQ,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACpD,QAAQ,aAAa,GAAG,CAAC,aAAa,IAAI,aAAa,GAAG,GAAG,GAAG,EAAE,CAAC;AACnE,OAAO;AACP;AACA,MAAM,IAAI,SAAS,EAAE;AACrB,QAAQ,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;AACxD,UAAU,CAAC,WAAW,GAAG,eAAe,GAAG,eAAe,IAAI,KAAK,CAAC,WAAW,GAAG,gBAAgB,CAAC;AACnG;AACA;AACA,QAAQ,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS,IAAI,WAAW,GAAG,cAAc,GAAG,cAAc,CAAC,CAAC;AAC3G,QAAQ,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC;AACjE,OAAO,MAAM;AACb,QAAQ,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;AACxD,UAAU,UAAU,GAAG,KAAK,CAAC,WAAW,GAAG,MAAM;AACjD,UAAU,WAAW,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC;AACnD;AACA;AACA,QAAQ,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC;AACtE,QAAQ,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS,GAAG,aAAa,CAAC;AAC5E,OAAO;AACP;AACA;AACA,MAAM,IAAI,SAAS,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE;AACrE,QAAQ,UAAU,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;AAC/D;AACA,QAAQ,IAAI,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACvE,QAAQ,cAAc,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC/C;AACA;AACA;AACA,QAAQ,IAAI,UAAU,CAAC,iBAAiB,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,qBAAqB,CAAC,EAAE;AAC7I,UAAU,cAAc,CAAC,GAAG,GAAG,sCAAsC,CAAC;AACtE,SAAS,MAAM;AACf,UAAU,cAAc,CAAC,GAAG,GAAG,wCAAwC,CAAC;AACxE,SAAS;AACT,OAAO,MAAM;AACb,QAAQ,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACzE,OAAO;AACP,KAAK,MAAM;AACX;AACA,MAAM,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACpE,MAAM,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACtE,MAAM,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC5E;AACA;AACA,MAAM,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC;AAC5D,MAAM,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC;AAC/D,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,wBAAwB,GAAG,YAAY;AACtD,IAAI,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC,CAAC;AACnI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,aAAa,GAAG,UAAU,OAAO,EAAE,IAAI,EAAE;AACxD,IAAI,IAAI,iBAAiB,GAAG,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;AAChE;AACA,IAAI,IAAI,UAAU,CAAC,aAAa,EAAE;AAClC,MAAM,IAAI,iBAAiB,IAAI,IAAI,EAAE;AACrC,QAAQ,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvC,QAAQ,OAAO;AACf,OAAO;AACP;AACA;AACA,MAAM,IAAI,UAAU,CAAC,SAAS,CAAC,QAAQ,IAAI,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,wBAAwB,KAAK,SAAS,EAAE;AACjH,QAAQ,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvC,QAAQ,OAAO,CAAC,SAAS,GAAG,UAAU,CAAC,kBAAkB,CAAC,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;AACzH,OAAO,MAAM;AACb;AACA,QAAQ,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvC,QAAQ,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAC;AAC9C,OAAO;AACP,KAAK,MAAM;AACX,MAAM,IAAI,iBAAiB,KAAK,IAAI,EAAE;AACtC,QAAQ,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvC,QAAQ,OAAO,CAAC,SAAS,GAAG,iBAAiB,CAAC;AAC9C,OAAO,MAAM;AACb,QAAQ,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACvC,OAAO;AACP,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,SAAS,GAAG,UAAU,oBAAoB,EAAE;AAC3D,IAAI,IAAI,aAAa,GAAG,UAAU,CAAC,YAAY,CAAC,WAAW,CAAC;AAC5D,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACtD,IAAI,IAAI,oBAAoB,GAAG,kBAAkB,EAAE;AACnD,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAC;AACnD,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,oBAAoB,GAAG,IAAI,CAAC;AACvD,MAAM,aAAa,GAAG,oBAAoB,GAAG,kBAAkB,CAAC;AAChE,KAAK,MAAM;AACX,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,KAAK;AACL,IAAI,UAAU,CAAC,YAAY,CAAC,WAAW,GAAG,aAAa,CAAC;AACxD,IAAI,UAAU,CAAC,sBAAsB,CAAC,cAAc,EAAE,CAAC;AACvD,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE;AAC1C,MAAM,UAAU,CAAC,sBAAsB,CAAC,YAAY,EAAE,CAAC;AACvD,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,MAAM,GAAG,YAAY;AACpC,IAAI,IAAI,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE;AACzC,MAAM,UAAU,CAAC,sBAAsB,CAAC,YAAY,EAAE,CAAC;AACvD,KAAK;AACL,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,OAAO,GAAG,YAAY;AACrC,IAAI,OAAO,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC;AAC3C,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,MAAM,GAAG,UAAU,IAAI,EAAE;AACxC,IAAI,UAAU,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC;AAC/C,IAAI,UAAU,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;AAC7C,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;AACnD;AACA;AACA,EAAE,IAAI,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE;AACvC,IAAI,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AACpC,GAAG;AACH,EAAE,UAAU,CAAC,iBAAiB,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AAChE;AACA,EAAE,IAAI,aAAa,GAAG,UAAU,CAAC,YAAY,CAAC,WAAW,GAAG,kBAAkB,CAAC;AAC/E,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACpD,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,aAAa,GAAG,IAAI,CAAC;AACxC,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC;AAC5C;AACA;AACA,EAAE,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;AAC/D;AACA,EAAE,UAAU,CAAC,oBAAoB,EAAE,CAAC;AACpC;AACA;AACA;AACA,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC,eAAe,EAAE;AACpF,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,eAAe,EAAE;AACjD,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AACpC,IAAI,UAAU,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AAC7C;AACA;AACA;AACA,IAAI,UAAU,CAAC,eAAe,EAAE,CAAC;AACjC,IAAI,UAAU,CAAC,eAAe,EAAE,CAAC;AACjC,GAAG,MAAM;AACT,IAAI,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AACpC,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY;AACxD,EAAE,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AAC7D,EAAE,WAAW,CAAC,WAAW,GAAG,UAAU,CAAC,gBAAgB,CAAC;AACxD;AACA,EAAE,UAAU,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AAC3C,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,UAAU,EAAE;AACzD,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,UAAU,CAAC,CAAC;AACrD;AACA,EAAE,UAAU,CAAC,iBAAiB,GAAG,UAAU,CAAC;AAC5C;AACA,EAAE,UAAU,CAAC,aAAa,CAAC,gBAAgB,GAAG,SAAS,CAAC;AACxD;AACA;AACA,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AAClD,EAAE,EAAE,CAAC,GAAG,GAAG,iBAAiB,GAAG,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;AAC7E;AACA;AACA,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzD,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;AAC9B,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACrD,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAC/B;AACA,EAAE,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACnE,EAAE,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzE,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,kBAAkB,CAAC;AACnD,EAAE,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AACzC;AACA;AACA,EAAE,UAAU,CAAC,iBAAiB,EAAE,CAAC;AACjC,EAAE,UAAU,CAAC,gBAAgB,GAAG,CAAC,CAAC;AAClC,EAAE,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;AACpF,EAAE,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AACjF;AACA,EAAE,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AAC7C,EAAE,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAClC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,KAAK,EAAE;AAClD,EAAE,IAAI,UAAU,CAAC,aAAa,IAAI,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;AAC9I,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AACxC,IAAI,OAAO;AACX,GAAG;AACH;AACA,EAAE,IAAI,UAAU,CAAC,aAAa,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE;AACjE,IAAI,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAC;AACtD,IAAI,OAAO;AACX,GAAG;AACH;AACA,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC7C,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzD,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACrD,EAAE,IAAI,QAAQ,GAAG,CAAC,CAAC;AACnB,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AACb,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AACb,EAAE,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,IAAI,oBAAoB,EAAE;AACtD,IAAI,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,gBAAgB,GAAG,UAAU,CAAC,aAAa,GAAG,QAAQ;AACzF,MAAM,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAC9B,IAAI,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC;AACtD,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC;AACvD,GAAG,MAAM;AACT,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,GAAG,UAAU,CAAC,aAAa,GAAG,kBAAkB,EAAE,EAAE,CAAC,CAAC;AACtF,IAAI,EAAE,GAAG,QAAQ,CAAC;AAClB,IAAI,EAAE,GAAG,QAAQ,CAAC;AAClB,GAAG;AACH;AACA,EAAE,IAAI,UAAU,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO;AACrD,IAAI,UAAU,CAAC,WAAW,KAAK,YAAY,CAAC,MAAM,EAAE;AACpD,IAAI,UAAU,CAAC,gBAAgB,GAAG,QAAQ,CAAC;AAC3C,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC;AACrC,IAAI,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC;AACpC,GAAG;AACH;AACA,EAAE,IAAI,UAAU,CAAC,aAAa,EAAE;AAChC,IAAI,QAAQ,IAAI,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;AACtE,GAAG;AACH;AACA,EAAE,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC5C,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,UAAU,EAAE;AACvD,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACpD,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AACd,EAAE,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,KAAK,gBAAgB,EAAE;AACxD,IAAI,GAAG,GAAG,kBAAkB,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAChE,GAAG,MAAM;AACT,IAAI,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1E,GAAG;AACH,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,YAAY;AACtD,EAAE,UAAU,CAAC,iBAAiB,EAAE,CAAC;AACjC;AACA;AACA,EAAE,UAAU,CAAC,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,yBAAyB,EAAE,UAAU,CAAC,CAAC;AACnF,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACrD,EAAE,IAAI,UAAU,CAAC,KAAK,EAAE;AACxB,IAAI,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACpC,IAAI,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC;AAC5B,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,YAAY;AACtD;AACA,EAAE,UAAU,CAAC,gBAAgB,GAAG,UAAU,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC;AAC/E,EAAE,UAAU,CAAC,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;AACzE;AACA,EAAE,UAAU,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;AACnD;AACA,EAAE,IAAI,UAAU,CAAC,aAAa,IAAI,IAAI,IAAI,UAAU,CAAC,gBAAgB,GAAG,UAAU,CAAC,aAAa,IAAI,UAAU,CAAC,aAAa,EAAE;AAC9H,IAAI,UAAU,CAAC,aAAa,CAAC,wBAAwB,EAAE,CAAC;AACxD,IAAI,UAAU,CAAC,wBAAwB,EAAE,CAAC;AAC1C,GAAG,MAAM,IAAI,UAAU,CAAC,aAAa,GAAG,CAAC,EAAE;AAC3C,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;AAC7B,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,wBAAwB,GAAG,YAAY;AAC5D,EAAE,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACxD,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzD;AACA;AACA,EAAE,IAAI,UAAU,CAAC,aAAa,IAAI,IAAI,EAAE;AACxC,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE;AACnC,MAAM,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;AACvE,KAAK;AACL;AACA,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AACpC;AACA,IAAI,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC/C,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;AAClD,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAClC,KAAK;AACL;AACA,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC9B;AACA,IAAI,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACrE,IAAI,IAAI,eAAe,IAAI,eAAe,CAAC,KAAK,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK;AAC/E,MAAM,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAC1C;AACA,IAAI,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AAC3E,IAAI,IAAI,kBAAkB,IAAI,kBAAkB,CAAC,KAAK,IAAI,kBAAkB,CAAC,KAAK,CAAC,KAAK;AACxF,MAAM,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAC7C;AACA,IAAI,OAAO;AACX,GAAG,MAAM;AACT,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;AAC1B,GAAG;AACH;AACA,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE;AACpD,IAAI,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AACpC,GAAG;AACH;AACA;AACA;AACA,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,UAAU,CAAC,gBAAgB,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;AACnG,EAAE,IAAI,EAAE,GAAG,kBAAkB,EAAE;AAC/B,IAAI,EAAE,GAAG,kBAAkB,CAAC;AAC5B,GAAG,MAAM,IAAI,EAAE,GAAG,CAAC,EAAE;AACrB,IAAI,EAAE,GAAG,CAAC,CAAC;AACX,GAAG;AACH;AACA,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC;AACtC,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC;AAClC;AACA,EAAE,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACnE,EAAE,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzE,EAAE,IAAI,UAAU,CAAC,aAAa,EAAE;AAChC,IAAI,IAAI,UAAU,CAAC,iBAAiB,EAAE;AACtC;AACA,MAAM,IAAI,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,EAAE,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC;AACnI,QAAQ,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;AAC9D,MAAM,IAAI,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,qBAAqB,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;AAC5G,MAAM,IAAI,aAAa,GAAG,kBAAkB,EAAE;AAC9C,QAAQ,aAAa,GAAG,kBAAkB,CAAC;AAC3C,OAAO,MAAM,IAAI,aAAa,GAAG,CAAC,EAAE;AACpC,QAAQ,aAAa,GAAG,CAAC,CAAC;AAC1B,OAAO;AACP,MAAM,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,aAAa,GAAG,IAAI,CAAC;AACzD;AACA,MAAM,IAAI,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC;AACvI,QAAQ,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;AAC9D,MAAM,IAAI,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,GAAG,uBAAuB,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;AAChH,MAAM,IAAI,eAAe,GAAG,kBAAkB,EAAE;AAChD,QAAQ,eAAe,GAAG,kBAAkB,CAAC;AAC7C,OAAO,MAAM,IAAI,eAAe,GAAG,CAAC,EAAE;AACtC,QAAQ,eAAe,GAAG,CAAC,CAAC;AAC5B,OAAO;AACP,MAAM,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,eAAe,GAAG,IAAI,CAAC;AAC9D,KAAK,MAAM;AACX;AACA,MAAM,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAC1C,MAAM,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,kBAAkB,GAAG,IAAI,CAAC;AACjE,KAAK;AACL,GAAG,MAAM;AACT;AACA,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,kBAAkB,GAAG,IAAI,CAAC;AAC5D,IAAI,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAC3C,GAAG;AACH;AACA,EAAE,IAAI,EAAE,IAAI,kBAAkB,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE;AAC7D,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;AAC7B,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,WAAW,GAAG,YAAY;AAC/C,EAAE,UAAU,CAAC,gBAAgB,GAAG,CAAC,CAAC;AAClC,EAAE,UAAU,CAAC,iBAAiB,EAAE,CAAC;AACjC,EAAE,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AAC7C,EAAE,UAAU,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AAC3C;AACA,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC7C,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO;AACxC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACjC;AACA,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AAC/C,EAAE,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO;AACjD,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACjC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,SAAS,EAAE;AAC/D,EAAE,IAAI,SAAS,IAAI,SAAS,IAAI,SAAS,IAAI,IAAI,EAAE;AACnD,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG;AACH;AACA,EAAE,IAAI,UAAU,GAAG,KAAK,CAAC;AACzB,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE;AACrB,IAAI,UAAU,GAAG,IAAI,CAAC;AACtB,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC;AACpB,GAAG;AACH;AACA,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;AAC3C,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9D,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;AACxE;AACA,EAAE,IAAI,KAAK,GAAG,EAAE,EAAE,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC;AACtC,EAAE,IAAI,OAAO,GAAG,EAAE,EAAE,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;AAC5C,EAAE,IAAI,OAAO,GAAG,EAAE,EAAE,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;AAC5C;AACA,EAAE,OAAO,CAAC,UAAU,GAAG,GAAG,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;AACzE,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,SAAS,EAAE;AAC/D,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,SAAS,CAAC;AACnC;AACA,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;AACxC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC9B,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AAClC,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AAClC,EAAE,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACvC,EAAE,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;AACrB;AACA,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;AAC7B,EAAE,OAAO,GAAG,CAAC,GAAG,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,EAAE,OAAO,GAAG,CAAC,GAAG,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,EAAE,IAAI,SAAS,GAAG,KAAK,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC;AACrE,EAAE,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,eAAe,GAAG,YAAY;AACnD,EAAE,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;AACjF,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO;AAC3B;AACA,EAAE,IAAI,KAAK,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;AAC5C,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO;AACrB;AACA,EAAE,IAAI,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;AAC9B,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO;AACzB;AACA,EAAE,IAAI,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;AAChC,EAAE,IAAI,eAAe,GAAG,SAAS,CAAC,QAAQ,CAAC;AAC3C;AACA,EAAE,IAAI,CAAC,MAAM,EAAE;AACf,IAAI,OAAO;AACX,GAAG;AACH;AACA,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,IAAI,IAAI,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAC5B;AACA;AACA;AACA,IAAI,IAAI,OAAO,CAAC,QAAQ,GAAG,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE;AAClE,MAAM,SAAS;AACf,KAAK;AACL;AACA;AACA,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC3D,MAAM,IAAI,GAAG,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAC;AACnD,MAAM,GAAG,CAAC,SAAS,IAAI,8BAA8B,GAAG,OAAO,CAAC,QAAQ;AACxE,QAAQ,wBAAwB;AAChC,QAAQ,UAAU,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,GAAG,YAAY,CAAC;AACxF,KAAK;AACL,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,eAAe,GAAG,YAAY;AACnD,EAAE,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,UAAU,QAAQ,EAAE;AACrE,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;AACtB,GAAG,CAAC,CAAC;AACL,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,QAAQ,EAAE,eAAe,EAAE;AAC/E;AACA,EAAE,IAAI,QAAQ,IAAI,CAAC,CAAC,EAAE;AACtB,IAAI,OAAO,kBAAkB,CAAC;AAC9B,GAAG;AACH;AACA;AACA;AACA,EAAE,IAAI,QAAQ,GAAG,eAAe,EAAE;AAClC,IAAI,OAAO,kBAAkB,CAAC;AAC9B,GAAG;AACH;AACA;AACA,EAAE,OAAO,CAAC,kBAAkB,GAAG,QAAQ,IAAI,eAAe,CAAC;AAC3D,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY;AACxD;AACA,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC7C,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;AAC9C,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAChC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,cAAc,GAAG,UAAU,cAAc,EAAE;AAChE,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,cAAc,CAAC,CAAC;AAChD,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,sBAAsB,GAAG,UAAU,aAAa,EAAE;AACvE,EAAE,UAAU,CAAC,aAAa,GAAG,aAAa,CAAC;AAC3C,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,6BAA6B,GAAG,UAAU,oBAAoB,EAAE;AACrF,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC7C;AACA;AACA,EAAE,IAAI,UAAU,CAAC,aAAa,IAAI,SAAS,IAAI,UAAU,CAAC,aAAa,GAAG,CAAC,EAAE;AAC7E;AACA,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;AAChD,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAClC,GAAG;AACH;AACA,OAAO,IAAI,UAAU,CAAC,aAAa,KAAK,SAAS,IAAI,oBAAoB,IAAI,UAAU,CAAC,aAAa,EAAE;AACvG;AACA,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;AAChD,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACnC,GAAG;AACH;AACA,OAAO;AACP;AACA,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;AAChD,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAClC,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;AAC1C,EAAE,UAAU,CAAC,sBAAsB,CAAC,MAAM,EAAE,CAAC;AAC7C,EAAC;AACD;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,UAAU,MAAM,EAAE;AAC3D,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACrD,EAAE,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzE,EAAE,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACnE;AACA,EAAE,IAAI,MAAM,EAAE;AACd;AACA,IAAI,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,qDAAqD,CAAC;AAC3F,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AACtC,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AAC7C,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AAChD,IAAI,kBAAkB,CAAC,SAAS,GAAG,IAAI,CAAC;AACxC;AACA;AACA,IAAI,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACrE,IAAI,eAAe,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;AAC5E,IAAI,kBAAkB,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACjF,GAAG,MAAM;AACT;AACA,IAAI,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,mDAAmD,CAAC;AACzF,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AACtC,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AAC7C,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AAChD,IAAI,kBAAkB,CAAC,SAAS,GAAG,KAAK,CAAC;AACzC;AACA;AACA,IAAI,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACxE,IAAI,eAAe,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;AAC/E,IAAI,kBAAkB,CAAC,mBAAmB,CAAC,SAAS,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACpF,GAAG;AACH,EAAC;AACD;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACrD;AACA,EAAE,IAAI,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AACzD,EAAE,IAAI,aAAa;AACnB,IAAI,OAAO,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAAC;AACvE;AACA,EAAE,IAAI,aAAa,EAAE;AACrB;AACA,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAChC,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AACxC,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD;AACA,EAAE,IAAI,aAAa;AACnB,IAAI,QAAQ,CAAC,kBAAkB,CAAC,IAAI,QAAQ,CAAC,wBAAwB,CAAC,CAAC;AACvE;AACA,EAAE,IAAI,aAAa,EAAE;AACrB,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACjC,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,uBAAuB,GAAG,YAAY;AAC3D,EAAE,UAAU,CAAC,UAAU,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AACjD,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY;AACxD,EAAE,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;AACvE,EAAE,IAAI,mBAAmB,GAAG,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;AAC3E;AACA,EAAE,IAAI,UAAU,CAAC,UAAU,EAAE;AAC7B,IAAI,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO;AACvF,MAAM,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC/C;AACA,IAAI,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO;AAC7F,MAAM,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAClD,GAAG,MAAM;AACT,IAAI,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO;AACvF,MAAM,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAChD;AACA,IAAI,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO;AAC7F,MAAM,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACjD,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY;AACxD,EAAE,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;AACvE,EAAE,IAAI,mBAAmB,GAAG,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;AAC3E;AACA,EAAE,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO;AACrF,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC7C;AACA,EAAE,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO;AAC3F,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC/C,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD,EAAE,IAAI,aAAa,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AAC/D,EAAE,IAAI,aAAa,IAAI,aAAa,CAAC,KAAK,IAAI,aAAa,CAAC,OAAO;AACnE,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;AACtC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD,EAAE,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE;AACnC,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;AAC3D,IAAI,IAAI,OAAO,IAAI,OAAO,CAAC,iBAAiB,EAAE,EAAE;AAChD;AACA,MAAM,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;AACnE,KAAK,MAAM;AACX,MAAM,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AACjE,KAAK;AACL,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE;AAC3C,IAAI,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAC1D,IAAI,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAChE,IAAI,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAChE,IAAI,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AACjE,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AACxD,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAC/D,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACrD,EAAE,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC;AACjF,EAAE,IAAI,yBAAyB,GAAG,cAAc,GAAG,iBAAiB,CAAC;AACrE,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,MAAM;AACxD,IAAI,yBAAyB,GAAG,IAAI,CAAC;AACrC,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC9D,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,YAAY,GAAG,MAAM;AAC1C;AACA,EAAE,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;AAClD,IAAI,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACzC,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS;AACrD,IAAI,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,UAAU,CAAC,CAAC;AACvE,EAAE,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,SAAS;AACjD,IAAI,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,aAAa,CAAC,CAAC;AAC1E;AACA;AACA,EAAE,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,gBAAgB;AACzD,IAAI,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACpD,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACpD,EAAE,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,gBAAgB;AAChE,IAAI,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACtD,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;AAC3E,EAAE,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,gBAAgB;AACvD,IAAI,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;AAC7E,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB;AAC5D,IAAI,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB;AAC5D,IAAI,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB;AAC5D,IAAI,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACpD,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB;AAC5D,IAAI,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACpD,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,UAAU,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,UAAU,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,gBAAgB;AACxD,IAAI,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,EAAE,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,gBAAgB;AACxD,IAAI,UAAU,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,gBAAgB;AAC3D,IAAI,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,EAAE,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,gBAAgB;AAC3D,IAAI,UAAU,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,gBAAgB;AAC/D,IAAI,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC5D,EAAE,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,gBAAgB;AACjE,IAAI,OAAO,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC3D,EAAE,QAAQ,CAAC,gBAAgB;AAC3B,IAAI,kBAAkB,EAAE,UAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;AACpF,EAAE,QAAQ,CAAC,gBAAgB;AAC3B,IAAI,wBAAwB,EAAE,UAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;AAC1F;AACA;AACA,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,gBAAgB;AAClD,IAAI,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;AAC3E,EAAE,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,gBAAgB;AACnD,IAAI,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;AAC5E,EAAE,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;AACjE,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,cAAc,GAAG,YAAY;AAClD,EAAE,IAAI,OAAO,UAAU,CAAC,SAAS,KAAK,WAAW,IAAI,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1I,IAAI,UAAU,CAAC,aAAa,GAAG,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC/E,IAAI,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACjD,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC;AACtB,IAAI,IAAI,SAAS,GAAG,IAAI,CAAC;AACzB,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC9D,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAC7C,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC;AACtC,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAC3C,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5C,MAAM,MAAM,CAAC,SAAS;AACtB,QAAQ,YAAY,GAAG,iBAAiB,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC/E,QAAQ,sBAAsB,CAAC;AAC/B,MAAM,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7E,MAAM,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAC7B,KAAK;AACL,GAAG;AACH,CAAC,CAAC;AACF;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,MAAM;AAC9C,EAAE,IAAI,OAAO,UAAU,CAAC,SAAS,KAAK,WAAW,IAAI,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1I,IAAI,UAAU,CAAC,aAAa,GAAG,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC/E,IAAI,OAAO,UAAU,CAAC,aAAa,CAAC;AACpC,GAAG,MAAM;AACT,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,eAAe,GAAG,UAAU,KAAK,EAAE;AAC9C,EAAE,QAAQ,KAAK,CAAC,IAAI;AACpB,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB;AAClD,MAAM,OAAO,6BAA6B;AAC1C,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM;AACrC,MAAM,OAAO,wCAAwC;AACrD,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa;AAC5C,MAAM,OAAO,6CAA6C;AAC1D,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB;AAChD,MAAM,OAAO,sCAAsC;AACnD,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB;AAChD,MAAM,OAAO,iDAAiD;AAC9D,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB;AACnD,MAAM,OAAO,sDAAsD;AACnE,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa;AAC5C,MAAM,OAAO,2DAA2D;AACxE,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO;AACtC,MAAM,OAAO,0BAA0B;AACvC,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI;AACJ,MAAM,OAAO,KAAK,CAAC;AACnB,GAAG;AACH,CAAC,CAAC;AACF;AACA,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;AAClC,MAAM,CAAC,uBAAuB,CAAC,GAAG,UAAU,WAAW,EAAE;AACzD,EAAE,IAAI,WAAW,EAAE;AACnB,IAAI,UAAU,CAAC,oBAAoB,EAAE,CAAC;AACtC,GAAG;AACH,CAAC,CAAC;AACF;AACA,MAAM,CAAC,UAAU,GAAG,UAAU;;AC3+C9B;;;;;;"} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index 282628c..f78880a 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,3 +1,3 @@ export * from './ng.cast.module'; export * from './shared/ng-cast.service'; -import "/home/thinker/dev/thinkam/ngCast/CastVideos.js"; +import "/home/thinker/dev/thinkam/ngCast/cast-videos.js"; diff --git a/dist/package.json b/dist/package.json index 7308973..5b79390 100644 --- a/dist/package.json +++ b/dist/package.json @@ -1,10 +1,7 @@ { "$schema": "./node_modules/ng-packagr/package.schema.json", "name": "@thinkam.net/ng-cast", - "assets": [ - "./CastVideos.js" - ], - "version": "0.2.7", + "version": "0.2.20", "description": "Broadcast media on your TV from your Angular app", "main": "bundles/thinkam.net-ng-cast.umd.js", "repository": { diff --git a/dist/shared/ng-cast.service.d.ts b/dist/shared/ng-cast.service.d.ts index 7bb378a..8b0b488 100644 --- a/dist/shared/ng-cast.service.d.ts +++ b/dist/shared/ng-cast.service.d.ts @@ -14,7 +14,8 @@ export declare class NgCastService { onInitSuccess: () => void; onError: (err: any) => void; discoverDevices: () => Subject<{}>; - onMediaDiscovered: (categories: any[]) => void; + onMediaDiscovered: (categories: any[]) => any; + initialize(mediaContents: any): void; play: () => void; pause: () => void; stop: () => void; diff --git a/dist/thinkam.net-ng-cast.metadata.json b/dist/thinkam.net-ng-cast.metadata.json index 4ed2ac8..9c1076a 100644 --- a/dist/thinkam.net-ng-cast.metadata.json +++ b/dist/thinkam.net-ng-cast.metadata.json @@ -1 +1 @@ -{"__symbolic":"module","version":4,"metadata":{"NgCastModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":6,"character":1},"arguments":[{"schemas":[{"__symbolic":"reference","module":"@angular/core","name":"CUSTOM_ELEMENTS_SCHEMA","line":7,"character":13}],"imports":[{"__symbolic":"reference","module":"@angular/common","name":"CommonModule","line":9,"character":4}],"exports":[{"__symbolic":"reference","name":"ɵa"}],"providers":[{"__symbolic":"reference","name":"NgCastService"}],"declarations":[{"__symbolic":"reference","name":"ɵa"}]}]}],"members":{}},"NgCastService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":8,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor"}],"initializeCastApi":[{"__symbolic":"method"}],"setCasting":[{"__symbolic":"method"}],"getStatus":[{"__symbolic":"method"}]}},"ɵa":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":4,"character":1},"arguments":[{"selector":"ng-cast","template":"
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n","styles":[""]}]}],"members":{"videoImage":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":15,"character":3}}]}],"imageOffline":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":16,"character":3}}]}],"srcImageOffline":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":17,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"NgCastService"}]}],"ngOnInit":[{"__symbolic":"method"}],"openSession":[{"__symbolic":"method"}],"closeSession":[{"__symbolic":"method"}]}}},"origins":{"NgCastModule":"./ng.cast.module","NgCastService":"./shared/ng-cast.service","ɵa":"./ng-cast.component"},"importAs":"@thinkam.net/ng-cast"} \ No newline at end of file +{"__symbolic":"module","version":4,"metadata":{"NgCastModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":6,"character":1},"arguments":[{"schemas":[{"__symbolic":"reference","module":"@angular/core","name":"CUSTOM_ELEMENTS_SCHEMA","line":7,"character":13}],"imports":[{"__symbolic":"reference","module":"@angular/common","name":"CommonModule","line":9,"character":4}],"exports":[{"__symbolic":"reference","name":"ɵa"}],"providers":[{"__symbolic":"reference","name":"NgCastService"}],"declarations":[{"__symbolic":"reference","name":"ɵa"}]}]}],"members":{}},"NgCastService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":8,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor"}],"initializeCastApi":[{"__symbolic":"method"}],"initialize":[{"__symbolic":"method"}],"setCasting":[{"__symbolic":"method"}],"getStatus":[{"__symbolic":"method"}]}},"ɵa":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":4,"character":1},"arguments":[{"selector":"ng-cast","template":"
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n","styles":["body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:1100px}#video_image{height:536px;margin:20px auto 0 40px;width:960px}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin:0 0 0 40px;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;width:960px}#video_element{background-color:#000;margin:20px auto 0 40px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin:-4px 0 0 40px;opacity:.9;padding:10px;width:940px}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px;width:95%}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;left:8px;margin:-60px 0 0 40px;opacity:.7;padding:0;position:absolute;top:650px;transition:opacity 1s;width:960px;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"]}]}],"members":{"videoImage":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":15,"character":3}}]}],"imageOffline":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":16,"character":3}}]}],"srcImageOffline":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":17,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"NgCastService"}]}],"ngOnInit":[{"__symbolic":"method"}],"openSession":[{"__symbolic":"method"}],"closeSession":[{"__symbolic":"method"}]}}},"origins":{"NgCastModule":"./ng.cast.module","NgCastService":"./shared/ng-cast.service","ɵa":"./ng-cast.component"},"importAs":"@thinkam.net/ng-cast"} \ No newline at end of file diff --git a/index.ts b/index.ts index 1e0b12b..c12cd5e 100644 --- a/index.ts +++ b/index.ts @@ -1,5 +1,5 @@ export * from './ng.cast.module'; export * from './shared/ng-cast.service'; -// ------ project path -------- | --- lib --- -import "/home/thinker/dev/thinkam/ngCast/CastVideos.js"; + // ------ project path -------- | --- lib --- +import "/home/thinker/dev/thinkam/ngCast/cast-videos.js"; diff --git a/ng-cast.component.scss b/ng-cast.component.scss index a418f05..96f2aa0 100644 --- a/ng-cast.component.scss +++ b/ng-cast.component.scss @@ -1 +1,453 @@ -/* Your ng cast custom styles here */ \ No newline at end of file +body { + background-color: #F2F2F2; + font-family: 'Roboto', "OpenSans", "Verdana", Georgia, Serif; +} + +#msg { + font-weight: normal; + font-size: 90%; + margin-left: 200px; + color: #fff; + display: none; + transition: opacity 0 2s; + -webkit-transition: opacity 0 2s; + /* Safari */ +} + +#top_header_bar { + width: 100%; + height: 10px; + background-image: url('/assets/imagefiles/header_bg-top.png'); + background-repeat: repeat-x; + margin: 0px; +} + +#top_header { + float: left; + width: 100%; + height: 71px; + background-image: url('/assets/imagefiles/header_bg.png'); + background-repeat: repeat-x; + margin: 0px; + z-index: 1000; +} + +#footer { + float: left; + width: 100%; + height: 81px; + background-image: url('/assets/imagefiles/footer_bg.png'); + background-repeat: repeat-x; + margin: 0px; +} + +#copyright { + float: left; + width: 300px; + margin: 10px; + font-size: 13px; + color: #fff; +} + +#footer_content { + float: left; + width: 400px; + margin: 10px; + font-size: 13px; + color: #fff; +} + +#footer_content_link { + color: #fff; +} + +#footer_language { + float: right; + width: 200px; + margin: 10px; + font-size: 13px; + color: #fff; +} + +#logo { + float: left; + width: 201px; + height: 71px; + background-image: url('/assets/imagefiles/logo.png'); + margin: 10px 25px 0px 25px; +} + +.header_tab { + float: left; + height: 31px; + margin-top: 10px; + padding: 20px; + font-family: "Roboto", "OpenSans"; + font-weight: bold; + font-size: 20px; + -webkit-transition: all 0.6s ease-in-out; + -moz-transition: all 0.6s ease-in-out; + -o-transition: all 0.6s ease-in-out; +} + +#title_text { + width: 100%; + text-align: center; +} + +#main_video { + float: left; + width: 1100px; +} + +#video_image { + margin-left: 40px; + margin-right: auto; + margin-top: 20px; + margin-bottom: 0px; + width: 960px; + height: 536px; +} + +#video_image_overlay { + margin-left: 40px; + margin-right: 0px; + margin-top: 0px; + margin-bottom: 0px; + width: 960px; + height: 540px; + background: linear-gradient(to top, + rgba(0, 0, 0, 0.9), + rgba(0, 0, 0, 0) 72%, + rgba(0, 0, 0, 0) 100%); + z-index: 0; + position: absolute; + display: none; +} + +#video_element { + display: none; + margin-left: 40px; + margin-right: auto; + margin-top: 20px; + margin-bottom: 0px; + width: 960px; + height: 540px; + background-color: #000; +} + +#media_info { + display: block; + clear: both; + float: left; + width: 940px; + height: 116px; + margin: -4px 0px 0px 40px; + padding: 10px; + opacity: 0.9; + background-color: #DDE0E5; + color: #000; +} + +#media_title { + float: left; + margin: 0px 10px 0px 0px; + padding: 0px; + font-size: 30px; + font-weight: bold; + font-family: 'Roboto', "Open Sans", "Verdana", Georgia, Serif; +} + +#media_subtitle { + float: left; + margin: 13px 0px 0px 30px; + padding: 0px; + font-size: 18px; + font-family: 'Roboto', "Open Sans", "Verdana", Georgia, Serif; +} + +#media_desc { + float: left; + width: 95%; + margin: 5px; + font-size: 12px; + font-family: 'Roboto', "Open Sans", "Verdana", Georgia, Serif; +} + +#media_control { + position: absolute; + left: 8px; + top: 650px; + width: 960px; + height: 60px; + z-index: 1000; + margin: -60px 0px 0px 40px; + padding: 0px; + opacity: 0.7; + background-color: #000; + font-family: 'Roboto', "Open Sans", "Verdana", Georgia, Serif; + transition: opacity 1s; + -webkit-transition: opacity 1s; + /* Safari */ +} + +#media_control:hover { + opacity: 0.7; +} + +#play { + margin: 10px 20px 10px 10px; + float: left; + width: 65px; + height: 40px; + background-image: url('/assets/imagefiles/play.png'); +} + +#play:hover { + background-image: url('/assets/imagefiles/play-hover.png'); +} + +#play:press { + background-image: url('/assets/imagefiles/play-press.png'); +} + +#pause { + display: none; + margin: 10px 20px 10px 10px; + float: left; + width: 65px; + height: 40px; + background-image: url('/assets/imagefiles/pause.png'); +} + +#pause:hover { + background-image: url('/assets/imagefiles/pause-hover.png'); +} + +.button { + margin: 5px; + font-size: 100%; + font-family: 'Roboto', "Open Sans", "Verdana", Georgia, Serif; +} + +.volume { + width: 60px; + margin-left: 8px; +} + +#muteText { + width: 30px; + margin-left: 3px; +} + +.muteButton { + font-size: 110%; + font-family: 'Roboto', "Open Sans", "Verdana", Georgia, Serif; +} + +.imageIcon { + padding: 3px 0px 0px 0px; + width: 25px; +} + +#progress { + margin: 20px 0px 10px -620px; + cursor: pointer; + float: left; + width: 1px; + height: 36px; + z-index: 10; + background-image: url('/assets/imagefiles/timeline_bg_progress.png'); + background-repeat: repeat-x; +} + +#progress_indicator { + cursor: pointer; + margin: 20px 0px 10px -620px; + float: left; + width: 6px; + height: 36px; + z-index: 1000; + background-image: url('/assets/imagefiles/timeline_indicator.png'); + background-repeat: repeat-x; +} + +#progress_bg { + margin: 20px 20px 10px 0px; + cursor: pointer; + float: left; + width: 600px; + height: 36px; + background-image: url('/assets/imagefiles/timeline_bg_track.png'); + background-repeat: repeat-x; +} + +#castbutton { + float: right; + margin: 10px 6px 14px 0px; + width: 40px; + height: 32px; + opacity: 0.7; + background-color: #000; + border: none; + outline: none; +} + +#castbutton:hover { + --disconnected-color: white; + --connected-color: white; +} + +#audio_off { + float: right; + margin:10px 4px 10px 0px; + width: 32px; + height: 32px; + display: none; + background-image: url('/assets/imagefiles/audio_off.png'); +} + +#audio_on { + float: right; + width: 32px; + height: 32px; + margin: 10px 4px 10px 0px; + display: block; + background-image: url('/assets/imagefiles/audio_on.png'); +} + +#audio_bg { + float: right; + opacity: 0.1; + width: 41px; + height: 124px; + margin: -115px 8px -10px 0px; + display: block; + background-image: url('/assets/imagefiles/audio_bg.png'); + position: relative; + z-index: 10; +} + +#audio_bg_track { + float: right; + opacity: 0.0; + width: 16px; + height: 100px; + margin: -100px 20px -30px 0px; + display: block; + background-image: url('/assets/imagefiles/audio_bg_track.png'); + position: relative; + z-index: 1000; +} + +#audio_indicator { + float: right; + opacity: 0.0; + width: 16px; + height: 5px; + margin:-50px 20px -30px 0px; + display: none; + background-image: url('/assets/imagefiles/audio_indicator.png'); + position: relative; + z-index: 1000; +} + +#audio_bg_level { + float: right; + opacity: 0.0; + width: 16px; + height: 50px; + margin: -50px 20px -30px 0px; + display: block; + background-image: url('/assets/imagefiles/audio_bg_level.png'); + position: relative; + z-index: 1000; +} + +#fullscreen_expand { + float:right; + width: 32px; + height: 32px; + margin: 10px 20px 10px 0px; + display: block; + background-image: url('/assets/imagefiles/fullscreen_expand.png'); + cursor: pointer; +} + +#fullscreen_collapse { + float:right; + width: 32px; + height: 32px; + margin: 10px 20px 10px 0px; + display: none; + background-image: url('/assets/imagefiles/fullscreen_collapse.png'); + cursor: pointer; +} + +#duration { + float:right; + color: #fff; + width: 60px; + height: 32px; + margin: 18px 15px 10px 15px; + display: block; +} + +div.imageSub { position: relative; } +div.imageSub img { z-index: 1; } +div.imageSub div { + position: absolute; + left: 0%; + right: 0%; + bottom: 0px; + padding: 0px; +} + +div.imageSub div.blackbg { + z-index: 2000; + bottom: 60px; + left: 300px; + width: 400px; + height: 30px; + color: #000; + background-color: #000; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; + filter: alpha(opacity=50); + opacity: 0.5; + font-size: 120%; + display: none; + padding: 10px; +} + +div.imageSub div.label { + z-index: 3000; + bottom: 60px; + left: 300px; + width: 400px; + height: 30px; + color: white; + font-size: 120%; + display: none; + padding: 10px; +} + +#carousel { + width: 990px; + margin: 20px 10px 10px 40px; +} + +.thumb { + float: left; + margin: 10px 10px 10px 0px; + cursor: pointer; +} + +.thumbnail { + margin-right: 10px; + width: 225px; + height: 127px; +} + +.vertical { + -webkit-transform: rotate(90deg); +} diff --git a/ng-cast.component.ts b/ng-cast.component.ts index 41b017a..89aa3f9 100644 --- a/ng-cast.component.ts +++ b/ng-cast.component.ts @@ -41,5 +41,4 @@ export class NgCastComponent implements OnInit { closeSession() { this.ngCastService.discoverDevices(); } - } diff --git a/package.json b/package.json index a04960e..3f49718 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,7 @@ { "$schema": "./node_modules/ng-packagr/package.schema.json", "name": "@thinkam.net/ng-cast", - "assets": [ - "./CastVideos.js" - ], - "version": "0.2.7", + "version": "0.2.20", "ngPackage": { "lib": { "entryFile": "index.ts" @@ -38,8 +35,6 @@ "@angular-devkit/build-angular": "^0.1001.5", "@angular/cli": "^8.3.29", "@angular/common": "^8.2.5", - "@angular/compiler": "^8.2.14", - "@angular/compiler-cli": "^8.2.14", "@angular/core": "^8.2.5", "ng-packagr": "^10.1.2", "typescript": "^3.4.5", diff --git a/shared/ng-cast.service.ts b/shared/ng-cast.service.ts index 363ae84..39bf495 100644 --- a/shared/ng-cast.service.ts +++ b/shared/ng-cast.service.ts @@ -67,12 +67,17 @@ export class NgCastService { globalThis.CastPlayer.mediaJSON.categories = categories; - globalThis.CastPlayer.addMediaContents(); - globalThis.CastPlayer.setupLocalPlayer(); - globalThis.CastPlayer.initializeUI(); + return globalThis.CastPlayer.addMediaContents(); }; - play = () => { + initialize(mediaContents: any): void { + if (mediaContents) { + globalThis.CastPlayer.initializeUI(); + globalThis.CastPlayer.setupLocalPlayer(); + } + } + + play = () => { this.currentMedia.play(null); }; @@ -89,7 +94,6 @@ export class NgCastService { }; setCasting(value: any) { - globalThis.CastPlayer.addMediaContents(); this.status.casting = value; } From 63da34d19c62445d853661bd854e5ba5fc73a311 Mon Sep 17 00:00:00 2001 From: Felipe de Almeida Date: Sun, 11 Oct 2020 22:01:42 -0300 Subject: [PATCH 04/10] initializeCastPlayer method --- cast-videos.js | 592 +++++------------ dist/bundles/thinkam.net-ng-cast.umd.js | 411 +++--------- dist/bundles/thinkam.net-ng-cast.umd.js.map | 2 +- dist/bundles/thinkam.net-ng-cast.umd.min.js | 2 +- .../thinkam.net-ng-cast.umd.min.js.map | 2 +- dist/esm2015/shared/ng-cast.service.js | 7 +- dist/fesm2015/thinkam.net-ng-cast.js | 597 +++++------------- dist/fesm2015/thinkam.net-ng-cast.js.map | 2 +- dist/package.json | 2 +- package.json | 2 +- shared/ng-cast.service.ts | 5 + 11 files changed, 448 insertions(+), 1176 deletions(-) diff --git a/cast-videos.js b/cast-videos.js index a098412..d413779 100755 --- a/cast-videos.js +++ b/cast-videos.js @@ -193,19 +193,24 @@ var PlayerHandler = function (castPlayer) { }; this.play = function () { - if (castPlayer.playerState == PLAYER_STATE.IDLE || - !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) { + if (castPlayer.playerState !== PLAYER_STATE.PLAYING && + castPlayer.playerState !== PLAYER_STATE.PAUSED && + castPlayer.playerState !== PLAYER_STATE.LOADED) { this.load(castPlayer.currentMediaIndex); return; } - castPlayer.playerState = PLAYER_STATE.PLAYING; this.target.play(); - + castPlayer.playerState = PLAYER_STATE.PLAYING; document.getElementById('play').style.display = 'none'; document.getElementById('pause').style.display = 'block'; + this.updateDisplayMessage(); }; + this.updateDisplayMessage = function () { + this.target.updateDisplayMessage(); + } + this.pause = function () { this.target.pause(); castPlayer.playerState = PLAYER_STATE.PAUSED; @@ -251,6 +256,18 @@ var PlayerHandler = function (castPlayer) { this.updateDisplay(); }; + this.loaded = function() { + castPlayer.currentMediaDuration = this.getMediaDuration(); + castPlayer.updateMediaDuration(); + castPlayer.playerState = PLAYER_STATE.LOADED; + if (castPlayer.currentMediaTime > 0) { + this.seekTo(castPlayer.currentMediaTime); + } + this.play(); + castPlayer.startProgressTimer(); + this.updateDisplayMessage(); + }; + this.getCurrentMediaTime = function () { return this.target.getCurrentMediaTime(); }; @@ -390,398 +407,160 @@ CastPlayer.prototype.setupLocalPlayer = () => { * Add event listeners for player changes which may occur outside sender app. */ CastPlayer.prototype.setupRemotePlayer = function () { - // Triggers when the media info or the player state changes - castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED, - function (event) { - let session = cast.framework.CastContext.getInstance().getCurrentSession(); - if (!session) { - castPlayer.mediaInfo = null; - castPlayer.isLiveContent = false; - castPlayer.playerHandler.updateDisplay(); - return; - } - - let media = session.getMediaSession(); - if (!media) { - castPlayer.mediaInfo = null; - castPlayer.isLiveContent = false; - castPlayer.playerHandler.updateDisplay(); - return; - } - - castPlayer.mediaInfo = media.media; - - if (castPlayer.mediaInfo) { - castPlayer.isLiveContent = (castPlayer.mediaInfo.streamType == - chrome.cast.media.StreamType.LIVE); - } else { - castPlayer.isLiveContent = false; - } - - if (media.playerState == PLAYER_STATE.PLAYING && castPlayer.playerState !== PLAYER_STATE.PLAYING) { - castPlayer.playerHandler.prepareToPlay(); - } - - castPlayer.removeAdMarkers(); - castPlayer.updateAdMarkers(); - - castPlayer.playerHandler.updateDisplay(); - }.bind(castPlayer) - ); - - castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED, - function (event) { - castPlayer.enableProgressBar(event.value); - }.bind(castPlayer) - ); - - castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, - function () { - if (castPlayer.remotePlayer.isPaused) { - castPlayer.playerHandler.pause(); - } else if (castPlayer.playerState !== PLAYER_STATE.PLAYING) { - // If currently not playing, start to play. - // This occurs if starting to play from local, but this check is - // required if the state is changed remotely. - castPlayer.playerHandler.play(); - } - }.bind(castPlayer) - ); - - castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED, - function () { - if (castPlayer.remotePlayer.isMuted) { - castPlayer.playerHandler.mute(); - } else { - castPlayer.playerHandler.unMute(); - } - }.bind(castPlayer) - ); - - castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED, - function () { - var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; - var p = document.getElementById('audio_bg_level'); - p.style.height = newVolume + 'px'; - p.style.marginTop = -newVolume + 'px'; - }.bind(castPlayer) - ); + var castSession = cast.framework.CastContext.getInstance().getCurrentSession(); + // Add event listeners for player changes which may occur outside sender app castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED, - function (event) { - castPlayer.isPlayingBreak(event.value); - }.bind(castPlayer) + cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, + function() { + if (castPlayer.remotePlayer.isPaused) { + castPlayer.playerHandler.pause(); + } else { + castPlayer.playerHandler.play(); + } + }.bind(castPlayer) ); castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED, - function (event) { - castPlayer.onWhenSkippableChanged(event.value); - }.bind(castPlayer) + cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED, + function() { + if (castPlayer.remotePlayer.isMuted) { + castPlayer.playerHandler.mute(); + } else { + castPlayer.playerHandler.unMute(); + } + }.bind(castPlayer) ); castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED, - function (event) { - castPlayer.onCurrentBreakClipTimeChanged(event.value); - }.bind(castPlayer) + cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED, + function() { + var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; + var p = document.getElementById('audio_bg_level'); + p.style.height = newVolume + 'px'; + p.style.marginTop = -newVolume + 'px'; + }.bind(castPlayer) ); - castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED, - function (event) { - castPlayer.onBreakClipIdChanged(event.value); - }.bind(castPlayer) - ); - - castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED, - function (event) { - console.log('LIVE_SEEKABLE_RANGE_CHANGED'); - castPlayer.liveSeekableRange = event.value; - }.bind(castPlayer) - ); - - // This object will implement PlayerHandler callbacks with + // castPlayer object will implement PlayerHandler callbacks with // remotePlayerController, and makes necessary UI updates specific - // to remote playback. + // to remote playback var playerTarget = {}; playerTarget.play = function () { - if (castPlayer.remotePlayer.isPaused) { - castPlayer.remotePlayerController.playOrPause(); - } + if (castPlayer.remotePlayer.isPaused) { + castPlayer.remotePlayerController.playOrPause(); + } - var vi = document.getElementById('video_image'); - vi.style.display = ''; - var localPlayer = document.getElementById('video_element'); - localPlayer.style.display = 'none'; + var vi = document.getElementById('video_image'); + vi.style.display = 'block'; + var localPlayer = document.getElementById('video_element'); + localPlayer.style.display = 'none'; }.bind(castPlayer); playerTarget.pause = function () { - if (!castPlayer.remotePlayer.isPaused) { - castPlayer.remotePlayerController.playOrPause(); - } + if (!castPlayer.remotePlayer.isPaused) { + castPlayer.remotePlayerController.playOrPause(); + } }.bind(castPlayer); playerTarget.stop = function () { - castPlayer.remotePlayerController.stop(); + castPlayer.remotePlayerController.stop(); }.bind(castPlayer); - // Load request for local -> remote playerTarget.load = function (mediaIndex) { - console.log('Loading...' + this.mediaContents[mediaIndex]['title']); - var mediaInfo = new chrome.cast.media.MediaInfo( - this.mediaContents[mediaIndex]['sources'][0], 'video/mp4'); - - mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata(); - mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC; - mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title']; - mediaInfo.metadata.images = [ - {'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']}]; - - var request = new chrome.cast.media.LoadRequest(mediaInfo); - castSession.loadMedia(request).then( - this.playerHandler.loaded.bind(this.playerHandler), - function (errorCode) { - this.playerState = PLAYER_STATE.ERROR; - console.log('Remote media load error: ' + - CastPlayer.getErrorMessage(errorCode)); - }.bind(castPlayer)); - }.bind(castPlayer); - - playerTarget.isMediaLoaded = function (mediaIndex) { - let session = cast.framework.CastContext.getInstance().getCurrentSession(); - if (!session) return false; - - let media = session.getMediaSession(); - if (!media) return false; - - if (media.playerState == PLAYER_STATE.IDLE) { - return false; - } - - // No need to verify local mediaIndex content. - return true; + console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']); + var mediaInfo = new chrome.cast.media.MediaInfo( + castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4'); + + mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata(); + mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC; + mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title']; + mediaInfo.metadata.images = [ + {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}]; + + var request = new chrome.cast.media.LoadRequest(mediaInfo); + castSession.loadMedia(request).then( + castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler), + function (errorCode) { + castPlayer.playerState = PLAYER_STATE.ERROR; + console.log('Remote media load error: ' + + CastPlayer.getErrorMessage(errorCode)); + }.bind(castPlayer)); }.bind(castPlayer); - /** - * @return {number?} Current media time for the content. Always returns - * media time even if in clock time (conversion done when displaying). - */ - playerTarget.getCurrentMediaTime = function () { - if (castPlayer.isLiveContent && castPlayer.mediaInfo.metadata && - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia) { - return castPlayer.remotePlayer.currentTime - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; - } else { - // VOD and live scenerios where live metadata is not provided. + playerTarget.getCurrentMediaTime = function() { return castPlayer.remotePlayer.currentTime; - } }.bind(castPlayer); - /** - * @return {number?} media time duration for the content. Always returns - * media time even if in clock time (conversion done when displaying). - */ - playerTarget.getMediaDuration = function () { - if (castPlayer.isLiveContent) { - // Scenerios when live metadata is not provided. - if (castPlayer.mediaInfo.metadata == undefined || - castPlayer.mediaInfo.metadata.sectionDuration == undefined || - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia == undefined) { - return null; - } - - return castPlayer.mediaInfo.metadata.sectionDuration; - } else { + playerTarget.getMediaDuration = function() { return castPlayer.remotePlayer.duration; - } }.bind(castPlayer); - playerTarget.updateDisplay = function () { - let castSession = cast.framework.CastContext.getInstance().getCurrentSession(); - if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) { - let media = castSession.getMediaSession(); - let mediaInfo = media.media; - - // image placeholder for video view - var vi = document.getElementById('video_image'); - if (mediaInfo.metadata && mediaInfo.metadata.images && - mediaInfo.metadata.images.length > 0) { - vi.src = mediaInfo.metadata.images[0].url; - } - - // playerstate view + playerTarget.updateDisplayMessage = function () { document.getElementById('playerstate').style.display = 'block'; document.getElementById('playerstatebg').style.display = 'block'; document.getElementById('video_image_overlay').style.display = 'block'; - - let mediaTitle = ''; - let mediaEpisodeTitle = ''; - let mediaSubtitle = ''; - - if (mediaInfo.metadata) { - mediaTitle = mediaInfo.metadata.title; - mediaEpisodeTitle = mediaInfo.metadata.episodeTitle; - // Append episode title if present - mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle; - // Do not display mediaTitle if not defined. - mediaTitle = (mediaTitle) ? mediaTitle + ' ' : ''; - mediaSubtitle = mediaInfo.metadata.subtitle; - mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : ''; - } - - if (DEMO_MODE) { - document.getElementById('playerstate').innerHTML = - (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast'; - - // media_info view - document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video'); - document.getElementById('media_subtitle').innerHTML = ''; - } else { - document.getElementById('playerstate').innerHTML = - mediaTitle + media.playerState + ' on ' + - castSession.getCastDevice().friendlyName; - - // media_info view - document.getElementById('media_title').innerHTML = mediaTitle; - document.getElementById('media_subtitle').innerHTML = mediaSubtitle; - } - - // live information - if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) { - castPlayer.liveSeekableRange = media.liveSeekableRange; - - let live_indicator = document.getElementById('live_indicator'); - live_indicator.style.display = 'block'; - - // Display indicator if current time is close to the end of - // the seekable range. - if (castPlayer.liveSeekableRange && (Math.abs(media.getEstimatedTime() - castPlayer.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) { - live_indicator.src = "imagefiles/live_indicator_active.png"; - } else { - live_indicator.src = "imagefiles/live_indicator_inactive.png"; - } - } else { - document.getElementById('live_indicator').style.display = 'none'; - } - } else { - // playerstate view - document.getElementById('playerstate').style.display = 'none'; - document.getElementById('playerstatebg').style.display = 'none'; - document.getElementById('video_image_overlay').style.display = 'none'; - - // media_info view - document.getElementById('media_title').innerHTML = ""; - document.getElementById('media_subtitle').innerHTML = ""; - } + document.getElementById('playerstate').innerHTML = + castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' + + castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName; }.bind(castPlayer); - playerTarget.updateCurrentTimeDisplay = function () { - castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), castPlayer.playerHandler.getCurrentMediaTime()); - }.bind(castPlayer); - - playerTarget.setTimeString = function (element, time) { - let currentTimeString = castPlayer.getMediaTimeString(time); - - if (castPlayer.isLiveContent) { - if (currentTimeString == null) { - element.style.display = 'none'; - return; - } - - // clock time - if (castPlayer.mediaInfo.metadata && castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) { - element.style.display = 'flex'; - element.innerHTML = castPlayer.getClockTimeString(time + castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime); - } else { - // media time - element.style.display = 'flex'; - element.innerHTML = currentTimeString; - } - } else { - if (currentTimeString !== null) { - element.style.display = 'flex'; - element.innerHTML = currentTimeString; + playerTarget.setVolume = function (volumeSliderPosition) { + // Add resistance to avoid loud volume + var currentVolume = castPlayer.remotePlayer.volumeLevel; + var p = document.getElementById('audio_bg_level'); + if (volumeSliderPosition < FULL_VOLUME_HEIGHT) { + var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT; + if (volumeSliderPosition > vScale) { + volumeSliderPosition = vScale + (pos - vScale) / 2; + } + p.style.height = volumeSliderPosition + 'px'; + p.style.marginTop = -volumeSliderPosition + 'px'; + currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT; } else { - element.style.display = 'none'; + currentVolume = 1; } - } - }.bind(castPlayer); - - playerTarget.setVolume = function (volumeSliderPosition) { - var currentVolume = castPlayer.remotePlayer.volumeLevel; - var p = document.getElementById('audio_bg_level'); - if (volumeSliderPosition < FULL_VOLUME_HEIGHT) { - p.style.height = volumeSliderPosition + 'px'; - p.style.marginTop = -volumeSliderPosition + 'px'; - currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT; - } else { - currentVolume = 1; - } - castPlayer.remotePlayer.volumeLevel = currentVolume; - castPlayer.remotePlayerController.setVolumeLevel(); + castPlayer.remotePlayer.volumeLevel = currentVolume; + castPlayer.remotePlayerController.setVolumeLevel(); }.bind(castPlayer); playerTarget.mute = function () { - if (!castPlayer.remotePlayer.isMuted) { - castPlayer.remotePlayerController.muteOrUnmute(); - } + if (!castPlayer.remotePlayer.isMuted) { + castPlayer.remotePlayerController.muteOrUnmute(); + } }.bind(castPlayer); playerTarget.unMute = function () { - if (castPlayer.remotePlayer.isMuted) { - castPlayer.remotePlayerController.muteOrUnmute(); - } + if (castPlayer.remotePlayer.isMuted) { + castPlayer.remotePlayerController.muteOrUnmute(); + } }.bind(castPlayer); - playerTarget.isMuted = function () { - return castPlayer.remotePlayer.isMuted; + playerTarget.isMuted = function() { + return castPlayer.remotePlayer.isMuted; }.bind(castPlayer); playerTarget.seekTo = function (time) { - castPlayer.remotePlayer.currentTime = time; - castPlayer.remotePlayerController.seek(); + castPlayer.remotePlayer.currentTime = time; + castPlayer.remotePlayerController.seek(); }.bind(castPlayer); castPlayer.playerHandler.setTarget(playerTarget); - // Setup remote player properties on setup + // Setup remote player volume right on setup + // The remote player may have had a volume set from previous playback if (castPlayer.remotePlayer.isMuted) { - castPlayer.playerHandler.mute(); + castPlayer.playerHandler.mute(); } - castPlayer.enableProgressBar(castPlayer.remotePlayer.canSeek); - // The remote player may have had a volume set from previous playback var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; var p = document.getElementById('audio_bg_level'); p.style.height = currentVolume + 'px'; p.style.marginTop = -currentVolume + 'px'; - // Show media_control - document.getElementById('media_control').style.opacity = 0.7; - castPlayer.hideFullscreenButton(); - // If resuming a session, take the remote properties and continue the existing - // playback. Otherwise, load local content. - if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() == - cast.framework.SessionState.SESSION_RESUMED) { - console.log('Resuming session'); - castPlayer.playerHandler.prepareToPlay(); - - // New media has been loaded so the previous ad markers should - // be removed. - castPlayer.removeAdMarkers(); - castPlayer.updateAdMarkers(); - } else { - castPlayer.playerHandler.load(); - } + castPlayer.playerHandler.play(); }; /** @@ -791,7 +570,7 @@ CastPlayer.prototype.onMediaLoadedLocally = function () { var localPlayer = document.getElementById('video_element'); localPlayer.currentTime = castPlayer.currentMediaTime; - castPlayer.playerHandler.prepareToPlay(); + castPlayer.playerHandler.loaded(); }; /** @@ -914,108 +693,39 @@ CastPlayer.prototype.stopProgressTimer = function () { /** * Increment media current time depending on remote or local playback */ -CastPlayer.prototype.incrementMediaTime = function () { - // First sync with the current player's time - castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime(); - castPlayer.mediaDuration = castPlayer.playerHandler.getMediaDuration(); - - castPlayer.playerHandler.updateDurationDisplay(); - - if (castPlayer.mediaDuration == null || castPlayer.currentMediaTime < castPlayer.mediaDuration || castPlayer.isLiveContent) { - castPlayer.playerHandler.updateCurrentTimeDisplay(); - castPlayer.updateProgressBarByTimer(); - } else if (castPlayer.mediaDuration > 0) { - castPlayer.endPlayback(); - } +CastPlayer.prototype.incrementMediaTime = () => { + // First sync with the current player's time + castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime(); + castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration(); + + if (castPlayer.playerState === PLAYER_STATE.PLAYING) { + if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) { + castPlayer.currentMediaTime += 1; + castPlayer.updateProgressBarByTimer(); + } else { + castPlayer.endPlayback(); + } + } }; /** * Update progress bar and currentTime based on timer */ CastPlayer.prototype.updateProgressBarByTimer = function () { - var progressBar = document.getElementById('progress'); - var pi = document.getElementById('progress_indicator'); - - // Live situation where the progress and duration is unknown. - if (castPlayer.mediaDuration == null) { - if (!castPlayer.isLiveContent) { - console.log('Error - Duration is not defined for a VOD stream.'); - } - - progressBar.style.width = '0px'; - - let skip = document.getElementById('skip'); - if (skip && skip.style && skip.style.display) { - skip.style.display = 'none'; - } - - pi.style.display = 'none'; - - let seekable_window = document.getElementById('seekable_window'); - if (seekable_window && seekable_window.style && seekable_window.style.width) - seekable_window.style.width = '0px'; - - let unseekable_overlay = document.getElementById('unseekable_overlay'); - if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width) - unseekable_overlay.style.width = '0px'; - - return; - } else { - pi.style.display = ''; + var p = document.getElementById('progress'); + if (isNaN(parseInt(p.style.width, 10))) { + p.style.width = 0; } - - if (isNaN(parseInt(progressBar.style.width, 10))) { - progressBar.style.width = '0px'; + if (castPlayer.currentMediaDuration > 0) { + var pp = Math.floor( + PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration); } - // Prevent indicator from exceeding the max width. Happens during - // short media when each progress step is large - var pp = Math.floor(PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.mediaDuration); - if (pp > PROGRESS_BAR_WIDTH) { - pp = PROGRESS_BAR_WIDTH; - } else if (pp < 0) { - pp = 0; - } - - progressBar.style.width = pp + 'px'; - pi.style.marginLeft = pp + 'px'; - - let seekable_window = document.getElementById('seekable_window'); - let unseekable_overlay = document.getElementById('unseekable_overlay'); - if (castPlayer.isLiveContent) { - if (castPlayer.liveSeekableRange) { - // Use the liveSeekableRange to draw the seekable and unseekable windows - let seekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.end) - - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; - let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / castPlayer.mediaDuration); - if (seekableWidth > PROGRESS_BAR_WIDTH) { - seekableWidth = PROGRESS_BAR_WIDTH; - } else if (seekableWidth < 0) { - seekableWidth = 0; - } - seekable_window.style.width = seekableWidth + 'px'; - - let unseekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.start) - - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; - let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / castPlayer.mediaDuration); - if (unseekableWidth > PROGRESS_BAR_WIDTH) { - unseekableWidth = PROGRESS_BAR_WIDTH; - } else if (unseekableWidth < 0) { - unseekableWidth = 0; - } - unseekable_overlay.style.width = unseekableWidth + 'px'; - } else { - // Nothing is seekable if no liveSeekableRange - seekable_window.style.width = '0px'; - unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px'; - } - } else { - // Default to everything seekable - seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px'; - unseekable_overlay.style.width = '0px'; - } + p.style.width = pp + 'px'; + var pi = document.getElementById('progress_indicator'); + pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px'; - if (pp >= PROGRESS_BAR_WIDTH && !castPlayer.isLiveContent) { + if (pp >= PROGRESS_BAR_WIDTH) { castPlayer.endPlayback(); } }; @@ -1244,6 +954,32 @@ CastPlayer.prototype.enableProgressBar = function (enable) { } } +/** + * Updates media duration text in UI + */ +CastPlayer.prototype.updateMediaDuration = function() { + document.getElementById('duration').innerHTML = + CastPlayer.getDurationString(castPlayer.currentMediaDuration); +}; + +/** + * @param {number} durationInSec + * @return {string} + */ +CastPlayer.getDurationString = function(durationInSec) { + var durationString = '' + Math.floor(durationInSec % 60); + var durationInMin = Math.floor(durationInSec / 60); + if (durationInMin === 0) { + return durationString; + } + durationString = (durationInMin % 60) + ':' + durationString; + var durationInHour = Math.floor(durationInMin / 60); + if (durationInHour === 0) { + return durationString; + } + return durationInHour + ':' + durationString; +}; + /** * Request full screen mode */ @@ -1321,7 +1057,7 @@ CastPlayer.prototype.hideFullscreenButton = function () { */ CastPlayer.prototype.showMediaControl = function () { let media_control = document.getElementById('media_control'); - if (media_control && media_control.style && media_control.opacity) + if (media_control && media_control.style && media_control.style.opacity) media_control.style.opacity = 0.7; }; @@ -1455,7 +1191,7 @@ CastPlayer.prototype.addVideoThumbs = function () { newdiv.innerHTML = ''; - newdiv.addEventListener('click', castPlayer.selectMedia.bind(this, i)); + newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i)); ni.appendChild(newdiv); } } diff --git a/dist/bundles/thinkam.net-ng-cast.umd.js b/dist/bundles/thinkam.net-ng-cast.umd.js index 8c571b5..fb93af0 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.js +++ b/dist/bundles/thinkam.net-ng-cast.umd.js @@ -406,6 +406,11 @@ if (mediaContents) { globalThis.CastPlayer.initializeUI(); globalThis.CastPlayer.setupLocalPlayer(); + this.window['__onGCastApiAvailable'] = function (isAvailable) { + if (isAvailable) { + globalThis.CastPlayer.initializeCastPlayer(); + } + }; } }; NgCastService.prototype.setCasting = function (value) { @@ -604,15 +609,20 @@ this.target = target; }; this.play = function () { - if (castPlayer.playerState == PLAYER_STATE.IDLE || - !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) { + if (castPlayer.playerState !== PLAYER_STATE.PLAYING && + castPlayer.playerState !== PLAYER_STATE.PAUSED && + castPlayer.playerState !== PLAYER_STATE.LOADED) { this.load(castPlayer.currentMediaIndex); return; } - castPlayer.playerState = PLAYER_STATE.PLAYING; this.target.play(); + castPlayer.playerState = PLAYER_STATE.PLAYING; document.getElementById('play').style.display = 'none'; document.getElementById('pause').style.display = 'block'; + this.updateDisplayMessage(); + }; + this.updateDisplayMessage = function () { + this.target.updateDisplayMessage(); }; this.pause = function () { this.target.pause(); @@ -654,6 +664,17 @@ castPlayer.startProgressTimer(); this.updateDisplay(); }; + this.loaded = function () { + castPlayer.currentMediaDuration = this.getMediaDuration(); + castPlayer.updateMediaDuration(); + castPlayer.playerState = PLAYER_STATE.LOADED; + if (castPlayer.currentMediaTime > 0) { + this.seekTo(castPlayer.currentMediaTime); + } + this.play(); + castPlayer.startProgressTimer(); + this.updateDisplayMessage(); + }; this.getCurrentMediaTime = function () { return this.target.getCurrentMediaTime(); }; @@ -762,48 +783,13 @@ * Add event listeners for player changes which may occur outside sender app. */ CastPlayer.prototype.setupRemotePlayer = function () { - // Triggers when the media info or the player state changes - castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED, function (event) { - var session = cast.framework.CastContext.getInstance().getCurrentSession(); - if (!session) { - castPlayer.mediaInfo = null; - castPlayer.isLiveContent = false; - castPlayer.playerHandler.updateDisplay(); - return; - } - var media = session.getMediaSession(); - if (!media) { - castPlayer.mediaInfo = null; - castPlayer.isLiveContent = false; - castPlayer.playerHandler.updateDisplay(); - return; - } - castPlayer.mediaInfo = media.media; - if (castPlayer.mediaInfo) { - castPlayer.isLiveContent = (castPlayer.mediaInfo.streamType == - chrome.cast.media.StreamType.LIVE); - } - else { - castPlayer.isLiveContent = false; - } - if (media.playerState == PLAYER_STATE.PLAYING && castPlayer.playerState !== PLAYER_STATE.PLAYING) { - castPlayer.playerHandler.prepareToPlay(); - } - castPlayer.removeAdMarkers(); - castPlayer.updateAdMarkers(); - castPlayer.playerHandler.updateDisplay(); - }.bind(castPlayer)); - castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED, function (event) { - castPlayer.enableProgressBar(event.value); - }.bind(castPlayer)); + var castSession = cast.framework.CastContext.getInstance().getCurrentSession(); + // Add event listeners for player changes which may occur outside sender app castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, function () { if (castPlayer.remotePlayer.isPaused) { castPlayer.playerHandler.pause(); } - else if (castPlayer.playerState !== PLAYER_STATE.PLAYING) { - // If currently not playing, start to play. - // This occurs if starting to play from local, but this check is - // required if the state is changed remotely. + else { castPlayer.playerHandler.play(); } }.bind(castPlayer)); @@ -821,32 +807,16 @@ p.style.height = newVolume + 'px'; p.style.marginTop = -newVolume + 'px'; }.bind(castPlayer)); - castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED, function (event) { - castPlayer.isPlayingBreak(event.value); - }.bind(castPlayer)); - castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED, function (event) { - castPlayer.onWhenSkippableChanged(event.value); - }.bind(castPlayer)); - castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED, function (event) { - castPlayer.onCurrentBreakClipTimeChanged(event.value); - }.bind(castPlayer)); - castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED, function (event) { - castPlayer.onBreakClipIdChanged(event.value); - }.bind(castPlayer)); - castPlayer.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED, function (event) { - console.log('LIVE_SEEKABLE_RANGE_CHANGED'); - castPlayer.liveSeekableRange = event.value; - }.bind(castPlayer)); - // This object will implement PlayerHandler callbacks with + // castPlayer object will implement PlayerHandler callbacks with // remotePlayerController, and makes necessary UI updates specific - // to remote playback. + // to remote playback var playerTarget = {}; playerTarget.play = function () { if (castPlayer.remotePlayer.isPaused) { castPlayer.remotePlayerController.playOrPause(); } var vi = document.getElementById('video_image'); - vi.style.display = ''; + vi.style.display = 'block'; var localPlayer = document.getElementById('video_element'); localPlayer.style.display = 'none'; }.bind(castPlayer); @@ -858,174 +828,45 @@ playerTarget.stop = function () { castPlayer.remotePlayerController.stop(); }.bind(castPlayer); - // Load request for local -> remote playerTarget.load = function (mediaIndex) { - console.log('Loading...' + this.mediaContents[mediaIndex]['title']); - var mediaInfo = new chrome.cast.media.MediaInfo(this.mediaContents[mediaIndex]['sources'][0], 'video/mp4'); + console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']); + var mediaInfo = new chrome.cast.media.MediaInfo(castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4'); mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata(); mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC; - mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title']; + mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title']; mediaInfo.metadata.images = [ - { 'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb'] } + { 'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'] } ]; var request = new chrome.cast.media.LoadRequest(mediaInfo); - castSession.loadMedia(request).then(this.playerHandler.loaded.bind(this.playerHandler), function (errorCode) { - this.playerState = PLAYER_STATE.ERROR; + castSession.loadMedia(request).then(castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler), function (errorCode) { + castPlayer.playerState = PLAYER_STATE.ERROR; console.log('Remote media load error: ' + CastPlayer.getErrorMessage(errorCode)); }.bind(castPlayer)); }.bind(castPlayer); - playerTarget.isMediaLoaded = function (mediaIndex) { - var session = cast.framework.CastContext.getInstance().getCurrentSession(); - if (!session) - return false; - var media = session.getMediaSession(); - if (!media) - return false; - if (media.playerState == PLAYER_STATE.IDLE) { - return false; - } - // No need to verify local mediaIndex content. - return true; - }.bind(castPlayer); - /** - * @return {number?} Current media time for the content. Always returns - * media time even if in clock time (conversion done when displaying). - */ playerTarget.getCurrentMediaTime = function () { - if (castPlayer.isLiveContent && castPlayer.mediaInfo.metadata && - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia) { - return castPlayer.remotePlayer.currentTime - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; - } - else { - // VOD and live scenerios where live metadata is not provided. - return castPlayer.remotePlayer.currentTime; - } + return castPlayer.remotePlayer.currentTime; }.bind(castPlayer); - /** - * @return {number?} media time duration for the content. Always returns - * media time even if in clock time (conversion done when displaying). - */ playerTarget.getMediaDuration = function () { - if (castPlayer.isLiveContent) { - // Scenerios when live metadata is not provided. - if (castPlayer.mediaInfo.metadata == undefined || - castPlayer.mediaInfo.metadata.sectionDuration == undefined || - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia == undefined) { - return null; - } - return castPlayer.mediaInfo.metadata.sectionDuration; - } - else { - return castPlayer.remotePlayer.duration; - } - }.bind(castPlayer); - playerTarget.updateDisplay = function () { - var castSession = cast.framework.CastContext.getInstance().getCurrentSession(); - if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) { - var media = castSession.getMediaSession(); - var mediaInfo = media.media; - // image placeholder for video view - var vi = document.getElementById('video_image'); - if (mediaInfo.metadata && mediaInfo.metadata.images && - mediaInfo.metadata.images.length > 0) { - vi.src = mediaInfo.metadata.images[0].url; - } - // playerstate view - document.getElementById('playerstate').style.display = 'block'; - document.getElementById('playerstatebg').style.display = 'block'; - document.getElementById('video_image_overlay').style.display = 'block'; - var mediaTitle = ''; - var mediaEpisodeTitle = ''; - var mediaSubtitle = ''; - if (mediaInfo.metadata) { - mediaTitle = mediaInfo.metadata.title; - mediaEpisodeTitle = mediaInfo.metadata.episodeTitle; - // Append episode title if present - mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle; - // Do not display mediaTitle if not defined. - mediaTitle = (mediaTitle) ? mediaTitle + ' ' : ''; - mediaSubtitle = mediaInfo.metadata.subtitle; - mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : ''; - } - if (DEMO_MODE) { - document.getElementById('playerstate').innerHTML = - (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast'; - // media_info view - document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video'); - document.getElementById('media_subtitle').innerHTML = ''; - } - else { - document.getElementById('playerstate').innerHTML = - mediaTitle + media.playerState + ' on ' + - castSession.getCastDevice().friendlyName; - // media_info view - document.getElementById('media_title').innerHTML = mediaTitle; - document.getElementById('media_subtitle').innerHTML = mediaSubtitle; - } - // live information - if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) { - castPlayer.liveSeekableRange = media.liveSeekableRange; - var live_indicator = document.getElementById('live_indicator'); - live_indicator.style.display = 'block'; - // Display indicator if current time is close to the end of - // the seekable range. - if (castPlayer.liveSeekableRange && (Math.abs(media.getEstimatedTime() - castPlayer.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) { - live_indicator.src = "imagefiles/live_indicator_active.png"; - } - else { - live_indicator.src = "imagefiles/live_indicator_inactive.png"; - } - } - else { - document.getElementById('live_indicator').style.display = 'none'; - } - } - else { - // playerstate view - document.getElementById('playerstate').style.display = 'none'; - document.getElementById('playerstatebg').style.display = 'none'; - document.getElementById('video_image_overlay').style.display = 'none'; - // media_info view - document.getElementById('media_title').innerHTML = ""; - document.getElementById('media_subtitle').innerHTML = ""; - } - }.bind(castPlayer); - playerTarget.updateCurrentTimeDisplay = function () { - castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), castPlayer.playerHandler.getCurrentMediaTime()); + return castPlayer.remotePlayer.duration; }.bind(castPlayer); - playerTarget.setTimeString = function (element, time) { - var currentTimeString = castPlayer.getMediaTimeString(time); - if (castPlayer.isLiveContent) { - if (currentTimeString == null) { - element.style.display = 'none'; - return; - } - // clock time - if (castPlayer.mediaInfo.metadata && castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) { - element.style.display = 'flex'; - element.innerHTML = castPlayer.getClockTimeString(time + castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime); - } - else { - // media time - element.style.display = 'flex'; - element.innerHTML = currentTimeString; - } - } - else { - if (currentTimeString !== null) { - element.style.display = 'flex'; - element.innerHTML = currentTimeString; - } - else { - element.style.display = 'none'; - } - } + playerTarget.updateDisplayMessage = function () { + document.getElementById('playerstate').style.display = 'block'; + document.getElementById('playerstatebg').style.display = 'block'; + document.getElementById('video_image_overlay').style.display = 'block'; + document.getElementById('playerstate').innerHTML = + castPlayer.mediaContents[castPlayer.currentMediaIndex]['title'] + ' ' + + castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName; }.bind(castPlayer); playerTarget.setVolume = function (volumeSliderPosition) { + // Add resistance to avoid loud volume var currentVolume = castPlayer.remotePlayer.volumeLevel; var p = document.getElementById('audio_bg_level'); if (volumeSliderPosition < FULL_VOLUME_HEIGHT) { + var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT; + if (volumeSliderPosition > vScale) { + volumeSliderPosition = vScale + (pos - vScale) / 2; + } p.style.height = volumeSliderPosition + 'px'; p.style.marginTop = -volumeSliderPosition + 'px'; currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT; @@ -1054,33 +895,17 @@ castPlayer.remotePlayerController.seek(); }.bind(castPlayer); castPlayer.playerHandler.setTarget(playerTarget); - // Setup remote player properties on setup + // Setup remote player volume right on setup + // The remote player may have had a volume set from previous playback if (castPlayer.remotePlayer.isMuted) { castPlayer.playerHandler.mute(); } - castPlayer.enableProgressBar(castPlayer.remotePlayer.canSeek); - // The remote player may have had a volume set from previous playback var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; var p = document.getElementById('audio_bg_level'); p.style.height = currentVolume + 'px'; p.style.marginTop = -currentVolume + 'px'; - // Show media_control - document.getElementById('media_control').style.opacity = 0.7; castPlayer.hideFullscreenButton(); - // If resuming a session, take the remote properties and continue the existing - // playback. Otherwise, load local content. - if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() == - cast.framework.SessionState.SESSION_RESUMED) { - console.log('Resuming session'); - castPlayer.playerHandler.prepareToPlay(); - // New media has been loaded so the previous ad markers should - // be removed. - castPlayer.removeAdMarkers(); - castPlayer.updateAdMarkers(); - } - else { - castPlayer.playerHandler.load(); - } + castPlayer.playerHandler.play(); }; /** * Callback when media is loaded in local player @@ -1088,7 +913,7 @@ CastPlayer.prototype.onMediaLoadedLocally = function () { var localPlayer = document.getElementById('video_element'); localPlayer.currentTime = castPlayer.currentMediaTime; - castPlayer.playerHandler.prepareToPlay(); + castPlayer.playerHandler.loaded(); }; /** * Select a media content @@ -1198,96 +1023,32 @@ CastPlayer.prototype.incrementMediaTime = function () { // First sync with the current player's time castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime(); - castPlayer.mediaDuration = castPlayer.playerHandler.getMediaDuration(); - castPlayer.playerHandler.updateDurationDisplay(); - if (castPlayer.mediaDuration == null || castPlayer.currentMediaTime < castPlayer.mediaDuration || castPlayer.isLiveContent) { - castPlayer.playerHandler.updateCurrentTimeDisplay(); - castPlayer.updateProgressBarByTimer(); - } - else if (castPlayer.mediaDuration > 0) { - castPlayer.endPlayback(); + castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration(); + if (castPlayer.playerState === PLAYER_STATE.PLAYING) { + if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) { + castPlayer.currentMediaTime += 1; + castPlayer.updateProgressBarByTimer(); + } + else { + castPlayer.endPlayback(); + } } }; /** * Update progress bar and currentTime based on timer */ CastPlayer.prototype.updateProgressBarByTimer = function () { - var progressBar = document.getElementById('progress'); - var pi = document.getElementById('progress_indicator'); - // Live situation where the progress and duration is unknown. - if (castPlayer.mediaDuration == null) { - if (!castPlayer.isLiveContent) { - console.log('Error - Duration is not defined for a VOD stream.'); - } - progressBar.style.width = '0px'; - var skip = document.getElementById('skip'); - if (skip && skip.style && skip.style.display) { - skip.style.display = 'none'; - } - pi.style.display = 'none'; - var seekable_window_1 = document.getElementById('seekable_window'); - if (seekable_window_1 && seekable_window_1.style && seekable_window_1.style.width) - seekable_window_1.style.width = '0px'; - var unseekable_overlay_1 = document.getElementById('unseekable_overlay'); - if (unseekable_overlay_1 && unseekable_overlay_1.style && unseekable_overlay_1.style.width) - unseekable_overlay_1.style.width = '0px'; - return; + var p = document.getElementById('progress'); + if (isNaN(parseInt(p.style.width, 10))) { + p.style.width = 0; } - else { - pi.style.display = ''; - } - if (isNaN(parseInt(progressBar.style.width, 10))) { - progressBar.style.width = '0px'; - } - // Prevent indicator from exceeding the max width. Happens during - // short media when each progress step is large - var pp = Math.floor(PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.mediaDuration); - if (pp > PROGRESS_BAR_WIDTH) { - pp = PROGRESS_BAR_WIDTH; - } - else if (pp < 0) { - pp = 0; - } - progressBar.style.width = pp + 'px'; - pi.style.marginLeft = pp + 'px'; - var seekable_window = document.getElementById('seekable_window'); - var unseekable_overlay = document.getElementById('unseekable_overlay'); - if (castPlayer.isLiveContent) { - if (castPlayer.liveSeekableRange) { - // Use the liveSeekableRange to draw the seekable and unseekable windows - var seekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.end) - - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; - var seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / castPlayer.mediaDuration); - if (seekableWidth > PROGRESS_BAR_WIDTH) { - seekableWidth = PROGRESS_BAR_WIDTH; - } - else if (seekableWidth < 0) { - seekableWidth = 0; - } - seekable_window.style.width = seekableWidth + 'px'; - var unseekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.start) - - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; - var unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / castPlayer.mediaDuration); - if (unseekableWidth > PROGRESS_BAR_WIDTH) { - unseekableWidth = PROGRESS_BAR_WIDTH; - } - else if (unseekableWidth < 0) { - unseekableWidth = 0; - } - unseekable_overlay.style.width = unseekableWidth + 'px'; - } - else { - // Nothing is seekable if no liveSeekableRange - seekable_window.style.width = '0px'; - unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px'; - } - } - else { - // Default to everything seekable - seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px'; - unseekable_overlay.style.width = '0px'; + if (castPlayer.currentMediaDuration > 0) { + var pp = Math.floor(PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration); } - if (pp >= PROGRESS_BAR_WIDTH && !castPlayer.isLiveContent) { + p.style.width = pp + 'px'; + var pi = document.getElementById('progress_indicator'); + pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px'; + if (pp >= PROGRESS_BAR_WIDTH) { castPlayer.endPlayback(); } }; @@ -1491,6 +1252,30 @@ progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener); } }; + /** + * Updates media duration text in UI + */ + CastPlayer.prototype.updateMediaDuration = function () { + document.getElementById('duration').innerHTML = + CastPlayer.getDurationString(castPlayer.currentMediaDuration); + }; + /** + * @param {number} durationInSec + * @return {string} + */ + CastPlayer.getDurationString = function (durationInSec) { + var durationString = '' + Math.floor(durationInSec % 60); + var durationInMin = Math.floor(durationInSec / 60); + if (durationInMin === 0) { + return durationString; + } + durationString = (durationInMin % 60) + ':' + durationString; + var durationInHour = Math.floor(durationInMin / 60); + if (durationInHour === 0) { + return durationString; + } + return durationInHour + ':' + durationString; + }; /** * Request full screen mode */ @@ -1555,7 +1340,7 @@ */ CastPlayer.prototype.showMediaControl = function () { var media_control = document.getElementById('media_control'); - if (media_control && media_control.style && media_control.opacity) + if (media_control && media_control.style && media_control.style.opacity) media_control.style.opacity = 0.7; }; /** @@ -1659,7 +1444,7 @@ newdiv.innerHTML = ''; - newdiv.addEventListener('click', castPlayer.selectMedia.bind(this, i)); + newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i)); ni.appendChild(newdiv); } } diff --git a/dist/bundles/thinkam.net-ng-cast.umd.js.map b/dist/bundles/thinkam.net-ng-cast.umd.js.map index 12fb099..3d1518f 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.js.map +++ b/dist/bundles/thinkam.net-ng-cast.umd.js.map @@ -1 +1 @@ -{"version":3,"file":"thinkam.net-ng-cast.umd.js","sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n castPlayer.mediaInfo = null;\n castPlayer.isLiveContent = false;\n castPlayer.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n castPlayer.mediaInfo = null;\n castPlayer.isLiveContent = false;\n castPlayer.playerHandler.updateDisplay();\n return;\n }\n\n castPlayer.mediaInfo = media.media;\n\n if (castPlayer.mediaInfo) {\n castPlayer.isLiveContent = (castPlayer.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n castPlayer.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && castPlayer.playerState !== PLAYER_STATE.PLAYING) {\n castPlayer.playerHandler.prepareToPlay();\n }\n\n castPlayer.removeAdMarkers();\n castPlayer.updateAdMarkers();\n\n castPlayer.playerHandler.updateDisplay();\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n castPlayer.enableProgressBar(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else if (castPlayer.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n castPlayer.isPlayingBreak(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n castPlayer.onWhenSkippableChanged(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n castPlayer.onCurrentBreakClipTimeChanged(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n castPlayer.onBreakClipIdChanged(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n castPlayer.liveSeekableRange = event.value;\n }.bind(castPlayer)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n this.playerHandler.loaded.bind(this.playerHandler),\n function (errorCode) {\n this.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(castPlayer);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (castPlayer.isLiveContent && castPlayer.mediaInfo.metadata &&\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia) {\n return castPlayer.remotePlayer.currentTime - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return castPlayer.remotePlayer.currentTime;\n }\n }.bind(castPlayer);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (castPlayer.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (castPlayer.mediaInfo.metadata == undefined ||\n castPlayer.mediaInfo.metadata.sectionDuration == undefined ||\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return castPlayer.mediaInfo.metadata.sectionDuration;\n } else {\n return castPlayer.remotePlayer.duration;\n }\n }.bind(castPlayer);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n castPlayer.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (castPlayer.liveSeekableRange && (Math.abs(media.getEstimatedTime() - castPlayer.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(castPlayer);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), castPlayer.playerHandler.getCurrentMediaTime());\n }.bind(castPlayer);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = castPlayer.getMediaTimeString(time);\n\n if (castPlayer.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (castPlayer.mediaInfo.metadata && castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = castPlayer.getClockTimeString(time + castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function () {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n castPlayer.enableProgressBar(castPlayer.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n castPlayer.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n castPlayer.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n castPlayer.removeAdMarkers();\n castPlayer.updateAdMarkers();\n } else {\n castPlayer.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.mediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n castPlayer.playerHandler.updateDurationDisplay();\n\n if (castPlayer.mediaDuration == null || castPlayer.currentMediaTime < castPlayer.mediaDuration || castPlayer.isLiveContent) {\n castPlayer.playerHandler.updateCurrentTimeDisplay();\n castPlayer.updateProgressBarByTimer();\n } else if (castPlayer.mediaDuration > 0) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (castPlayer.mediaDuration == null) {\n if (!castPlayer.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n\n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (castPlayer.isLiveContent) {\n if (castPlayer.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.end) -\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / castPlayer.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.start) -\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / castPlayer.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !castPlayer.isLiveContent) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["NgCastComponent","tslib_1.__decorate","Input","Component","NgCastService","Subject","Injectable","NgCastModule","NgModule","CUSTOM_ELEMENTS_SCHEMA","CommonModule"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"thinkam.net-ng-cast.umd.js","sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n this.window['__onGCastApiAvailable'] = (isAvailable: boolean) => {\n if (isAvailable) {\n globalThis.CastPlayer.initializeCastPlayer();\n }\n };\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["NgCastComponent","tslib_1.__decorate","Input","Component","NgCastService","Subject","Injectable","NgCastModule","NgModule","CUSTOM_ELEMENTS_SCHEMA","CommonModule"],"mappings":"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"} \ No newline at end of file diff --git a/dist/bundles/thinkam.net-ng-cast.umd.min.js b/dist/bundles/thinkam.net-ng-cast.umd.min.js index 3aec2f6..c71f208 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.min.js +++ b/dist/bundles/thinkam.net-ng-cast.umd.min.js @@ -12,5 +12,5 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */function a(e,t,i,n){var a,o=arguments.length,r=o<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,i,n);else for(var d=e.length-1;d>=0;d--)(a=e[d])&&(r=(o<3?a(r):o>3?a(t,i,r):a(t,i))||r);return o>3&&r&&Object.defineProperty(t,i,r),r}e.ɵa=function(){function e(e){this.ngCastService=e,this.videoImage="",this.imageOffline=!1,this.srcImageOffline=""}return e.prototype.ngOnInit=function(){this.window=window;var e=this.ngCastService;this.window.__onGCastApiAvailable=function(t){t&&e.initializeCastApi()},this.castingStatus=this.ngCastService.getStatus()},e.prototype.openSession=function(){this.ngCastService.discoverDevices()},e.prototype.closeSession=function(){this.ngCastService.discoverDevices()},e}(),a([t.Input()],e.ɵa.prototype,"videoImage",void 0),a([t.Input()],e.ɵa.prototype,"imageOffline",void 0),a([t.Input()],e.ɵa.prototype,"srcImageOffline",void 0),e.ɵa=a([t.Component({selector:"ng-cast",template:'
\n
\x3c!-- Put Your Image Width --\x3e\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\nTV Offline\n',styles:['body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:1100px}#video_image{height:536px;margin:20px auto 0 40px;width:960px}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin:0 0 0 40px;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;width:960px}#video_element{background-color:#000;margin:20px auto 0 40px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin:-4px 0 0 40px;opacity:.9;padding:10px;width:940px}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px;width:95%}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;left:8px;margin:-60px 0 0 40px;opacity:.7;padding:0;position:absolute;top:650px;transition:opacity 1s;width:960px;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}']})],e.ɵa),e.NgCastService=function(){function e(){var e=this;this.window=window,this.status={casting:!1},this.onInitSuccess=function(){console.log("GCast initialization success")},this.onError=function(e){console.log("GCast initialization failed",e)},this.discoverDevices=function(){var t=e,i=new n.Subject;return e.cast.requestSession((function(e){t.session=e,t.setCasting(!0),i.next("CONNECTED")}),(function(e){t.setCasting(!1),"cancel"===e.code?(t.session=void 0,i.next("CANCEL")):console.error("Error selecting a cast device",e)})),i},this.onMediaDiscovered=function(e){var t=window.document.createElement("script");return t.setAttribute("type","text/javascript"),t.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"),window.document.body.appendChild(t),globalThis.CastPlayer.mediaJSON.categories=e,globalThis.CastPlayer.addMediaContents()},this.play=function(){e.currentMedia.play(null)},this.pause=function(){e.currentMedia.pause(null)},this.stop=function(){e.currentMedia.stop(null)},this.onMediaError=function(e){console.error("Error launching media",e)},globalThis.CastPlayer.mediaJSON={categories:[]}}return e.prototype.initializeCastApi=function(){var e=this;this.cast=this.window.chrome.cast;var t=new this.cast.SessionRequest("4F8B3483"),i=new this.cast.ApiConfig(t,(function(){}),(function(t){e.cast.ReceiverAvailability.AVAILABLE}));this.cast.initialize(i,this.onInitSuccess,this.onError)},e.prototype.initialize=function(e){e&&(globalThis.CastPlayer.initializeUI(),globalThis.CastPlayer.setupLocalPlayer())},e.prototype.setCasting=function(e){this.status.casting=e},e.prototype.getStatus=function(){return this.status},e}(),e.NgCastService=a([t.Injectable()],e.NgCastService),e.NgCastModule=function(){},e.NgCastModule=a([t.NgModule({schemas:[t.CUSTOM_ELEMENTS_SCHEMA],imports:[i.CommonModule],exports:[e.ɵa],providers:[e.NgCastService],declarations:[e.ɵa]})],e.NgCastModule);var o=600,r=100,d="IDLE",l="BUFFERING",s="LOADED",c="PLAYING",u="PAUSED",m="ERROR",p=function(){this.playerHandler=new g(this),this.playerState=d,this.playerStateBeforeSwitch=null,this.remotePlayer=null,this.remotePlayerController=null,this.currentMediaTime=0,this.mediaDuration=-1,this.timer=null,this.incrementMediaTimeHandler=this.incrementMediaTime.bind(this),this.seekMediaListener=this.seekMedia.bind(this),this.currentMediaIndex=0,this.mediaContents=null,this.fullscreen=!1,this.mediaInfo=null,this.whenSkippable=null,this.liveSeekableRange=null,this.isLiveContent=!1,this.mediaJSON={categories:[]}};p.prototype.initializeCastPlayer=function(){var e={receiverApplicationId:"4F8B3483"};e.autoJoinPolicy=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,cast.framework.CastContext.getInstance().setOptions(e),y.remotePlayer=new cast.framework.RemotePlayer,y.remotePlayerController=new cast.framework.RemotePlayerController(y.remotePlayer),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,y.switchPlayer.bind(y))},p.prototype.switchPlayer=function(){y.stopProgressTimer(),y.resetVolumeSlider(),y.playerHandler.stop(),y.playerState=d,cast&&cast.framework&&y.remotePlayer.isConnected?y.setupRemotePlayer():y.setupLocalPlayer()};var g=function(e){this.target={},this.setTarget=function(e){this.target=e},this.play=function(){e.playerState!=d&&this.target.isMediaLoaded(e.currentMediaIndex)?(e.playerState=c,this.target.play(),document.getElementById("play").style.display="none",document.getElementById("pause").style.display="block"):this.load(e.currentMediaIndex)},this.pause=function(){this.target.pause(),e.playerState=u,document.getElementById("play").style.display="block",document.getElementById("pause").style.display="none"},this.stop=function(){e.playerState=d,this.target.stop()},this.load=function(t){void 0===t&&(t=null),t||(t=e.currentMediaIndex),e.playerState=l,this.target.load(t)},this.isMediaLoaded=function(e){return this.target.isMediaLoaded(e)},this.prepareToPlay=function(){e.mediaDuration=this.getMediaDuration(),e.playerHandler.updateDurationDisplay(),e.playerState=s,this.play(),e.startProgressTimer(),this.updateDisplay()},this.getCurrentMediaTime=function(){return this.target.getCurrentMediaTime()},this.getMediaDuration=function(){return this.target.getMediaDuration()},this.updateDisplay=function(){this.currentMediaTime=this.target.getCurrentMediaTime(),this.mediaDuration=this.target.getMediaDuration(),this.target.updateDisplay()},this.updateCurrentTimeDisplay=function(){this.target.updateCurrentTimeDisplay()},this.setTimeString=function(e,t){this.target.setTimeString(e,t)},this.setVolume=function(e){this.target.setVolume(e)},this.mute=function(){this.target.mute(),document.getElementById("audio_on").style.display="none",document.getElementById("audio_off").style.display="block"},this.unMute=function(){this.target.unMute(),document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},this.isMuted=function(){return this.target.isMuted()},this.seekTo=function(e){this.target.seekTo(e)}};p.prototype.setupLocalPlayer=function(){var e=document.getElementById("video_element");e.addEventListener("loadeddata",y.onMediaLoadedLocally.bind(y));var t={play:function(){e.play(),document.getElementById("video_image").style.display="none",e.style.display="block"},pause:function(){e.pause()},stop:function(){e.stop()}};t.load=function(t){e.src=y.mediaContents[t].sources[0],e.load()}.bind(y),t.getCurrentMediaTime=function(){return e.currentTime},t.getMediaDuration=function(){return e.duration},t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none"},t.setVolume=function(t){e.volume=t0&&y.playerHandler.play()},p.prototype.setupRemotePlayer=function(){y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,function(e){var t=cast.framework.CastContext.getInstance().getCurrentSession();if(!t)return y.mediaInfo=null,y.isLiveContent=!1,void y.playerHandler.updateDisplay();var i=t.getMediaSession();if(!i)return y.mediaInfo=null,y.isLiveContent=!1,void y.playerHandler.updateDisplay();y.mediaInfo=i.media,y.mediaInfo?y.isLiveContent=y.mediaInfo.streamType==chrome.cast.media.StreamType.LIVE:y.isLiveContent=!1,i.playerState==c&&y.playerState!==c&&y.playerHandler.prepareToPlay(),y.removeAdMarkers(),y.updateAdMarkers(),y.playerHandler.updateDisplay()}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,function(e){y.enableProgressBar(e.value)}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,function(){y.remotePlayer.isPaused?y.playerHandler.pause():y.playerState!==c&&y.playerHandler.play()}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,function(){y.remotePlayer.isMuted?y.playerHandler.mute():y.playerHandler.unMute()}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,function(){var e=y.remotePlayer.volumeLevel*r,t=document.getElementById("audio_bg_level");t.style.height=e+"px",t.style.marginTop=-e+"px"}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,function(e){y.isPlayingBreak(e.value)}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,function(e){y.onWhenSkippableChanged(e.value)}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,function(e){y.onCurrentBreakClipTimeChanged(e.value)}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,function(e){y.onBreakClipIdChanged(e.value)}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,function(e){console.log("LIVE_SEEKABLE_RANGE_CHANGED"),y.liveSeekableRange=e.value}.bind(y));var e={};e.play=function(){y.remotePlayer.isPaused&&y.remotePlayerController.playOrPause(),document.getElementById("video_image").style.display="",document.getElementById("video_element").style.display="none"}.bind(y),e.pause=function(){y.remotePlayer.isPaused||y.remotePlayerController.playOrPause()}.bind(y),e.stop=function(){y.remotePlayerController.stop()}.bind(y),e.load=function(e){console.log("Loading..."+this.mediaContents[e].title);var t=new chrome.cast.media.MediaInfo(this.mediaContents[e].sources[0],"video/mp4");t.metadata=new chrome.cast.media.GenericMediaMetadata,t.metadata.metadataType=chrome.cast.media.MetadataType.GENERIC,t.metadata.title=this.mediaContents[e].title,t.metadata.images=[{url:""+this.mediaContents[e].thumb}];var i=new chrome.cast.media.LoadRequest(t);castSession.loadMedia(i).then(this.playerHandler.loaded.bind(this.playerHandler),function(e){this.playerState=m,console.log("Remote media load error: "+p.getErrorMessage(e))}.bind(y))}.bind(y),e.isMediaLoaded=function(e){var t=cast.framework.CastContext.getInstance().getCurrentSession();if(!t)return!1;var i=t.getMediaSession();return!!i&&i.playerState!=d}.bind(y),e.getCurrentMediaTime=function(){return y.isLiveContent&&y.mediaInfo.metadata&&y.mediaInfo.metadata.sectionStartTimeInMedia?y.remotePlayer.currentTime-y.mediaInfo.metadata.sectionStartTimeInMedia:y.remotePlayer.currentTime}.bind(y),e.getMediaDuration=function(){return y.isLiveContent?null==y.mediaInfo.metadata||null==y.mediaInfo.metadata.sectionDuration||null==y.mediaInfo.metadata.sectionStartTimeInMedia?null:y.mediaInfo.metadata.sectionDuration:y.remotePlayer.duration}.bind(y),e.updateDisplay=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e&&e.getMediaSession()&&e.getMediaSession().media){var t=e.getMediaSession(),i=t.media,n=document.getElementById("video_image");i.metadata&&i.metadata.images&&i.metadata.images.length>0&&(n.src=i.metadata.images[0].url),document.getElementById("playerstate").style.display="block",document.getElementById("playerstatebg").style.display="block",document.getElementById("video_image_overlay").style.display="block";var a="",o="",r="";if(i.metadata&&(a=i.metadata.title,a=(a=(o=i.metadata.episodeTitle)?a+": "+o:a)?a+" ":"",r=(r=i.metadata.subtitle)?r+" ":""),DEMO_MODE?(document.getElementById("playerstate").innerHTML=(ENABLE_LIVE?"Live Content ":"Sample Video ")+t.playerState+" on Chromecast",document.getElementById("media_title").innerHTML=ENABLE_LIVE?"Live Content":"Sample Video",document.getElementById("media_subtitle").innerHTML=""):(document.getElementById("playerstate").innerHTML=a+t.playerState+" on "+e.getCastDevice().friendlyName,document.getElementById("media_title").innerHTML=a,document.getElementById("media_subtitle").innerHTML=r),i.streamType==chrome.cast.media.StreamType.LIVE){y.liveSeekableRange=t.liveSeekableRange;var d=document.getElementById("live_indicator");d.style.display="block",y.liveSeekableRange&&Math.abs(t.getEstimatedTime()-y.liveSeekableRange.end)0&&y.endPlayback()},p.prototype.updateProgressBarByTimer=function(){var e=document.getElementById("progress"),t=document.getElementById("progress_indicator");if(null!=y.mediaDuration){t.style.display="",isNaN(parseInt(e.style.width,10))&&(e.style.width="0px");var i=Math.floor(o*y.currentMediaTime/y.mediaDuration);i>o?i=o:i<0&&(i=0),e.style.width=i+"px",t.style.marginLeft=i+"px";var n=document.getElementById("seekable_window"),a=document.getElementById("unseekable_overlay");if(y.isLiveContent)if(y.liveSeekableRange){var r=Math.max(y.mediaInfo.metadata.sectionStartTimeInMedia,y.liveSeekableRange.end)-y.mediaInfo.metadata.sectionStartTimeInMedia,d=Math.floor(o*r/y.mediaDuration);d>o?d=o:d<0&&(d=0),n.style.width=d+"px";var l=Math.max(y.mediaInfo.metadata.sectionStartTimeInMedia,y.liveSeekableRange.start)-y.mediaInfo.metadata.sectionStartTimeInMedia,s=Math.floor(o*l/y.mediaDuration);s>o?s=o:s<0&&(s=0),a.style.width=s+"px"}else n.style.width="0px",a.style.width="600px";else n.style.width="600px",a.style.width="0px";i>=o&&!y.isLiveContent&&y.endPlayback()}else{y.isLiveContent||console.log("Error - Duration is not defined for a VOD stream."),e.style.width="0px";var c=document.getElementById("skip");c&&c.style&&c.style.display&&(c.style.display="none"),t.style.display="none";var u=document.getElementById("seekable_window");u&&u.style&&u.style.width&&(u.style.width="0px");var m=document.getElementById("unseekable_overlay");m&&m.style&&m.style.width&&(m.style.width="0px")}},p.prototype.endPlayback=function(){y.currentMediaTime=0,y.stopProgressTimer(),y.playerState=d,y.playerHandler.updateDisplay();var e=document.getElementById("play");e&&e.style&&e.display&&(e.style.display="block");var t=document.getElementById("pause");t&&t.style&&t.style.display&&(t.style.display="none")},p.prototype.getMediaTimeString=function(e){if(null==e||null==e)return null;var t=!1;e<0&&(t=!0,e*=-1);var i=Math.floor(e/3600),n=Math.floor((e-3600*i)/60),a=Math.floor(e-3600*i-60*n);return i<10&&(i="0"+i),n<10&&(n="0"+n),a<10&&(a="0"+a),(t?"-":"")+i+":"+n+":"+a},p.prototype.getClockTimeString=function(e){if(!e)return"0:00:00";var t=new Date(1e3*e),i=t.getHours(),n=t.getMinutes(),a=t.getSeconds(),o=i>=12?"PM":"AM";return(i=(i%=12)||12)+":"+(n=("0"+n).slice(-2))+":"+(a=("0"+a).slice(-2))+" "+o},p.prototype.updateAdMarkers=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e){var t=e.getMediaSession();if(t){var i=t.media;if(i){var n=i.breaks,a=i.duration;if(n)for(var o=0;oa&&r.isEmbedded))if(!document.getElementById("ad"+r.position))document.getElementById("progress").innerHTML+='
'}}}}},p.prototype.removeAdMarkers=function(){document.querySelectorAll(".adMarker").forEach((function(e){e.remove()}))},p.prototype.adPositionToMargin=function(e,t){return-1==e||e>t?o:o*e/t},p.prototype.onBreakClipIdChanged=function(){var e=document.getElementById("skip");e&&e.style&&e.style.display&&(e.style.display="none")},p.prototype.isPlayingBreak=function(e){y.enableProgressBar(!e)},p.prototype.onWhenSkippableChanged=function(e){y.whenSkippable=e},p.prototype.onCurrentBreakClipTimeChanged=function(e){var t=document.getElementById("skip");null==y.whenSkippable||y.whenSkippable<0?t&&t.style&&t.style.display&&(t.style.display="none"):void 0!==y.whenSkippable||e>=y.whenSkippable?t&&t.style&&t.style.display&&(t.style.display="block"):t&&t.style&&t.style.display&&(t.style.display="none")},p.prototype.skipAd=function(){y.remotePlayerController.skipAd()},p.prototype.enableProgressBar=function(e){var t=document.getElementById("progress"),i=document.getElementById("progress_indicator"),n=document.getElementById("seekable_window");e?(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_progress.png')",t.style.cursor="pointer",n.style.cursor="pointer",i.style.cursor="pointer",i.draggable=!0,t.addEventListener("click",y.seekMediaListener),n.addEventListener("click",y.seekMediaListener),i.addEventListener("dragend",y.seekMediaListener)):(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_buffer.png')",t.style.cursor="default",n.style.cursor="default",i.style.cursor="default",i.draggable=!1,t.removeEventListener("click",y.seekMediaListener),n.removeEventListener("click",y.seekMediaListener),i.removeEventListener("dragend",y.seekMediaListener))},p.prototype.requestFullScreen=function(){var e=document.getElementById("video_element"),t=e.requestFullScreen||e.webkitRequestFullScreen;t&&(t.call(e),console.log("Requested fullscreen"))},p.prototype.cancelFullScreen=function(){var e=document.cancelFullScreen||document.webkitCancelFullScreen;e&&e.call(document)},p.prototype.fullscreenChangeHandler=function(){y.fullscreen=!y.fullscreen},p.prototype.showFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");y.fullscreen?(e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="block")):(e&&e.style&&e.style.display&&(e.style.display="block"),t&&t.style&&t.style.display&&(t.style.display="none"))},p.prototype.hideFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="none")},p.prototype.showMediaControl=function(){var e=document.getElementById("media_control");e&&e.style&&e.opacity&&(e.style.opacity=.7)},p.prototype.hideMediaControl=function(){if("undefined"!=typeof cast){var e=cast.framework.CastContext.getInstance();e&&e.getCurrentSession()?document.getElementById("media_control").style.opacity=.7:document.getElementById("media_control").style.opacity=0}},p.prototype.showVolumeSlider=function(){y.playerHandler.isMuted()||(document.getElementById("audio_bg").style.opacity=1,document.getElementById("audio_bg_track").style.opacity=1,document.getElementById("audio_bg_level").style.opacity=1,document.getElementById("audio_indicator").style.opacity=1)},p.prototype.hideVolumeSlider=function(){document.getElementById("audio_bg").style.opacity=0,document.getElementById("audio_bg_track").style.opacity=0,document.getElementById("audio_bg_level").style.opacity=0,document.getElementById("audio_indicator").style.opacity=0},p.prototype.resetVolumeSlider=function(){var e=.5*document.getElementById("audio_bg_track").clientHeight;document.getElementById("audio_bg_level").style.height=e+"px",document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},p.prototype.initializeUI=function(){document.getElementById("media_title").innerHTML=y.mediaContents[0].title,document.getElementById("media_subtitle").innerHTML=y.mediaContents[y.currentMediaIndex].subtitle,document.getElementById("media_desc").innerHTML=y.mediaContents[y.currentMediaIndex].description,document.getElementById("progress_bg").addEventListener("click",y.seekMedia.bind(y)),document.getElementById("progress").addEventListener("click",y.seekMedia.bind(y)),document.getElementById("progress_indicator").addEventListener("dragend",y.seekMedia.bind(y)),document.getElementById("audio_on").addEventListener("click",y.playerHandler.mute.bind(y.playerHandler)),document.getElementById("audio_off").addEventListener("click",y.playerHandler.unMute.bind(y.playerHandler)),document.getElementById("audio_bg").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_on").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_level").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_track").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_level").addEventListener("click",y.setVolume.bind(y)),document.getElementById("audio_bg_track").addEventListener("click",y.setVolume.bind(y)),document.getElementById("audio_bg").addEventListener("mouseout",y.hideVolumeSlider.bind(y)),document.getElementById("audio_on").addEventListener("mouseout",y.hideVolumeSlider.bind(y)),document.getElementById("main_video").addEventListener("mouseover",y.showMediaControl.bind(y)),document.getElementById("main_video").addEventListener("mouseout",y.hideMediaControl.bind(y)),document.getElementById("media_control").addEventListener("mouseover",y.showMediaControl.bind(y)),document.getElementById("media_control").addEventListener("mouseout",y.hideMediaControl.bind(y)),document.getElementById("fullscreen_expand").addEventListener("click",y.requestFullScreen.bind(y)),document.getElementById("fullscreen_collapse").addEventListener("click",y.cancelFullScreen.bind(y)),document.addEventListener("fullscreenchange",y.fullscreenChangeHandler.bind(y),!1),document.addEventListener("webkitfullscreenchange",y.fullscreenChangeHandler.bind(y),!1),document.getElementById("play").addEventListener("click",y.playerHandler.play.bind(y.playerHandler)),document.getElementById("pause").addEventListener("click",y.playerHandler.pause.bind(y.playerHandler)),document.getElementById("progress_indicator").draggable=!0},p.prototype.addVideoThumbs=function(){if(void 0!==y.mediaJSON&&y.mediaJSON.categories&&y.mediaJSON.categories.length>0){y.mediaContents=y.mediaJSON.categories[0].videos;for(var e=document.getElementById("carousel"),t=null,i=null,n=0;n',t.addEventListener("click",y.selectMedia.bind(this,n)),e.appendChild(t)}},p.prototype.addMediaContents=function(){return void 0!==y.mediaJSON&&y.mediaJSON.categories&&y.mediaJSON.categories.length>0?(y.mediaContents=y.mediaJSON.categories[0].videos,y.mediaContents):null},p.getErrorMessage=function(e){switch(e.code){case chrome.cast.ErrorCode.API_NOT_INITIALIZED:return"The API is not initialized."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CANCEL:return"The operation was canceled by the user"+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CHANNEL_ERROR:return"A channel to the receiver is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.EXTENSION_MISSING:return"The Cast extension is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.INVALID_PARAMETER:return"The parameters to the operation were not valid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:return"No receiver was compatible with the session request."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.SESSION_ERROR:return"A session could not be created, or a session was invalid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.TIMEOUT:return"The operation timed out."+(e.description?" :"+e.description:"");default:return e}};var y=new p;window.__onGCastApiAvailable=function(e){e&&y.initializeCastPlayer()},window.CastPlayer=y,Object.defineProperty(e,"__esModule",{value:!0})})); + ***************************************************************************** */function a(e,t,i,n){var a,o=arguments.length,r=o<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,i,n);else for(var d=e.length-1;d>=0;d--)(a=e[d])&&(r=(o<3?a(r):o>3?a(t,i,r):a(t,i))||r);return o>3&&r&&Object.defineProperty(t,i,r),r}e.ɵa=function(){function e(e){this.ngCastService=e,this.videoImage="",this.imageOffline=!1,this.srcImageOffline=""}return e.prototype.ngOnInit=function(){this.window=window;var e=this.ngCastService;this.window.__onGCastApiAvailable=function(t){t&&e.initializeCastApi()},this.castingStatus=this.ngCastService.getStatus()},e.prototype.openSession=function(){this.ngCastService.discoverDevices()},e.prototype.closeSession=function(){this.ngCastService.discoverDevices()},e}(),a([t.Input()],e.ɵa.prototype,"videoImage",void 0),a([t.Input()],e.ɵa.prototype,"imageOffline",void 0),a([t.Input()],e.ɵa.prototype,"srcImageOffline",void 0),e.ɵa=a([t.Component({selector:"ng-cast",template:'
\n
\x3c!-- Put Your Image Width --\x3e\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\nTV Offline\n',styles:['body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:1100px}#video_image{height:536px;margin:20px auto 0 40px;width:960px}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin:0 0 0 40px;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;width:960px}#video_element{background-color:#000;margin:20px auto 0 40px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin:-4px 0 0 40px;opacity:.9;padding:10px;width:940px}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px;width:95%}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;left:8px;margin:-60px 0 0 40px;opacity:.7;padding:0;position:absolute;top:650px;transition:opacity 1s;width:960px;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}']})],e.ɵa),e.NgCastService=function(){function e(){var e=this;this.window=window,this.status={casting:!1},this.onInitSuccess=function(){console.log("GCast initialization success")},this.onError=function(e){console.log("GCast initialization failed",e)},this.discoverDevices=function(){var t=e,i=new n.Subject;return e.cast.requestSession((function(e){t.session=e,t.setCasting(!0),i.next("CONNECTED")}),(function(e){t.setCasting(!1),"cancel"===e.code?(t.session=void 0,i.next("CANCEL")):console.error("Error selecting a cast device",e)})),i},this.onMediaDiscovered=function(e){var t=window.document.createElement("script");return t.setAttribute("type","text/javascript"),t.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"),window.document.body.appendChild(t),globalThis.CastPlayer.mediaJSON.categories=e,globalThis.CastPlayer.addMediaContents()},this.play=function(){e.currentMedia.play(null)},this.pause=function(){e.currentMedia.pause(null)},this.stop=function(){e.currentMedia.stop(null)},this.onMediaError=function(e){console.error("Error launching media",e)},globalThis.CastPlayer.mediaJSON={categories:[]}}return e.prototype.initializeCastApi=function(){var e=this;this.cast=this.window.chrome.cast;var t=new this.cast.SessionRequest("4F8B3483"),i=new this.cast.ApiConfig(t,(function(){}),(function(t){e.cast.ReceiverAvailability.AVAILABLE}));this.cast.initialize(i,this.onInitSuccess,this.onError)},e.prototype.initialize=function(e){e&&(globalThis.CastPlayer.initializeUI(),globalThis.CastPlayer.setupLocalPlayer(),this.window.__onGCastApiAvailable=function(e){e&&globalThis.CastPlayer.initializeCastPlayer()})},e.prototype.setCasting=function(e){this.status.casting=e},e.prototype.getStatus=function(){return this.status},e}(),e.NgCastService=a([t.Injectable()],e.NgCastService),e.NgCastModule=function(){},e.NgCastModule=a([t.NgModule({schemas:[t.CUSTOM_ELEMENTS_SCHEMA],imports:[i.CommonModule],exports:[e.ɵa],providers:[e.NgCastService],declarations:[e.ɵa]})],e.NgCastModule);var o=600,r=100,d="IDLE",l="BUFFERING",s="LOADED",u="PLAYING",c="PAUSED",p="ERROR",m=function(){this.playerHandler=new g(this),this.playerState=d,this.playerStateBeforeSwitch=null,this.remotePlayer=null,this.remotePlayerController=null,this.currentMediaTime=0,this.mediaDuration=-1,this.timer=null,this.incrementMediaTimeHandler=this.incrementMediaTime.bind(this),this.seekMediaListener=this.seekMedia.bind(this),this.currentMediaIndex=0,this.mediaContents=null,this.fullscreen=!1,this.mediaInfo=null,this.whenSkippable=null,this.liveSeekableRange=null,this.isLiveContent=!1,this.mediaJSON={categories:[]}};m.prototype.initializeCastPlayer=function(){var e={receiverApplicationId:"4F8B3483"};e.autoJoinPolicy=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,cast.framework.CastContext.getInstance().setOptions(e),y.remotePlayer=new cast.framework.RemotePlayer,y.remotePlayerController=new cast.framework.RemotePlayerController(y.remotePlayer),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,y.switchPlayer.bind(y))},m.prototype.switchPlayer=function(){y.stopProgressTimer(),y.resetVolumeSlider(),y.playerHandler.stop(),y.playerState=d,cast&&cast.framework&&y.remotePlayer.isConnected?y.setupRemotePlayer():y.setupLocalPlayer()};var g=function(e){this.target={},this.setTarget=function(e){this.target=e},this.play=function(){e.playerState===u||e.playerState===c||e.playerState===s?(this.target.play(),e.playerState=u,document.getElementById("play").style.display="none",document.getElementById("pause").style.display="block",this.updateDisplayMessage()):this.load(e.currentMediaIndex)},this.updateDisplayMessage=function(){this.target.updateDisplayMessage()},this.pause=function(){this.target.pause(),e.playerState=c,document.getElementById("play").style.display="block",document.getElementById("pause").style.display="none"},this.stop=function(){e.playerState=d,this.target.stop()},this.load=function(t){void 0===t&&(t=null),t||(t=e.currentMediaIndex),e.playerState=l,this.target.load(t)},this.isMediaLoaded=function(e){return this.target.isMediaLoaded(e)},this.prepareToPlay=function(){e.mediaDuration=this.getMediaDuration(),e.playerHandler.updateDurationDisplay(),e.playerState=s,this.play(),e.startProgressTimer(),this.updateDisplay()},this.loaded=function(){e.currentMediaDuration=this.getMediaDuration(),e.updateMediaDuration(),e.playerState=s,e.currentMediaTime>0&&this.seekTo(e.currentMediaTime),this.play(),e.startProgressTimer(),this.updateDisplayMessage()},this.getCurrentMediaTime=function(){return this.target.getCurrentMediaTime()},this.getMediaDuration=function(){return this.target.getMediaDuration()},this.updateDisplay=function(){this.currentMediaTime=this.target.getCurrentMediaTime(),this.mediaDuration=this.target.getMediaDuration(),this.target.updateDisplay()},this.updateCurrentTimeDisplay=function(){this.target.updateCurrentTimeDisplay()},this.setTimeString=function(e,t){this.target.setTimeString(e,t)},this.setVolume=function(e){this.target.setVolume(e)},this.mute=function(){this.target.mute(),document.getElementById("audio_on").style.display="none",document.getElementById("audio_off").style.display="block"},this.unMute=function(){this.target.unMute(),document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},this.isMuted=function(){return this.target.isMuted()},this.seekTo=function(e){this.target.seekTo(e)}};m.prototype.setupLocalPlayer=function(){var e=document.getElementById("video_element");e.addEventListener("loadeddata",y.onMediaLoadedLocally.bind(y));var t={play:function(){e.play(),document.getElementById("video_image").style.display="none",e.style.display="block"},pause:function(){e.pause()},stop:function(){e.stop()}};t.load=function(t){e.src=y.mediaContents[t].sources[0],e.load()}.bind(y),t.getCurrentMediaTime=function(){return e.currentTime},t.getMediaDuration=function(){return e.duration},t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none"},t.setVolume=function(t){e.volume=t0&&y.playerHandler.play()},m.prototype.setupRemotePlayer=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,function(){y.remotePlayer.isPaused?y.playerHandler.pause():y.playerHandler.play()}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,function(){y.remotePlayer.isMuted?y.playerHandler.mute():y.playerHandler.unMute()}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,function(){var e=y.remotePlayer.volumeLevel*r,t=document.getElementById("audio_bg_level");t.style.height=e+"px",t.style.marginTop=-e+"px"}.bind(y));var t={};t.play=function(){y.remotePlayer.isPaused&&y.remotePlayerController.playOrPause(),document.getElementById("video_image").style.display="block",document.getElementById("video_element").style.display="none"}.bind(y),t.pause=function(){y.remotePlayer.isPaused||y.remotePlayerController.playOrPause()}.bind(y),t.stop=function(){y.remotePlayerController.stop()}.bind(y),t.load=function(t){console.log("Loading..."+y.mediaContents[t].title);var i=new chrome.cast.media.MediaInfo(y.mediaContents[t].sources[0],"video/mp4");i.metadata=new chrome.cast.media.GenericMediaMetadata,i.metadata.metadataType=chrome.cast.media.MetadataType.GENERIC,i.metadata.title=y.mediaContents[t].title,i.metadata.images=[{url:""+y.mediaContents[t].thumb}];var n=new chrome.cast.media.LoadRequest(i);e.loadMedia(n).then(y.playerHandler.loaded.bind(y.playerHandler),function(e){y.playerState=p,console.log("Remote media load error: "+m.getErrorMessage(e))}.bind(y))}.bind(y),t.getCurrentMediaTime=function(){return y.remotePlayer.currentTime}.bind(y),t.getMediaDuration=function(){return y.remotePlayer.duration}.bind(y),t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="block",document.getElementById("playerstatebg").style.display="block",document.getElementById("video_image_overlay").style.display="block",document.getElementById("playerstate").innerHTML=y.mediaContents[y.currentMediaIndex].title+" "+y.playerState+" on "+e.getCastDevice().friendlyName}.bind(y),t.setVolume=function(e){var t=y.remotePlayer.volumeLevel,i=document.getElementById("audio_bg_level");if(en&&(e=n+(pos-n)/2),i.style.height=e+"px",i.style.marginTop=-e+"px",t=e/r}else t=1;y.remotePlayer.volumeLevel=t,y.remotePlayerController.setVolumeLevel()}.bind(y),t.mute=function(){y.remotePlayer.isMuted||y.remotePlayerController.muteOrUnmute()}.bind(y),t.unMute=function(){y.remotePlayer.isMuted&&y.remotePlayerController.muteOrUnmute()}.bind(y),t.isMuted=function(){return y.remotePlayer.isMuted}.bind(y),t.seekTo=function(e){y.remotePlayer.currentTime=e,y.remotePlayerController.seek()}.bind(y),y.playerHandler.setTarget(t),y.remotePlayer.isMuted&&y.playerHandler.mute();var i=y.remotePlayer.volumeLevel*r,n=document.getElementById("audio_bg_level");n.style.height=i+"px",n.style.marginTop=-i+"px",y.hideFullscreenButton(),y.playerHandler.play()},m.prototype.onMediaLoadedLocally=function(){document.getElementById("video_element").currentTime=y.currentMediaTime,y.playerHandler.loaded()},m.prototype.selectMedia=function(e){console.log("Media index selected: "+e),y.currentMediaIndex=e,y.playerHandler.currentMediaInfo=void 0,document.getElementById("video_image").src=""+y.mediaContents[e].thumb,document.getElementById("progress_indicator").style.marginLeft="0px",document.getElementById("progress").style.width="0px";var t=document.getElementById("seekable_window"),i=document.getElementById("unseekable_overlay");t.style.width=o,i.style.width="0px",y.stopProgressTimer(),y.currentMediaTime=0,y.playerHandler.setTimeString(document.getElementById("currentTime"),0),y.playerHandler.setTimeString(document.getElementById("duration"),0),y.playerState=d,y.playerHandler.play()},m.prototype.seekMedia=function(e){if(null==y.mediaDuration||cast.framework.CastContext.getInstance().getCurrentSession()&&!y.remotePlayer.canSeek)console.log("Error - Not seekable");else if(!y.isLiveContent||y.liveSeekableRange){var t=parseInt(e.offsetX,10),i=document.getElementById("progress_indicator"),n=document.getElementById("progress"),a=0,r=0,d=0;"progress_indicator"==e.currentTarget.id?(a=parseInt(y.currentMediaTime+y.mediaDuration*t/o,10),r=parseInt(i.style.marginLeft,10)+t,d=parseInt(n.style.width,10)+t):(a=parseInt(t*y.mediaDuration/o,10),r=t,d=t),y.playerState!==u&&y.playerState!==c||(y.currentMediaTime=a,n.style.width=d+"px",i.style.marginLeft=r+"px"),y.isLiveContent&&(a+=y.mediaInfo.metadata.sectionStartTimeInMedia),y.playerHandler.seekTo(a)}else console.log("Live content has no seekable range.")},m.prototype.setVolume=function(e){var t=document.getElementById("audio_bg_level"),i=0;i="audio_bg_track"===e.currentTarget.id?r-parseInt(e.offsetY,10):parseInt(t.clientHeight,10)-parseInt(e.offsetY,10),y.playerHandler.setVolume(i)},m.prototype.startProgressTimer=function(){y.stopProgressTimer(),y.timer=setInterval(y.incrementMediaTimeHandler,1e3)},m.prototype.stopProgressTimer=function(){y.timer&&(clearInterval(y.timer),y.timer=null)},m.prototype.incrementMediaTime=function(){y.currentMediaTime=y.playerHandler.getCurrentMediaTime(),y.currentMediaDuration=y.playerHandler.getMediaDuration(),y.playerState===u&&(y.currentMediaTime0)var t=Math.floor(o*y.currentMediaTime/y.currentMediaDuration);e.style.width=t+"px",document.getElementById("progress_indicator").style.marginLeft=-621+t+"px",t>=o&&y.endPlayback()},m.prototype.endPlayback=function(){y.currentMediaTime=0,y.stopProgressTimer(),y.playerState=d,y.playerHandler.updateDisplay();var e=document.getElementById("play");e&&e.style&&e.display&&(e.style.display="block");var t=document.getElementById("pause");t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.getMediaTimeString=function(e){if(null==e||null==e)return null;var t=!1;e<0&&(t=!0,e*=-1);var i=Math.floor(e/3600),n=Math.floor((e-3600*i)/60),a=Math.floor(e-3600*i-60*n);return i<10&&(i="0"+i),n<10&&(n="0"+n),a<10&&(a="0"+a),(t?"-":"")+i+":"+n+":"+a},m.prototype.getClockTimeString=function(e){if(!e)return"0:00:00";var t=new Date(1e3*e),i=t.getHours(),n=t.getMinutes(),a=t.getSeconds(),o=i>=12?"PM":"AM";return(i=(i%=12)||12)+":"+(n=("0"+n).slice(-2))+":"+(a=("0"+a).slice(-2))+" "+o},m.prototype.updateAdMarkers=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e){var t=e.getMediaSession();if(t){var i=t.media;if(i){var n=i.breaks,a=i.duration;if(n)for(var o=0;oa&&r.isEmbedded))if(!document.getElementById("ad"+r.position))document.getElementById("progress").innerHTML+='
'}}}}},m.prototype.removeAdMarkers=function(){document.querySelectorAll(".adMarker").forEach((function(e){e.remove()}))},m.prototype.adPositionToMargin=function(e,t){return-1==e||e>t?o:o*e/t},m.prototype.onBreakClipIdChanged=function(){var e=document.getElementById("skip");e&&e.style&&e.style.display&&(e.style.display="none")},m.prototype.isPlayingBreak=function(e){y.enableProgressBar(!e)},m.prototype.onWhenSkippableChanged=function(e){y.whenSkippable=e},m.prototype.onCurrentBreakClipTimeChanged=function(e){var t=document.getElementById("skip");null==y.whenSkippable||y.whenSkippable<0?t&&t.style&&t.style.display&&(t.style.display="none"):void 0!==y.whenSkippable||e>=y.whenSkippable?t&&t.style&&t.style.display&&(t.style.display="block"):t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.skipAd=function(){y.remotePlayerController.skipAd()},m.prototype.enableProgressBar=function(e){var t=document.getElementById("progress"),i=document.getElementById("progress_indicator"),n=document.getElementById("seekable_window");e?(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_progress.png')",t.style.cursor="pointer",n.style.cursor="pointer",i.style.cursor="pointer",i.draggable=!0,t.addEventListener("click",y.seekMediaListener),n.addEventListener("click",y.seekMediaListener),i.addEventListener("dragend",y.seekMediaListener)):(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_buffer.png')",t.style.cursor="default",n.style.cursor="default",i.style.cursor="default",i.draggable=!1,t.removeEventListener("click",y.seekMediaListener),n.removeEventListener("click",y.seekMediaListener),i.removeEventListener("dragend",y.seekMediaListener))},m.prototype.updateMediaDuration=function(){document.getElementById("duration").innerHTML=m.getDurationString(y.currentMediaDuration)},m.getDurationString=function(e){var t=""+Math.floor(e%60),i=Math.floor(e/60);if(0===i)return t;t=i%60+":"+t;var n=Math.floor(i/60);return 0===n?t:n+":"+t},m.prototype.requestFullScreen=function(){var e=document.getElementById("video_element"),t=e.requestFullScreen||e.webkitRequestFullScreen;t&&(t.call(e),console.log("Requested fullscreen"))},m.prototype.cancelFullScreen=function(){var e=document.cancelFullScreen||document.webkitCancelFullScreen;e&&e.call(document)},m.prototype.fullscreenChangeHandler=function(){y.fullscreen=!y.fullscreen},m.prototype.showFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");y.fullscreen?(e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="block")):(e&&e.style&&e.style.display&&(e.style.display="block"),t&&t.style&&t.style.display&&(t.style.display="none"))},m.prototype.hideFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.showMediaControl=function(){var e=document.getElementById("media_control");e&&e.style&&e.style.opacity&&(e.style.opacity=.7)},m.prototype.hideMediaControl=function(){if("undefined"!=typeof cast){var e=cast.framework.CastContext.getInstance();e&&e.getCurrentSession()?document.getElementById("media_control").style.opacity=.7:document.getElementById("media_control").style.opacity=0}},m.prototype.showVolumeSlider=function(){y.playerHandler.isMuted()||(document.getElementById("audio_bg").style.opacity=1,document.getElementById("audio_bg_track").style.opacity=1,document.getElementById("audio_bg_level").style.opacity=1,document.getElementById("audio_indicator").style.opacity=1)},m.prototype.hideVolumeSlider=function(){document.getElementById("audio_bg").style.opacity=0,document.getElementById("audio_bg_track").style.opacity=0,document.getElementById("audio_bg_level").style.opacity=0,document.getElementById("audio_indicator").style.opacity=0},m.prototype.resetVolumeSlider=function(){var e=.5*document.getElementById("audio_bg_track").clientHeight;document.getElementById("audio_bg_level").style.height=e+"px",document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},m.prototype.initializeUI=function(){document.getElementById("media_title").innerHTML=y.mediaContents[0].title,document.getElementById("media_subtitle").innerHTML=y.mediaContents[y.currentMediaIndex].subtitle,document.getElementById("media_desc").innerHTML=y.mediaContents[y.currentMediaIndex].description,document.getElementById("progress_bg").addEventListener("click",y.seekMedia.bind(y)),document.getElementById("progress").addEventListener("click",y.seekMedia.bind(y)),document.getElementById("progress_indicator").addEventListener("dragend",y.seekMedia.bind(y)),document.getElementById("audio_on").addEventListener("click",y.playerHandler.mute.bind(y.playerHandler)),document.getElementById("audio_off").addEventListener("click",y.playerHandler.unMute.bind(y.playerHandler)),document.getElementById("audio_bg").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_on").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_level").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_track").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_level").addEventListener("click",y.setVolume.bind(y)),document.getElementById("audio_bg_track").addEventListener("click",y.setVolume.bind(y)),document.getElementById("audio_bg").addEventListener("mouseout",y.hideVolumeSlider.bind(y)),document.getElementById("audio_on").addEventListener("mouseout",y.hideVolumeSlider.bind(y)),document.getElementById("main_video").addEventListener("mouseover",y.showMediaControl.bind(y)),document.getElementById("main_video").addEventListener("mouseout",y.hideMediaControl.bind(y)),document.getElementById("media_control").addEventListener("mouseover",y.showMediaControl.bind(y)),document.getElementById("media_control").addEventListener("mouseout",y.hideMediaControl.bind(y)),document.getElementById("fullscreen_expand").addEventListener("click",y.requestFullScreen.bind(y)),document.getElementById("fullscreen_collapse").addEventListener("click",y.cancelFullScreen.bind(y)),document.addEventListener("fullscreenchange",y.fullscreenChangeHandler.bind(y),!1),document.addEventListener("webkitfullscreenchange",y.fullscreenChangeHandler.bind(y),!1),document.getElementById("play").addEventListener("click",y.playerHandler.play.bind(y.playerHandler)),document.getElementById("pause").addEventListener("click",y.playerHandler.pause.bind(y.playerHandler)),document.getElementById("progress_indicator").draggable=!0},m.prototype.addVideoThumbs=function(){if(void 0!==y.mediaJSON&&y.mediaJSON.categories&&y.mediaJSON.categories.length>0){y.mediaContents=y.mediaJSON.categories[0].videos;for(var e=document.getElementById("carousel"),t=null,i=null,n=0;n',t.addEventListener("click",y.selectMedia.bind(y,n)),e.appendChild(t)}},m.prototype.addMediaContents=function(){return void 0!==y.mediaJSON&&y.mediaJSON.categories&&y.mediaJSON.categories.length>0?(y.mediaContents=y.mediaJSON.categories[0].videos,y.mediaContents):null},m.getErrorMessage=function(e){switch(e.code){case chrome.cast.ErrorCode.API_NOT_INITIALIZED:return"The API is not initialized."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CANCEL:return"The operation was canceled by the user"+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CHANNEL_ERROR:return"A channel to the receiver is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.EXTENSION_MISSING:return"The Cast extension is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.INVALID_PARAMETER:return"The parameters to the operation were not valid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:return"No receiver was compatible with the session request."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.SESSION_ERROR:return"A session could not be created, or a session was invalid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.TIMEOUT:return"The operation timed out."+(e.description?" :"+e.description:"");default:return e}};var y=new m;window.__onGCastApiAvailable=function(e){e&&y.initializeCastPlayer()},window.CastPlayer=y,Object.defineProperty(e,"__esModule",{value:!0})})); //# sourceMappingURL=thinkam.net-ng-cast.umd.min.js.map \ No newline at end of file diff --git a/dist/bundles/thinkam.net-ng-cast.umd.min.js.map b/dist/bundles/thinkam.net-ng-cast.umd.min.js.map index bf721d4..2e5a70e 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.min.js.map +++ b/dist/bundles/thinkam.net-ng-cast.umd.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","NgCastComponent","ngCastService","this","videoImage","imageOffline","srcImageOffline","prototype","ngOnInit","window","isAvailable","initializeCastApi","castingStatus","getStatus","openSession","discoverDevices","closeSession","tslib_1.__decorate","Input","Component","selector","template","NgCastService","_this","status","casting","onInitSuccess","console","log","onError","err","self","subj","Subject","cast","requestSession","s","session","setCasting","next","code","undefined","error","onMediaDiscovered","categories","script","createElement","setAttribute","body","appendChild","globalThis","CastPlayer","mediaJSON","addMediaContents","play","currentMedia","pause","stop","onMediaError","sessionRequest","SessionRequest","apiConfig","ApiConfig","ReceiverAvailability","AVAILABLE","initialize","mediaContents","initializeUI","setupLocalPlayer","value","Injectable","NgCastModule","NgModule","schemas","CUSTOM_ELEMENTS_SCHEMA","imports","CommonModule","exports","providers","declarations","PROGRESS_BAR_WIDTH","FULL_VOLUME_HEIGHT","PLAYER_STATE","playerHandler","PlayerHandler","playerState","playerStateBeforeSwitch","remotePlayer","remotePlayerController","currentMediaTime","mediaDuration","timer","incrementMediaTimeHandler","incrementMediaTime","bind","seekMediaListener","seekMedia","currentMediaIndex","fullscreen","mediaInfo","whenSkippable","liveSeekableRange","isLiveContent","initializeCastPlayer","options","receiverApplicationId","autoJoinPolicy","chrome","AutoJoinPolicy","ORIGIN_SCOPED","framework","CastContext","getInstance","setOptions","castPlayer","RemotePlayer","RemotePlayerController","addEventListener","RemotePlayerEventType","IS_CONNECTED_CHANGED","switchPlayer","stopProgressTimer","resetVolumeSlider","isConnected","setupRemotePlayer","setTarget","isMediaLoaded","document","getElementById","style","display","load","mediaIndex","prepareToPlay","getMediaDuration","updateDurationDisplay","startProgressTimer","updateDisplay","getCurrentMediaTime","updateCurrentTimeDisplay","setTimeString","element","time","setVolume","volumeSliderPosition","mute","unMute","isMuted","seekTo","localPlayer","onMediaLoadedLocally","playerTarget","src","currentTime","duration","updateDisplayMessage","volume","p","height","marginTop","muted","DEFAULT_VOLUME","showFullscreenButton","MEDIA_INFO_CHANGED","event","getCurrentSession","media","getMediaSession","streamType","StreamType","LIVE","removeAdMarkers","updateAdMarkers","CAN_SEEK_CHANGED","enableProgressBar","IS_PAUSED_CHANGED","isPaused","IS_MUTED_CHANGED","VOLUME_LEVEL_CHANGED","newVolume","volumeLevel","IS_PLAYING_BREAK_CHANGED","isPlayingBreak","WHEN_SKIPPABLE_CHANGED","onWhenSkippableChanged","CURRENT_BREAK_CLIP_TIME_CHANGED","onCurrentBreakClipTimeChanged","BREAK_CLIP_ID_CHANGED","onBreakClipIdChanged","LIVE_SEEKABLE_RANGE_CHANGED","playOrPause","MediaInfo","metadata","GenericMediaMetadata","metadataType","MetadataType","GENERIC","title","images","url","request","LoadRequest","castSession","loadMedia","then","loaded","errorCode","getErrorMessage","sectionStartTimeInMedia","sectionDuration","vi","mediaTitle","mediaEpisodeTitle","mediaSubtitle","episodeTitle","subtitle","DEMO_MODE","innerHTML","ENABLE_LIVE","getCastDevice","friendlyName","live_indicator","Math","abs","getEstimatedTime","end","LIVE_INDICATOR_BUFFER","currentTimeString","getMediaTimeString","sectionStartAbsoluteTime","getClockTimeString","currentVolume","setVolumeLevel","muteOrUnmute","seek","canSeek","opacity","hideFullscreenButton","getSessionState","SessionState","SESSION_RESUMED","selectMedia","currentMediaInfo","marginLeft","width","seekable_window","unseekable_overlay","position","parseInt","offsetX","pi","progress","seekTime","pp","pw","currentTarget","id","mouseEvent","pos","offsetY","clientHeight","setInterval","clearInterval","updateProgressBarByTimer","endPlayback","progressBar","isNaN","floor","seekableMediaPosition","max","seekableWidth","unseekableMediaPosition","start","unseekableWidth","skip","seekable_window_1","unseekable_overlay_1","timestamp","isNegative","hours","minutes","seconds","date","Date","getHours","getMinutes","getSeconds","ampm","slice","breaks","contentDuration","adBreak","isEmbedded","adPositionToMargin","querySelectorAll","forEach","adMarker","remove","currentBreakClipTime","skipAd","enable","progress_indicator","backgroundImage","cursor","draggable","removeEventListener","requestFullScreen","requestMethod","call","cancelFullScreen","fullscreenChangeHandler","fullscreen_expand","fullscreen_collapse","showMediaControl","media_control","hideMediaControl","context","showVolumeSlider","hideVolumeSlider","defaultVolumeSliderHeight","addVideoThumbs","ni","newdiv","divIdName","ErrorCode","API_NOT_INITIALIZED","description","CANCEL","CHANNEL_ERROR","EXTENSION_MISSING","INVALID_PARAMETER","RECEIVER_UNAVAILABLE","SESSION_ERROR","TIMEOUT"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n castPlayer.mediaInfo = null;\n castPlayer.isLiveContent = false;\n castPlayer.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n castPlayer.mediaInfo = null;\n castPlayer.isLiveContent = false;\n castPlayer.playerHandler.updateDisplay();\n return;\n }\n\n castPlayer.mediaInfo = media.media;\n\n if (castPlayer.mediaInfo) {\n castPlayer.isLiveContent = (castPlayer.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n castPlayer.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && castPlayer.playerState !== PLAYER_STATE.PLAYING) {\n castPlayer.playerHandler.prepareToPlay();\n }\n\n castPlayer.removeAdMarkers();\n castPlayer.updateAdMarkers();\n\n castPlayer.playerHandler.updateDisplay();\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n castPlayer.enableProgressBar(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else if (castPlayer.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n castPlayer.isPlayingBreak(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n castPlayer.onWhenSkippableChanged(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n castPlayer.onCurrentBreakClipTimeChanged(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n castPlayer.onBreakClipIdChanged(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n castPlayer.liveSeekableRange = event.value;\n }.bind(castPlayer)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n this.playerHandler.loaded.bind(this.playerHandler),\n function (errorCode) {\n this.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(castPlayer);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (castPlayer.isLiveContent && castPlayer.mediaInfo.metadata &&\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia) {\n return castPlayer.remotePlayer.currentTime - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return castPlayer.remotePlayer.currentTime;\n }\n }.bind(castPlayer);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (castPlayer.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (castPlayer.mediaInfo.metadata == undefined ||\n castPlayer.mediaInfo.metadata.sectionDuration == undefined ||\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return castPlayer.mediaInfo.metadata.sectionDuration;\n } else {\n return castPlayer.remotePlayer.duration;\n }\n }.bind(castPlayer);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n castPlayer.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (castPlayer.liveSeekableRange && (Math.abs(media.getEstimatedTime() - castPlayer.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(castPlayer);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), castPlayer.playerHandler.getCurrentMediaTime());\n }.bind(castPlayer);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = castPlayer.getMediaTimeString(time);\n\n if (castPlayer.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (castPlayer.mediaInfo.metadata && castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = castPlayer.getClockTimeString(time + castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function () {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n castPlayer.enableProgressBar(castPlayer.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n castPlayer.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n castPlayer.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n castPlayer.removeAdMarkers();\n castPlayer.updateAdMarkers();\n } else {\n castPlayer.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.mediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n castPlayer.playerHandler.updateDurationDisplay();\n\n if (castPlayer.mediaDuration == null || castPlayer.currentMediaTime < castPlayer.mediaDuration || castPlayer.isLiveContent) {\n castPlayer.playerHandler.updateCurrentTimeDisplay();\n castPlayer.updateProgressBarByTimer();\n } else if (castPlayer.mediaDuration > 0) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (castPlayer.mediaDuration == null) {\n if (!castPlayer.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n\n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (castPlayer.isLiveContent) {\n if (castPlayer.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.end) -\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / castPlayer.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.start) -\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / castPlayer.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !castPlayer.isLiveContent) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n"]} \ No newline at end of file +{"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","NgCastComponent","ngCastService","this","videoImage","imageOffline","srcImageOffline","prototype","ngOnInit","window","isAvailable","initializeCastApi","castingStatus","getStatus","openSession","discoverDevices","closeSession","tslib_1.__decorate","Input","Component","selector","template","NgCastService","_this","status","casting","onInitSuccess","console","log","onError","err","self","subj","Subject","cast","requestSession","s","session","setCasting","next","code","undefined","error","onMediaDiscovered","categories","script","createElement","setAttribute","body","appendChild","globalThis","CastPlayer","mediaJSON","addMediaContents","play","currentMedia","pause","stop","onMediaError","sessionRequest","SessionRequest","apiConfig","ApiConfig","ReceiverAvailability","AVAILABLE","initialize","mediaContents","initializeUI","setupLocalPlayer","initializeCastPlayer","value","Injectable","NgCastModule","NgModule","schemas","CUSTOM_ELEMENTS_SCHEMA","imports","CommonModule","exports","providers","declarations","PROGRESS_BAR_WIDTH","FULL_VOLUME_HEIGHT","PLAYER_STATE","playerHandler","PlayerHandler","playerState","playerStateBeforeSwitch","remotePlayer","remotePlayerController","currentMediaTime","mediaDuration","timer","incrementMediaTimeHandler","incrementMediaTime","bind","seekMediaListener","seekMedia","currentMediaIndex","fullscreen","mediaInfo","whenSkippable","liveSeekableRange","isLiveContent","options","receiverApplicationId","autoJoinPolicy","chrome","AutoJoinPolicy","ORIGIN_SCOPED","framework","CastContext","getInstance","setOptions","castPlayer","RemotePlayer","RemotePlayerController","addEventListener","RemotePlayerEventType","IS_CONNECTED_CHANGED","switchPlayer","stopProgressTimer","resetVolumeSlider","isConnected","setupRemotePlayer","setTarget","document","getElementById","style","display","updateDisplayMessage","load","mediaIndex","isMediaLoaded","prepareToPlay","getMediaDuration","updateDurationDisplay","startProgressTimer","updateDisplay","loaded","currentMediaDuration","updateMediaDuration","seekTo","getCurrentMediaTime","updateCurrentTimeDisplay","setTimeString","element","time","setVolume","volumeSliderPosition","mute","unMute","isMuted","localPlayer","onMediaLoadedLocally","playerTarget","src","currentTime","duration","volume","p","height","marginTop","muted","DEFAULT_VOLUME","showFullscreenButton","castSession","getCurrentSession","IS_PAUSED_CHANGED","isPaused","IS_MUTED_CHANGED","VOLUME_LEVEL_CHANGED","newVolume","volumeLevel","playOrPause","media","MediaInfo","metadata","GenericMediaMetadata","metadataType","MetadataType","GENERIC","title","images","url","request","LoadRequest","loadMedia","then","errorCode","getErrorMessage","innerHTML","getCastDevice","friendlyName","currentVolume","vScale","pos","setVolumeLevel","muteOrUnmute","seek","hideFullscreenButton","selectMedia","currentMediaInfo","marginLeft","width","seekable_window","unseekable_overlay","event","canSeek","position","parseInt","offsetX","pi","progress","seekTime","pp","pw","currentTarget","id","sectionStartTimeInMedia","mouseEvent","offsetY","clientHeight","setInterval","clearInterval","updateProgressBarByTimer","endPlayback","isNaN","Math","floor","getMediaTimeString","timestamp","isNegative","hours","minutes","seconds","getClockTimeString","date","Date","getHours","getMinutes","getSeconds","ampm","slice","updateAdMarkers","getMediaSession","breaks","contentDuration","adBreak","isEmbedded","adPositionToMargin","removeAdMarkers","querySelectorAll","forEach","adMarker","remove","onBreakClipIdChanged","skip","isPlayingBreak","enableProgressBar","onWhenSkippableChanged","onCurrentBreakClipTimeChanged","currentBreakClipTime","skipAd","enable","progress_indicator","backgroundImage","cursor","draggable","removeEventListener","getDurationString","durationInSec","durationString","durationInMin","durationInHour","requestFullScreen","requestMethod","call","cancelFullScreen","fullscreenChangeHandler","fullscreen_expand","fullscreen_collapse","showMediaControl","media_control","opacity","hideMediaControl","context","showVolumeSlider","hideVolumeSlider","defaultVolumeSliderHeight","addVideoThumbs","ni","newdiv","divIdName","ErrorCode","API_NOT_INITIALIZED","description","CANCEL","CHANNEL_ERROR","EXTENSION_MISSING","INVALID_PARAMETER","RECEIVER_UNAVAILABLE","SESSION_ERROR","TIMEOUT"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n this.window['__onGCastApiAvailable'] = (isAvailable: boolean) => {\n if (isAvailable) {\n globalThis.CastPlayer.initializeCastPlayer();\n }\n };\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n"]} \ No newline at end of file diff --git a/dist/esm2015/shared/ng-cast.service.js b/dist/esm2015/shared/ng-cast.service.js index b1bf242..4b99794 100644 --- a/dist/esm2015/shared/ng-cast.service.js +++ b/dist/esm2015/shared/ng-cast.service.js @@ -67,6 +67,11 @@ let NgCastService = class NgCastService { if (mediaContents) { globalThis.CastPlayer.initializeUI(); globalThis.CastPlayer.setupLocalPlayer(); + this.window['__onGCastApiAvailable'] = (isAvailable) => { + if (isAvailable) { + globalThis.CastPlayer.initializeCastPlayer(); + } + }; } } setCasting(value) { @@ -80,4 +85,4 @@ NgCastService = tslib_1.__decorate([ Injectable() ], NgCastService); export { NgCastService }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3RoaW5rZXIvZGV2L3RoaW5rYW0vbmdDYXN0LyIsInNvdXJjZXMiOlsic2hhcmVkL25nLWNhc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTy9CLElBQWEsYUFBYSxHQUExQixNQUFhLGFBQWE7SUFTeEI7UUFOUSxXQUFNLEdBQVEsTUFBTSxDQUFDO1FBRXRCLFdBQU0sR0FBRztZQUNkLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztRQWtCRixrQkFBYSxHQUFHO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQztRQUVGLFlBQU8sR0FBRyxVQUFVLEdBQVE7WUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUM7UUFFRixvQkFBZSxHQUFHLEdBQUcsRUFBRTtZQUNyQixJQUFJLElBQUksR0FBUSxJQUFJLENBQUM7WUFDckIsSUFBSSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QixDQUFDLEVBQUUsVUFBVSxHQUFRO2dCQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO29CQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztvQkFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDckI7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsRUFBRSxHQUFHLENBQUMsQ0FBQztpQkFDckQ7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO1FBRUYsc0JBQWlCLEdBQUcsQ0FBQyxVQUFpQixFQUFFLEVBQUU7WUFDeEMsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4RCxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLDRFQUE0RSxDQUFDLENBQUM7WUFDekcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFNUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztZQUV4RCxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNsRCxDQUFDLENBQUM7UUFTRixTQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ1YsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDO1FBRUYsVUFBSyxHQUFHLEdBQUcsRUFBRTtZQUNYLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQztRQUVGLFNBQUksR0FBRyxHQUFHLEVBQUU7WUFDVixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUM7UUFFRixpQkFBWSxHQUFHLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUM7UUExRUEsVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUc7WUFDaEMsVUFBVSxFQUFFLEVBQUU7U0FDZixDQUFDO0lBQ0osQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdkMsSUFBSSxjQUFjLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5RCxJQUFJLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFDcEQsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUNULENBQUMsTUFBVyxFQUFFLEVBQUUsR0FBRyxJQUFJLE1BQU0sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUNsRixDQUFDO1FBQ0YsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFBQSxDQUFDO0lBd0NGLFVBQVUsQ0FBQyxhQUFrQjtRQUMzQixJQUFJLGFBQWEsRUFBRTtZQUNqQixVQUFVLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3JDLFVBQVUsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUMxQztJQUNILENBQUM7SUFrQkQsVUFBVSxDQUFDLEtBQVU7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFBO0lBQ3BCLENBQUM7Q0FDRixDQUFBO0FBN0ZZLGFBQWE7SUFEekIsVUFBVSxFQUFFO0dBQ0EsYUFBYSxDQTZGekI7U0E3RlksYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIHZhciBDYXN0UGxheWVyOiBhbnk7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ0Nhc3RTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjYXN0OiBhbnk7XG4gIHByaXZhdGUgY3VycmVudE1lZGlhOiBhbnk7XG4gIHByaXZhdGUgd2luZG93OiBhbnkgPSB3aW5kb3c7XG5cbiAgcHVibGljIHN0YXR1cyA9IHtcbiAgICBjYXN0aW5nOiBmYWxzZVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5tZWRpYUpTT04gPSB7XG4gICAgICBjYXRlZ29yaWVzOiBbXVxuICAgIH07XG4gIH1cblxuICBpbml0aWFsaXplQ2FzdEFwaSgpIHtcbiAgICB0aGlzLmNhc3QgPSB0aGlzLndpbmRvd1snY2hyb21lJ10uY2FzdDtcbiAgICBsZXQgc2Vzc2lvblJlcXVlc3QgPSBuZXcgdGhpcy5jYXN0LlNlc3Npb25SZXF1ZXN0KCc0RjhCMzQ4MycpO1xuICAgIGxldCBhcGlDb25maWcgPSBuZXcgdGhpcy5jYXN0LkFwaUNvbmZpZyhzZXNzaW9uUmVxdWVzdCxcbiAgICAgICgpID0+IHsgfSxcbiAgICAgIChzdGF0dXM6IGFueSkgPT4geyBpZiAoc3RhdHVzID09PSB0aGlzLmNhc3QuUmVjZWl2ZXJBdmFpbGFiaWxpdHkuQVZBSUxBQkxFKSB7IH0gfVxuICAgICk7XG4gICAgbGV0IHggPSB0aGlzLmNhc3QuaW5pdGlhbGl6ZShhcGlDb25maWcsIHRoaXMub25Jbml0U3VjY2VzcywgdGhpcy5vbkVycm9yKTtcbiAgfTtcblxuICBvbkluaXRTdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUubG9nKCdHQ2FzdCBpbml0aWFsaXphdGlvbiBzdWNjZXNzJyk7XG4gIH07XG5cbiAgb25FcnJvciA9IGZ1bmN0aW9uIChlcnI6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCdHQ2FzdCBpbml0aWFsaXphdGlvbiBmYWlsZWQnLCBlcnIpO1xuICB9O1xuXG4gIGRpc2NvdmVyRGV2aWNlcyA9ICgpID0+IHtcbiAgICBsZXQgc2VsZjogYW55ID0gdGhpcztcbiAgICBsZXQgc3ViaiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgdGhpcy5jYXN0LnJlcXVlc3RTZXNzaW9uKChzOiBhbnkpID0+IHtcbiAgICAgIHNlbGYuc2Vzc2lvbiA9IHM7XG4gICAgICBzZWxmLnNldENhc3RpbmcodHJ1ZSk7XG4gICAgICBzdWJqLm5leHQoJ0NPTk5FQ1RFRCcpO1xuICAgIH0sIGZ1bmN0aW9uIChlcnI6IGFueSkge1xuICAgICAgc2VsZi5zZXRDYXN0aW5nKGZhbHNlKTtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ2NhbmNlbCcpIHtcbiAgICAgICAgc2VsZi5zZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBzdWJqLm5leHQoJ0NBTkNFTCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc2VsZWN0aW5nIGEgY2FzdCBkZXZpY2UnLCBlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzdWJqO1xuICB9O1xuXG4gIG9uTWVkaWFEaXNjb3ZlcmVkID0gKGNhdGVnb3JpZXM6IGFueVtdKSA9PiB7XG4gICAgbGV0IHNjcmlwdCA9IHdpbmRvd1snZG9jdW1lbnQnXS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvamF2YXNjcmlwdCcpO1xuICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3NyYycsICdodHRwczovL3d3dy5nc3RhdGljLmNvbS9jdi9qcy9zZW5kZXIvdjEvY2FzdF9zZW5kZXIuanM/bG9hZENhc3RGcmFtZXdvcms9MScpO1xuICAgIHdpbmRvd1snZG9jdW1lbnQnXS5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIubWVkaWFKU09OLmNhdGVnb3JpZXMgPSBjYXRlZ29yaWVzO1xuXG4gICAgcmV0dXJuIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5hZGRNZWRpYUNvbnRlbnRzKCk7XG4gIH07XG5cbiAgaW5pdGlhbGl6ZShtZWRpYUNvbnRlbnRzOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAobWVkaWFDb250ZW50cykge1xuICAgICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLmluaXRpYWxpemVVSSgpO1xuICAgICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLnNldHVwTG9jYWxQbGF5ZXIoKTtcbiAgICB9XG4gIH1cblxuICBwbGF5ID0gKCkgPT4ge1xuICAgIHRoaXMuY3VycmVudE1lZGlhLnBsYXkobnVsbCk7XG4gIH07XG5cbiAgcGF1c2UgPSAoKSA9PiB7XG4gICAgdGhpcy5jdXJyZW50TWVkaWEucGF1c2UobnVsbCk7XG4gIH07XG5cbiAgc3RvcCA9ICgpID0+IHtcbiAgICB0aGlzLmN1cnJlbnRNZWRpYS5zdG9wKG51bGwpO1xuICB9O1xuXG4gIG9uTWVkaWFFcnJvciA9IChlcnI6IGFueSkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxhdW5jaGluZyBtZWRpYScsIGVycik7XG4gIH07XG5cbiAgc2V0Q2FzdGluZyh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5zdGF0dXMuY2FzdGluZyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0U3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXR1c1xuICB9XG59XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3RoaW5rZXIvZGV2L3RoaW5rYW0vbmdDYXN0LyIsInNvdXJjZXMiOlsic2hhcmVkL25nLWNhc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTy9CLElBQWEsYUFBYSxHQUExQixNQUFhLGFBQWE7SUFTeEI7UUFOUSxXQUFNLEdBQVEsTUFBTSxDQUFDO1FBRXRCLFdBQU0sR0FBRztZQUNkLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztRQWtCRixrQkFBYSxHQUFHO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQztRQUVGLFlBQU8sR0FBRyxVQUFVLEdBQVE7WUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUM7UUFFRixvQkFBZSxHQUFHLEdBQUcsRUFBRTtZQUNyQixJQUFJLElBQUksR0FBUSxJQUFJLENBQUM7WUFDckIsSUFBSSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QixDQUFDLEVBQUUsVUFBVSxHQUFRO2dCQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO29C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OUM7WUFDSCxDQUFDLENBQUM7U0FDSDtJQUNILENBQUM7SUFrQkQsVUFBVSxDQUFDLEtBQVU7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFBO0lBQ3BCLENBQUM7Q0FDRixDQUFBO0FBbEdZLGFBQWE7SUFEekIsVUFBVSxFQUFFO0dBQ0EsYUFBYSxDQWtHekI7U0FsR1ksYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIHZhciBDYXN0UGxheWVyOiBhbnk7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ0Nhc3RTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjYXN0OiBhbnk7XG4gIHByaXZhdGUgY3VycmVudE1lZGlhOiBhbnk7XG4gIHByaXZhdGUgd2luZG93OiBhbnkgPSB3aW5kb3c7XG5cbiAgcHVibGljIHN0YXR1cyA9IHtcbiAgICBjYXN0aW5nOiBmYWxzZVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5tZWRpYUpTT04gPSB7XG4gICAgICBjYXRlZ29yaWVzOiBbXVxuICAgIH07XG4gIH1cblxuICBpbml0aWFsaXplQ2FzdEFwaSgpIHtcbiAgICB0aGlzLmNhc3QgPSB0aGlzLndpbmRvd1snY2hyb21lJ10uY2FzdDtcbiAgICBsZXQgc2Vzc2lvblJlcXVlc3QgPSBuZXcgdGhpcy5jYXN0LlNlc3Npb25SZXF1ZXN0KCc0RjhCMzQ4MycpO1xuICAgIGxldCBhcGlDb25maWcgPSBuZXcgdGhpcy5jYXN0LkFwaUNvbmZpZyhzZXNzaW9uUmVxdWVzdCxcbiAgICAgICgpID0+IHsgfSxcbiAgICAgIChzdGF0dXM6IGFueSkgPT4geyBpZiAoc3RhdHVzID09PSB0aGlzLmNhc3QuUmVjZWl2ZXJBdmFpbGFiaWxpdHkuQVZBSUxBQkxFKSB7IH0gfVxuICAgICk7XG4gICAgbGV0IHggPSB0aGlzLmNhc3QuaW5pdGlhbGl6ZShhcGlDb25maWcsIHRoaXMub25Jbml0U3VjY2VzcywgdGhpcy5vbkVycm9yKTtcbiAgfTtcblxuICBvbkluaXRTdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUubG9nKCdHQ2FzdCBpbml0aWFsaXphdGlvbiBzdWNjZXNzJyk7XG4gIH07XG5cbiAgb25FcnJvciA9IGZ1bmN0aW9uIChlcnI6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCdHQ2FzdCBpbml0aWFsaXphdGlvbiBmYWlsZWQnLCBlcnIpO1xuICB9O1xuXG4gIGRpc2NvdmVyRGV2aWNlcyA9ICgpID0+IHtcbiAgICBsZXQgc2VsZjogYW55ID0gdGhpcztcbiAgICBsZXQgc3ViaiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgdGhpcy5jYXN0LnJlcXVlc3RTZXNzaW9uKChzOiBhbnkpID0+IHtcbiAgICAgIHNlbGYuc2Vzc2lvbiA9IHM7XG4gICAgICBzZWxmLnNldENhc3RpbmcodHJ1ZSk7XG4gICAgICBzdWJqLm5leHQoJ0NPTk5FQ1RFRCcpO1xuICAgIH0sIGZ1bmN0aW9uIChlcnI6IGFueSkge1xuICAgICAgc2VsZi5zZXRDYXN0aW5nKGZhbHNlKTtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ2NhbmNlbCcpIHtcbiAgICAgICAgc2VsZi5zZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBzdWJqLm5leHQoJ0NBTkNFTCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc2VsZWN0aW5nIGEgY2FzdCBkZXZpY2UnLCBlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzdWJqO1xuICB9O1xuXG4gIG9uTWVkaWFEaXNjb3ZlcmVkID0gKGNhdGVnb3JpZXM6IGFueVtdKSA9PiB7XG4gICAgbGV0IHNjcmlwdCA9IHdpbmRvd1snZG9jdW1lbnQnXS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvamF2YXNjcmlwdCcpO1xuICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3NyYycsICdodHRwczovL3d3dy5nc3RhdGljLmNvbS9jdi9qcy9zZW5kZXIvdjEvY2FzdF9zZW5kZXIuanM/bG9hZENhc3RGcmFtZXdvcms9MScpO1xuICAgIHdpbmRvd1snZG9jdW1lbnQnXS5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIubWVkaWFKU09OLmNhdGVnb3JpZXMgPSBjYXRlZ29yaWVzO1xuXG4gICAgcmV0dXJuIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5hZGRNZWRpYUNvbnRlbnRzKCk7XG4gIH07XG5cbiAgaW5pdGlhbGl6ZShtZWRpYUNvbnRlbnRzOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAobWVkaWFDb250ZW50cykge1xuICAgICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLmluaXRpYWxpemVVSSgpO1xuICAgICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLnNldHVwTG9jYWxQbGF5ZXIoKTtcbiAgICAgIHRoaXMud2luZG93WydfX29uR0Nhc3RBcGlBdmFpbGFibGUnXSA9IChpc0F2YWlsYWJsZTogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoaXNBdmFpbGFibGUpIHtcbiAgICAgICAgICBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIuaW5pdGlhbGl6ZUNhc3RQbGF5ZXIoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwbGF5ID0gKCkgPT4ge1xuICAgIHRoaXMuY3VycmVudE1lZGlhLnBsYXkobnVsbCk7XG4gIH07XG5cbiAgcGF1c2UgPSAoKSA9PiB7XG4gICAgdGhpcy5jdXJyZW50TWVkaWEucGF1c2UobnVsbCk7XG4gIH07XG5cbiAgc3RvcCA9ICgpID0+IHtcbiAgICB0aGlzLmN1cnJlbnRNZWRpYS5zdG9wKG51bGwpO1xuICB9O1xuXG4gIG9uTWVkaWFFcnJvciA9IChlcnI6IGFueSkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxhdW5jaGluZyBtZWRpYScsIGVycik7XG4gIH07XG5cbiAgc2V0Q2FzdGluZyh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5zdGF0dXMuY2FzdGluZyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0U3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXR1c1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/dist/fesm2015/thinkam.net-ng-cast.js b/dist/fesm2015/thinkam.net-ng-cast.js index b7767c7..0b269e7 100644 --- a/dist/fesm2015/thinkam.net-ng-cast.js +++ b/dist/fesm2015/thinkam.net-ng-cast.js @@ -110,6 +110,11 @@ let NgCastService = class NgCastService { if (mediaContents) { globalThis.CastPlayer.initializeUI(); globalThis.CastPlayer.setupLocalPlayer(); + this.window['__onGCastApiAvailable'] = (isAvailable) => { + if (isAvailable) { + globalThis.CastPlayer.initializeCastPlayer(); + } + }; } } setCasting(value) { @@ -332,17 +337,22 @@ var PlayerHandler = function (castPlayer) { }; this.play = function () { - if (castPlayer.playerState == PLAYER_STATE.IDLE || - !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) { + if (castPlayer.playerState !== PLAYER_STATE.PLAYING && + castPlayer.playerState !== PLAYER_STATE.PAUSED && + castPlayer.playerState !== PLAYER_STATE.LOADED) { this.load(castPlayer.currentMediaIndex); return; } - castPlayer.playerState = PLAYER_STATE.PLAYING; this.target.play(); - + castPlayer.playerState = PLAYER_STATE.PLAYING; document.getElementById('play').style.display = 'none'; document.getElementById('pause').style.display = 'block'; + this.updateDisplayMessage(); + }; + + this.updateDisplayMessage = function () { + this.target.updateDisplayMessage(); }; this.pause = function () { @@ -390,6 +400,18 @@ var PlayerHandler = function (castPlayer) { this.updateDisplay(); }; + this.loaded = function() { + castPlayer.currentMediaDuration = this.getMediaDuration(); + castPlayer.updateMediaDuration(); + castPlayer.playerState = PLAYER_STATE.LOADED; + if (castPlayer.currentMediaTime > 0) { + this.seekTo(castPlayer.currentMediaTime); + } + this.play(); + castPlayer.startProgressTimer(); + this.updateDisplayMessage(); + }; + this.getCurrentMediaTime = function () { return this.target.getCurrentMediaTime(); }; @@ -529,398 +551,160 @@ CastPlayer.prototype.setupLocalPlayer = () => { * Add event listeners for player changes which may occur outside sender app. */ CastPlayer.prototype.setupRemotePlayer = function () { - // Triggers when the media info or the player state changes - castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED, - function (event) { - let session = cast.framework.CastContext.getInstance().getCurrentSession(); - if (!session) { - castPlayer.mediaInfo = null; - castPlayer.isLiveContent = false; - castPlayer.playerHandler.updateDisplay(); - return; - } - - let media = session.getMediaSession(); - if (!media) { - castPlayer.mediaInfo = null; - castPlayer.isLiveContent = false; - castPlayer.playerHandler.updateDisplay(); - return; - } - - castPlayer.mediaInfo = media.media; - - if (castPlayer.mediaInfo) { - castPlayer.isLiveContent = (castPlayer.mediaInfo.streamType == - chrome.cast.media.StreamType.LIVE); - } else { - castPlayer.isLiveContent = false; - } - - if (media.playerState == PLAYER_STATE.PLAYING && castPlayer.playerState !== PLAYER_STATE.PLAYING) { - castPlayer.playerHandler.prepareToPlay(); - } - - castPlayer.removeAdMarkers(); - castPlayer.updateAdMarkers(); - - castPlayer.playerHandler.updateDisplay(); - }.bind(castPlayer) - ); - - castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED, - function (event) { - castPlayer.enableProgressBar(event.value); - }.bind(castPlayer) - ); - - castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, - function () { - if (castPlayer.remotePlayer.isPaused) { - castPlayer.playerHandler.pause(); - } else if (castPlayer.playerState !== PLAYER_STATE.PLAYING) { - // If currently not playing, start to play. - // This occurs if starting to play from local, but this check is - // required if the state is changed remotely. - castPlayer.playerHandler.play(); - } - }.bind(castPlayer) - ); - - castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED, - function () { - if (castPlayer.remotePlayer.isMuted) { - castPlayer.playerHandler.mute(); - } else { - castPlayer.playerHandler.unMute(); - } - }.bind(castPlayer) - ); - - castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED, - function () { - var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; - var p = document.getElementById('audio_bg_level'); - p.style.height = newVolume + 'px'; - p.style.marginTop = -newVolume + 'px'; - }.bind(castPlayer) - ); - - castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED, - function (event) { - castPlayer.isPlayingBreak(event.value); - }.bind(castPlayer) - ); + var castSession = cast.framework.CastContext.getInstance().getCurrentSession(); + // Add event listeners for player changes which may occur outside sender app castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED, - function (event) { - castPlayer.onWhenSkippableChanged(event.value); - }.bind(castPlayer) + cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, + function() { + if (castPlayer.remotePlayer.isPaused) { + castPlayer.playerHandler.pause(); + } else { + castPlayer.playerHandler.play(); + } + }.bind(castPlayer) ); castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED, - function (event) { - castPlayer.onCurrentBreakClipTimeChanged(event.value); - }.bind(castPlayer) + cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED, + function() { + if (castPlayer.remotePlayer.isMuted) { + castPlayer.playerHandler.mute(); + } else { + castPlayer.playerHandler.unMute(); + } + }.bind(castPlayer) ); castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED, - function (event) { - castPlayer.onBreakClipIdChanged(event.value); - }.bind(castPlayer) + cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED, + function() { + var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; + var p = document.getElementById('audio_bg_level'); + p.style.height = newVolume + 'px'; + p.style.marginTop = -newVolume + 'px'; + }.bind(castPlayer) ); - castPlayer.remotePlayerController.addEventListener( - cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED, - function (event) { - console.log('LIVE_SEEKABLE_RANGE_CHANGED'); - castPlayer.liveSeekableRange = event.value; - }.bind(castPlayer) - ); - - // This object will implement PlayerHandler callbacks with + // castPlayer object will implement PlayerHandler callbacks with // remotePlayerController, and makes necessary UI updates specific - // to remote playback. + // to remote playback var playerTarget = {}; playerTarget.play = function () { - if (castPlayer.remotePlayer.isPaused) { - castPlayer.remotePlayerController.playOrPause(); - } + if (castPlayer.remotePlayer.isPaused) { + castPlayer.remotePlayerController.playOrPause(); + } - var vi = document.getElementById('video_image'); - vi.style.display = ''; - var localPlayer = document.getElementById('video_element'); - localPlayer.style.display = 'none'; + var vi = document.getElementById('video_image'); + vi.style.display = 'block'; + var localPlayer = document.getElementById('video_element'); + localPlayer.style.display = 'none'; }.bind(castPlayer); playerTarget.pause = function () { - if (!castPlayer.remotePlayer.isPaused) { - castPlayer.remotePlayerController.playOrPause(); - } + if (!castPlayer.remotePlayer.isPaused) { + castPlayer.remotePlayerController.playOrPause(); + } }.bind(castPlayer); playerTarget.stop = function () { - castPlayer.remotePlayerController.stop(); + castPlayer.remotePlayerController.stop(); }.bind(castPlayer); - // Load request for local -> remote playerTarget.load = function (mediaIndex) { - console.log('Loading...' + this.mediaContents[mediaIndex]['title']); - var mediaInfo = new chrome.cast.media.MediaInfo( - this.mediaContents[mediaIndex]['sources'][0], 'video/mp4'); - - mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata(); - mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC; - mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title']; - mediaInfo.metadata.images = [ - {'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']}]; - - var request = new chrome.cast.media.LoadRequest(mediaInfo); - castSession.loadMedia(request).then( - this.playerHandler.loaded.bind(this.playerHandler), - function (errorCode) { - this.playerState = PLAYER_STATE.ERROR; - console.log('Remote media load error: ' + - CastPlayer.getErrorMessage(errorCode)); - }.bind(castPlayer)); - }.bind(castPlayer); - - playerTarget.isMediaLoaded = function (mediaIndex) { - let session = cast.framework.CastContext.getInstance().getCurrentSession(); - if (!session) return false; - - let media = session.getMediaSession(); - if (!media) return false; - - if (media.playerState == PLAYER_STATE.IDLE) { - return false; - } - - // No need to verify local mediaIndex content. - return true; + console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']); + var mediaInfo = new chrome.cast.media.MediaInfo( + castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4'); + + mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata(); + mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC; + mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title']; + mediaInfo.metadata.images = [ + {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}]; + + var request = new chrome.cast.media.LoadRequest(mediaInfo); + castSession.loadMedia(request).then( + castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler), + function (errorCode) { + castPlayer.playerState = PLAYER_STATE.ERROR; + console.log('Remote media load error: ' + + CastPlayer.getErrorMessage(errorCode)); + }.bind(castPlayer)); }.bind(castPlayer); - /** - * @return {number?} Current media time for the content. Always returns - * media time even if in clock time (conversion done when displaying). - */ - playerTarget.getCurrentMediaTime = function () { - if (castPlayer.isLiveContent && castPlayer.mediaInfo.metadata && - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia) { - return castPlayer.remotePlayer.currentTime - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; - } else { - // VOD and live scenerios where live metadata is not provided. + playerTarget.getCurrentMediaTime = function() { return castPlayer.remotePlayer.currentTime; - } }.bind(castPlayer); - /** - * @return {number?} media time duration for the content. Always returns - * media time even if in clock time (conversion done when displaying). - */ - playerTarget.getMediaDuration = function () { - if (castPlayer.isLiveContent) { - // Scenerios when live metadata is not provided. - if (castPlayer.mediaInfo.metadata == undefined || - castPlayer.mediaInfo.metadata.sectionDuration == undefined || - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia == undefined) { - return null; - } - - return castPlayer.mediaInfo.metadata.sectionDuration; - } else { + playerTarget.getMediaDuration = function() { return castPlayer.remotePlayer.duration; - } }.bind(castPlayer); - playerTarget.updateDisplay = function () { - let castSession = cast.framework.CastContext.getInstance().getCurrentSession(); - if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) { - let media = castSession.getMediaSession(); - let mediaInfo = media.media; - - // image placeholder for video view - var vi = document.getElementById('video_image'); - if (mediaInfo.metadata && mediaInfo.metadata.images && - mediaInfo.metadata.images.length > 0) { - vi.src = mediaInfo.metadata.images[0].url; - } - - // playerstate view + playerTarget.updateDisplayMessage = function () { document.getElementById('playerstate').style.display = 'block'; document.getElementById('playerstatebg').style.display = 'block'; document.getElementById('video_image_overlay').style.display = 'block'; - - let mediaTitle = ''; - let mediaEpisodeTitle = ''; - let mediaSubtitle = ''; - - if (mediaInfo.metadata) { - mediaTitle = mediaInfo.metadata.title; - mediaEpisodeTitle = mediaInfo.metadata.episodeTitle; - // Append episode title if present - mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle; - // Do not display mediaTitle if not defined. - mediaTitle = (mediaTitle) ? mediaTitle + ' ' : ''; - mediaSubtitle = mediaInfo.metadata.subtitle; - mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : ''; - } - - if (DEMO_MODE) { - document.getElementById('playerstate').innerHTML = - (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast'; - - // media_info view - document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video'); - document.getElementById('media_subtitle').innerHTML = ''; - } else { - document.getElementById('playerstate').innerHTML = - mediaTitle + media.playerState + ' on ' + - castSession.getCastDevice().friendlyName; - - // media_info view - document.getElementById('media_title').innerHTML = mediaTitle; - document.getElementById('media_subtitle').innerHTML = mediaSubtitle; - } - - // live information - if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) { - castPlayer.liveSeekableRange = media.liveSeekableRange; - - let live_indicator = document.getElementById('live_indicator'); - live_indicator.style.display = 'block'; - - // Display indicator if current time is close to the end of - // the seekable range. - if (castPlayer.liveSeekableRange && (Math.abs(media.getEstimatedTime() - castPlayer.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) { - live_indicator.src = "imagefiles/live_indicator_active.png"; - } else { - live_indicator.src = "imagefiles/live_indicator_inactive.png"; - } - } else { - document.getElementById('live_indicator').style.display = 'none'; - } - } else { - // playerstate view - document.getElementById('playerstate').style.display = 'none'; - document.getElementById('playerstatebg').style.display = 'none'; - document.getElementById('video_image_overlay').style.display = 'none'; - - // media_info view - document.getElementById('media_title').innerHTML = ""; - document.getElementById('media_subtitle').innerHTML = ""; - } + document.getElementById('playerstate').innerHTML = + castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' + + castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName; }.bind(castPlayer); - playerTarget.updateCurrentTimeDisplay = function () { - castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), castPlayer.playerHandler.getCurrentMediaTime()); - }.bind(castPlayer); - - playerTarget.setTimeString = function (element, time) { - let currentTimeString = castPlayer.getMediaTimeString(time); - - if (castPlayer.isLiveContent) { - if (currentTimeString == null) { - element.style.display = 'none'; - return; - } - - // clock time - if (castPlayer.mediaInfo.metadata && castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) { - element.style.display = 'flex'; - element.innerHTML = castPlayer.getClockTimeString(time + castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime); - } else { - // media time - element.style.display = 'flex'; - element.innerHTML = currentTimeString; - } - } else { - if (currentTimeString !== null) { - element.style.display = 'flex'; - element.innerHTML = currentTimeString; + playerTarget.setVolume = function (volumeSliderPosition) { + // Add resistance to avoid loud volume + var currentVolume = castPlayer.remotePlayer.volumeLevel; + var p = document.getElementById('audio_bg_level'); + if (volumeSliderPosition < FULL_VOLUME_HEIGHT) { + var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT; + if (volumeSliderPosition > vScale) { + volumeSliderPosition = vScale + (pos - vScale) / 2; + } + p.style.height = volumeSliderPosition + 'px'; + p.style.marginTop = -volumeSliderPosition + 'px'; + currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT; } else { - element.style.display = 'none'; + currentVolume = 1; } - } - }.bind(castPlayer); - - playerTarget.setVolume = function (volumeSliderPosition) { - var currentVolume = castPlayer.remotePlayer.volumeLevel; - var p = document.getElementById('audio_bg_level'); - if (volumeSliderPosition < FULL_VOLUME_HEIGHT) { - p.style.height = volumeSliderPosition + 'px'; - p.style.marginTop = -volumeSliderPosition + 'px'; - currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT; - } else { - currentVolume = 1; - } - castPlayer.remotePlayer.volumeLevel = currentVolume; - castPlayer.remotePlayerController.setVolumeLevel(); + castPlayer.remotePlayer.volumeLevel = currentVolume; + castPlayer.remotePlayerController.setVolumeLevel(); }.bind(castPlayer); playerTarget.mute = function () { - if (!castPlayer.remotePlayer.isMuted) { - castPlayer.remotePlayerController.muteOrUnmute(); - } + if (!castPlayer.remotePlayer.isMuted) { + castPlayer.remotePlayerController.muteOrUnmute(); + } }.bind(castPlayer); playerTarget.unMute = function () { - if (castPlayer.remotePlayer.isMuted) { - castPlayer.remotePlayerController.muteOrUnmute(); - } + if (castPlayer.remotePlayer.isMuted) { + castPlayer.remotePlayerController.muteOrUnmute(); + } }.bind(castPlayer); - playerTarget.isMuted = function () { - return castPlayer.remotePlayer.isMuted; + playerTarget.isMuted = function() { + return castPlayer.remotePlayer.isMuted; }.bind(castPlayer); playerTarget.seekTo = function (time) { - castPlayer.remotePlayer.currentTime = time; - castPlayer.remotePlayerController.seek(); + castPlayer.remotePlayer.currentTime = time; + castPlayer.remotePlayerController.seek(); }.bind(castPlayer); castPlayer.playerHandler.setTarget(playerTarget); - // Setup remote player properties on setup + // Setup remote player volume right on setup + // The remote player may have had a volume set from previous playback if (castPlayer.remotePlayer.isMuted) { - castPlayer.playerHandler.mute(); + castPlayer.playerHandler.mute(); } - castPlayer.enableProgressBar(castPlayer.remotePlayer.canSeek); - // The remote player may have had a volume set from previous playback var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT; var p = document.getElementById('audio_bg_level'); p.style.height = currentVolume + 'px'; p.style.marginTop = -currentVolume + 'px'; - // Show media_control - document.getElementById('media_control').style.opacity = 0.7; - castPlayer.hideFullscreenButton(); - // If resuming a session, take the remote properties and continue the existing - // playback. Otherwise, load local content. - if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() == - cast.framework.SessionState.SESSION_RESUMED) { - console.log('Resuming session'); - castPlayer.playerHandler.prepareToPlay(); - - // New media has been loaded so the previous ad markers should - // be removed. - castPlayer.removeAdMarkers(); - castPlayer.updateAdMarkers(); - } else { - castPlayer.playerHandler.load(); - } + castPlayer.playerHandler.play(); }; /** @@ -930,7 +714,7 @@ CastPlayer.prototype.onMediaLoadedLocally = function () { var localPlayer = document.getElementById('video_element'); localPlayer.currentTime = castPlayer.currentMediaTime; - castPlayer.playerHandler.prepareToPlay(); + castPlayer.playerHandler.loaded(); }; /** @@ -1053,108 +837,39 @@ CastPlayer.prototype.stopProgressTimer = function () { /** * Increment media current time depending on remote or local playback */ -CastPlayer.prototype.incrementMediaTime = function () { - // First sync with the current player's time - castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime(); - castPlayer.mediaDuration = castPlayer.playerHandler.getMediaDuration(); - - castPlayer.playerHandler.updateDurationDisplay(); - - if (castPlayer.mediaDuration == null || castPlayer.currentMediaTime < castPlayer.mediaDuration || castPlayer.isLiveContent) { - castPlayer.playerHandler.updateCurrentTimeDisplay(); - castPlayer.updateProgressBarByTimer(); - } else if (castPlayer.mediaDuration > 0) { - castPlayer.endPlayback(); - } +CastPlayer.prototype.incrementMediaTime = () => { + // First sync with the current player's time + castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime(); + castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration(); + + if (castPlayer.playerState === PLAYER_STATE.PLAYING) { + if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) { + castPlayer.currentMediaTime += 1; + castPlayer.updateProgressBarByTimer(); + } else { + castPlayer.endPlayback(); + } + } }; /** * Update progress bar and currentTime based on timer */ CastPlayer.prototype.updateProgressBarByTimer = function () { - var progressBar = document.getElementById('progress'); - var pi = document.getElementById('progress_indicator'); - - // Live situation where the progress and duration is unknown. - if (castPlayer.mediaDuration == null) { - if (!castPlayer.isLiveContent) { - console.log('Error - Duration is not defined for a VOD stream.'); - } - - progressBar.style.width = '0px'; - - let skip = document.getElementById('skip'); - if (skip && skip.style && skip.style.display) { - skip.style.display = 'none'; - } - - pi.style.display = 'none'; - - let seekable_window = document.getElementById('seekable_window'); - if (seekable_window && seekable_window.style && seekable_window.style.width) - seekable_window.style.width = '0px'; - - let unseekable_overlay = document.getElementById('unseekable_overlay'); - if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width) - unseekable_overlay.style.width = '0px'; - - return; - } else { - pi.style.display = ''; + var p = document.getElementById('progress'); + if (isNaN(parseInt(p.style.width, 10))) { + p.style.width = 0; } - - if (isNaN(parseInt(progressBar.style.width, 10))) { - progressBar.style.width = '0px'; - } - - // Prevent indicator from exceeding the max width. Happens during - // short media when each progress step is large - var pp = Math.floor(PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.mediaDuration); - if (pp > PROGRESS_BAR_WIDTH) { - pp = PROGRESS_BAR_WIDTH; - } else if (pp < 0) { - pp = 0; + if (castPlayer.currentMediaDuration > 0) { + var pp = Math.floor( + PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration); } - progressBar.style.width = pp + 'px'; - pi.style.marginLeft = pp + 'px'; - - let seekable_window = document.getElementById('seekable_window'); - let unseekable_overlay = document.getElementById('unseekable_overlay'); - if (castPlayer.isLiveContent) { - if (castPlayer.liveSeekableRange) { - // Use the liveSeekableRange to draw the seekable and unseekable windows - let seekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.end) - - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; - let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / castPlayer.mediaDuration); - if (seekableWidth > PROGRESS_BAR_WIDTH) { - seekableWidth = PROGRESS_BAR_WIDTH; - } else if (seekableWidth < 0) { - seekableWidth = 0; - } - seekable_window.style.width = seekableWidth + 'px'; - - let unseekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.start) - - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia; - let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / castPlayer.mediaDuration); - if (unseekableWidth > PROGRESS_BAR_WIDTH) { - unseekableWidth = PROGRESS_BAR_WIDTH; - } else if (unseekableWidth < 0) { - unseekableWidth = 0; - } - unseekable_overlay.style.width = unseekableWidth + 'px'; - } else { - // Nothing is seekable if no liveSeekableRange - seekable_window.style.width = '0px'; - unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px'; - } - } else { - // Default to everything seekable - seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px'; - unseekable_overlay.style.width = '0px'; - } + p.style.width = pp + 'px'; + var pi = document.getElementById('progress_indicator'); + pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px'; - if (pp >= PROGRESS_BAR_WIDTH && !castPlayer.isLiveContent) { + if (pp >= PROGRESS_BAR_WIDTH) { castPlayer.endPlayback(); } }; @@ -1383,6 +1098,32 @@ CastPlayer.prototype.enableProgressBar = function (enable) { } }; +/** + * Updates media duration text in UI + */ +CastPlayer.prototype.updateMediaDuration = function() { + document.getElementById('duration').innerHTML = + CastPlayer.getDurationString(castPlayer.currentMediaDuration); +}; + +/** + * @param {number} durationInSec + * @return {string} + */ +CastPlayer.getDurationString = function(durationInSec) { + var durationString = '' + Math.floor(durationInSec % 60); + var durationInMin = Math.floor(durationInSec / 60); + if (durationInMin === 0) { + return durationString; + } + durationString = (durationInMin % 60) + ':' + durationString; + var durationInHour = Math.floor(durationInMin / 60); + if (durationInHour === 0) { + return durationString; + } + return durationInHour + ':' + durationString; +}; + /** * Request full screen mode */ @@ -1460,7 +1201,7 @@ CastPlayer.prototype.hideFullscreenButton = function () { */ CastPlayer.prototype.showMediaControl = function () { let media_control = document.getElementById('media_control'); - if (media_control && media_control.style && media_control.opacity) + if (media_control && media_control.style && media_control.style.opacity) media_control.style.opacity = 0.7; }; @@ -1594,7 +1335,7 @@ CastPlayer.prototype.addVideoThumbs = function () { newdiv.innerHTML = ''; - newdiv.addEventListener('click', castPlayer.selectMedia.bind(this, i)); + newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i)); ni.appendChild(newdiv); } } diff --git a/dist/fesm2015/thinkam.net-ng-cast.js.map b/dist/fesm2015/thinkam.net-ng-cast.js.map index a9f72d8..89e135c 100644 --- a/dist/fesm2015/thinkam.net-ng-cast.js.map +++ b/dist/fesm2015/thinkam.net-ng-cast.js.map @@ -1 +1 @@ -{"version":3,"file":"thinkam.net-ng-cast.js","sources":["../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState == PLAYER_STATE.IDLE ||\n !this.target.isMediaLoaded(castPlayer.currentMediaIndex)) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n this.target.play();\n\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n };\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n // Triggers when the media info or the player state changes\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,\n function (event) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) {\n castPlayer.mediaInfo = null;\n castPlayer.isLiveContent = false;\n castPlayer.playerHandler.updateDisplay();\n return;\n }\n\n let media = session.getMediaSession();\n if (!media) {\n castPlayer.mediaInfo = null;\n castPlayer.isLiveContent = false;\n castPlayer.playerHandler.updateDisplay();\n return;\n }\n\n castPlayer.mediaInfo = media.media;\n\n if (castPlayer.mediaInfo) {\n castPlayer.isLiveContent = (castPlayer.mediaInfo.streamType ==\n chrome.cast.media.StreamType.LIVE);\n } else {\n castPlayer.isLiveContent = false;\n }\n\n if (media.playerState == PLAYER_STATE.PLAYING && castPlayer.playerState !== PLAYER_STATE.PLAYING) {\n castPlayer.playerHandler.prepareToPlay();\n }\n\n castPlayer.removeAdMarkers();\n castPlayer.updateAdMarkers();\n\n castPlayer.playerHandler.updateDisplay();\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CAN_SEEK_CHANGED,\n function (event) {\n castPlayer.enableProgressBar(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else if (castPlayer.playerState !== PLAYER_STATE.PLAYING) {\n // If currently not playing, start to play.\n // This occurs if starting to play from local, but this check is\n // required if the state is changed remotely.\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function () {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PLAYING_BREAK_CHANGED,\n function (event) {\n castPlayer.isPlayingBreak(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.WHEN_SKIPPABLE_CHANGED,\n function (event) {\n castPlayer.onWhenSkippableChanged(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.CURRENT_BREAK_CLIP_TIME_CHANGED,\n function (event) {\n castPlayer.onCurrentBreakClipTimeChanged(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.BREAK_CLIP_ID_CHANGED,\n function (event) {\n castPlayer.onBreakClipIdChanged(event.value);\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.LIVE_SEEKABLE_RANGE_CHANGED,\n function (event) {\n console.log('LIVE_SEEKABLE_RANGE_CHANGED');\n castPlayer.liveSeekableRange = event.value;\n }.bind(castPlayer)\n );\n\n // This object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback.\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = '';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n // Load request for local -> remote\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + this.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n this.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = this.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + this.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n this.playerHandler.loaded.bind(this.playerHandler),\n function (errorCode) {\n this.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.isMediaLoaded = function (mediaIndex) {\n let session = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!session) return false;\n\n let media = session.getMediaSession();\n if (!media) return false;\n\n if (media.playerState == PLAYER_STATE.IDLE) {\n return false;\n }\n\n // No need to verify local mediaIndex content.\n return true;\n }.bind(castPlayer);\n\n /**\n * @return {number?} Current media time for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getCurrentMediaTime = function () {\n if (castPlayer.isLiveContent && castPlayer.mediaInfo.metadata &&\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia) {\n return castPlayer.remotePlayer.currentTime - castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n } else {\n // VOD and live scenerios where live metadata is not provided.\n return castPlayer.remotePlayer.currentTime;\n }\n }.bind(castPlayer);\n\n /**\n * @return {number?} media time duration for the content. Always returns\n * media time even if in clock time (conversion done when displaying).\n */\n playerTarget.getMediaDuration = function () {\n if (castPlayer.isLiveContent) {\n // Scenerios when live metadata is not provided.\n if (castPlayer.mediaInfo.metadata == undefined ||\n castPlayer.mediaInfo.metadata.sectionDuration == undefined ||\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia == undefined) {\n return null;\n }\n\n return castPlayer.mediaInfo.metadata.sectionDuration;\n } else {\n return castPlayer.remotePlayer.duration;\n }\n }.bind(castPlayer);\n\n playerTarget.updateDisplay = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (castSession && castSession.getMediaSession() && castSession.getMediaSession().media) {\n let media = castSession.getMediaSession();\n let mediaInfo = media.media;\n\n // image placeholder for video view\n var vi = document.getElementById('video_image');\n if (mediaInfo.metadata && mediaInfo.metadata.images &&\n mediaInfo.metadata.images.length > 0) {\n vi.src = mediaInfo.metadata.images[0].url;\n }\n\n // playerstate view\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n\n let mediaTitle = '';\n let mediaEpisodeTitle = '';\n let mediaSubtitle = '';\n\n if (mediaInfo.metadata) {\n mediaTitle = mediaInfo.metadata.title;\n mediaEpisodeTitle = mediaInfo.metadata.episodeTitle;\n // Append episode title if present\n mediaTitle = mediaEpisodeTitle ? mediaTitle + ': ' + mediaEpisodeTitle : mediaTitle;\n // Do not display mediaTitle if not defined.\n mediaTitle = (mediaTitle) ? mediaTitle + ' ' : '';\n mediaSubtitle = mediaInfo.metadata.subtitle;\n mediaSubtitle = (mediaSubtitle) ? mediaSubtitle + ' ' : '';\n }\n\n if (DEMO_MODE) {\n document.getElementById('playerstate').innerHTML =\n (ENABLE_LIVE ? 'Live Content ' : 'Sample Video ') + media.playerState + ' on Chromecast';\n\n // media_info view\n document.getElementById('media_title').innerHTML = (ENABLE_LIVE ? 'Live Content' : 'Sample Video');\n document.getElementById('media_subtitle').innerHTML = '';\n } else {\n document.getElementById('playerstate').innerHTML =\n mediaTitle + media.playerState + ' on ' +\n castSession.getCastDevice().friendlyName;\n\n // media_info view\n document.getElementById('media_title').innerHTML = mediaTitle;\n document.getElementById('media_subtitle').innerHTML = mediaSubtitle;\n }\n\n // live information\n if (mediaInfo.streamType == chrome.cast.media.StreamType.LIVE) {\n castPlayer.liveSeekableRange = media.liveSeekableRange;\n\n let live_indicator = document.getElementById('live_indicator');\n live_indicator.style.display = 'block';\n\n // Display indicator if current time is close to the end of\n // the seekable range.\n if (castPlayer.liveSeekableRange && (Math.abs(media.getEstimatedTime() - castPlayer.liveSeekableRange.end) < LIVE_INDICATOR_BUFFER)) {\n live_indicator.src = \"imagefiles/live_indicator_active.png\";\n } else {\n live_indicator.src = \"imagefiles/live_indicator_inactive.png\";\n }\n } else {\n document.getElementById('live_indicator').style.display = 'none';\n }\n } else {\n // playerstate view\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n\n // media_info view\n document.getElementById('media_title').innerHTML = \"\";\n document.getElementById('media_subtitle').innerHTML = \"\";\n }\n }.bind(castPlayer);\n\n playerTarget.updateCurrentTimeDisplay = function () {\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), castPlayer.playerHandler.getCurrentMediaTime());\n }.bind(castPlayer);\n\n playerTarget.setTimeString = function (element, time) {\n let currentTimeString = castPlayer.getMediaTimeString(time);\n\n if (castPlayer.isLiveContent) {\n if (currentTimeString == null) {\n element.style.display = 'none';\n return;\n }\n\n // clock time\n if (castPlayer.mediaInfo.metadata && castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime !== undefined) {\n element.style.display = 'flex';\n element.innerHTML = castPlayer.getClockTimeString(time + castPlayer.mediaInfo.metadata.sectionStartAbsoluteTime);\n } else {\n // media time\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n }\n } else {\n if (currentTimeString !== null) {\n element.style.display = 'flex';\n element.innerHTML = currentTimeString;\n } else {\n element.style.display = 'none';\n }\n }\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function () {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player properties on setup\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n castPlayer.enableProgressBar(castPlayer.remotePlayer.canSeek);\n // The remote player may have had a volume set from previous playback\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n // Show media_control\n document.getElementById('media_control').style.opacity = 0.7;\n\n castPlayer.hideFullscreenButton();\n\n // If resuming a session, take the remote properties and continue the existing\n // playback. Otherwise, load local content.\n if (cast.framework.CastContext.getInstance().getCurrentSession().getSessionState() ==\n cast.framework.SessionState.SESSION_RESUMED) {\n console.log('Resuming session');\n castPlayer.playerHandler.prepareToPlay();\n\n // New media has been loaded so the previous ad markers should\n // be removed.\n castPlayer.removeAdMarkers();\n castPlayer.updateAdMarkers();\n } else {\n castPlayer.playerHandler.load();\n }\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.prepareToPlay();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = function () {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.mediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n castPlayer.playerHandler.updateDurationDisplay();\n\n if (castPlayer.mediaDuration == null || castPlayer.currentMediaTime < castPlayer.mediaDuration || castPlayer.isLiveContent) {\n castPlayer.playerHandler.updateCurrentTimeDisplay();\n castPlayer.updateProgressBarByTimer();\n } else if (castPlayer.mediaDuration > 0) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var progressBar = document.getElementById('progress');\n var pi = document.getElementById('progress_indicator');\n\n // Live situation where the progress and duration is unknown.\n if (castPlayer.mediaDuration == null) {\n if (!castPlayer.isLiveContent) {\n console.log('Error - Duration is not defined for a VOD stream.');\n }\n\n progressBar.style.width = '0px';\n\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display) {\n skip.style.display = 'none';\n }\n\n pi.style.display = 'none';\n\n let seekable_window = document.getElementById('seekable_window');\n if (seekable_window && seekable_window.style && seekable_window.style.width)\n seekable_window.style.width = '0px';\n\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (unseekable_overlay && unseekable_overlay.style && unseekable_overlay.style.width)\n unseekable_overlay.style.width = '0px';\n\n return;\n } else {\n pi.style.display = '';\n }\n\n if (isNaN(parseInt(progressBar.style.width, 10))) {\n progressBar.style.width = '0px';\n }\n\n // Prevent indicator from exceeding the max width. Happens during\n // short media when each progress step is large\n var pp = Math.floor(PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.mediaDuration);\n if (pp > PROGRESS_BAR_WIDTH) {\n pp = PROGRESS_BAR_WIDTH;\n } else if (pp < 0) {\n pp = 0;\n }\n\n progressBar.style.width = pp + 'px';\n pi.style.marginLeft = pp + 'px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n if (castPlayer.isLiveContent) {\n if (castPlayer.liveSeekableRange) {\n // Use the liveSeekableRange to draw the seekable and unseekable windows\n let seekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.end) -\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n let seekableWidth = Math.floor(PROGRESS_BAR_WIDTH * seekableMediaPosition / castPlayer.mediaDuration);\n if (seekableWidth > PROGRESS_BAR_WIDTH) {\n seekableWidth = PROGRESS_BAR_WIDTH;\n } else if (seekableWidth < 0) {\n seekableWidth = 0;\n }\n seekable_window.style.width = seekableWidth + 'px';\n\n let unseekableMediaPosition = Math.max(castPlayer.mediaInfo.metadata.sectionStartTimeInMedia, castPlayer.liveSeekableRange.start) -\n castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n let unseekableWidth = Math.floor(PROGRESS_BAR_WIDTH * unseekableMediaPosition / castPlayer.mediaDuration);\n if (unseekableWidth > PROGRESS_BAR_WIDTH) {\n unseekableWidth = PROGRESS_BAR_WIDTH;\n } else if (unseekableWidth < 0) {\n unseekableWidth = 0;\n }\n unseekable_overlay.style.width = unseekableWidth + 'px';\n } else {\n // Nothing is seekable if no liveSeekableRange\n seekable_window.style.width = '0px';\n unseekable_overlay.style.width = PROGRESS_BAR_WIDTH + 'px';\n }\n } else {\n // Default to everything seekable\n seekable_window.style.width = PROGRESS_BAR_WIDTH + 'px';\n unseekable_overlay.style.width = '0px';\n }\n\n if (pp >= PROGRESS_BAR_WIDTH && !castPlayer.isLiveContent) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(this, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["tslib_1.__decorate"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"thinkam.net-ng-cast.js","sources":["../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n this.window['__onGCastApiAvailable'] = (isAvailable: boolean) => {\n if (isAvailable) {\n globalThis.CastPlayer.initializeCastPlayer();\n }\n };\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["tslib_1.__decorate"],"mappings":"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"} \ No newline at end of file diff --git a/dist/package.json b/dist/package.json index 5b79390..36b7bae 100644 --- a/dist/package.json +++ b/dist/package.json @@ -1,7 +1,7 @@ { "$schema": "./node_modules/ng-packagr/package.schema.json", "name": "@thinkam.net/ng-cast", - "version": "0.2.20", + "version": "0.3.0", "description": "Broadcast media on your TV from your Angular app", "main": "bundles/thinkam.net-ng-cast.umd.js", "repository": { diff --git a/package.json b/package.json index 3f49718..e6466f4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "$schema": "./node_modules/ng-packagr/package.schema.json", "name": "@thinkam.net/ng-cast", - "version": "0.2.20", + "version": "0.3.0", "ngPackage": { "lib": { "entryFile": "index.ts" diff --git a/shared/ng-cast.service.ts b/shared/ng-cast.service.ts index 39bf495..946b539 100644 --- a/shared/ng-cast.service.ts +++ b/shared/ng-cast.service.ts @@ -74,6 +74,11 @@ export class NgCastService { if (mediaContents) { globalThis.CastPlayer.initializeUI(); globalThis.CastPlayer.setupLocalPlayer(); + this.window['__onGCastApiAvailable'] = (isAvailable: boolean) => { + if (isAvailable) { + globalThis.CastPlayer.initializeCastPlayer(); + } + }; } } From 2fa5bfeb50232c8fd285053bfd2b8b0b2deb7c9d Mon Sep 17 00:00:00 2001 From: Felipe de Almeida Date: Mon, 12 Oct 2020 00:30:57 -0300 Subject: [PATCH 05/10] call setupRemotePlayer for cast --- cast-videos.js | 5 +++-- dist/bundles/thinkam.net-ng-cast.umd.js | 10 ++++------ dist/bundles/thinkam.net-ng-cast.umd.js.map | 2 +- dist/bundles/thinkam.net-ng-cast.umd.min.js | 2 +- dist/bundles/thinkam.net-ng-cast.umd.min.js.map | 2 +- dist/esm2015/shared/ng-cast.service.js | 9 +++------ dist/fesm2015/thinkam.net-ng-cast.js | 12 +++++------- dist/fesm2015/thinkam.net-ng-cast.js.map | 2 +- dist/package.json | 2 +- package.json | 2 +- shared/ng-cast.service.ts | 7 ++----- 11 files changed, 23 insertions(+), 32 deletions(-) diff --git a/cast-videos.js b/cast-videos.js index d413779..32dd54f 100755 --- a/cast-videos.js +++ b/cast-videos.js @@ -331,7 +331,7 @@ CastPlayer.prototype.setupLocalPlayer = () => { // This object will implement PlayerHandler callbacks with localPlayer var playerTarget = {}; - playerTarget.play = function () { + playerTarget.play = () => { localPlayer.play(); var vi = document.getElementById('video_image'); @@ -344,7 +344,8 @@ CastPlayer.prototype.setupLocalPlayer = () => { }; playerTarget.stop = function () { - localPlayer.stop(); + if (typeof localPlayer.stop === "function") + localPlayer.stop(); }; playerTarget.load = function (mediaIndex) { diff --git a/dist/bundles/thinkam.net-ng-cast.umd.js b/dist/bundles/thinkam.net-ng-cast.umd.js index fb93af0..3cd5d66 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.js +++ b/dist/bundles/thinkam.net-ng-cast.umd.js @@ -406,15 +406,12 @@ if (mediaContents) { globalThis.CastPlayer.initializeUI(); globalThis.CastPlayer.setupLocalPlayer(); - this.window['__onGCastApiAvailable'] = function (isAvailable) { - if (isAvailable) { - globalThis.CastPlayer.initializeCastPlayer(); - } - }; + globalThis.CastPlayer.initializeCastPlayer(); } }; NgCastService.prototype.setCasting = function (value) { this.status.casting = value; + globalThis.CastPlayer.setupRemotePlayer(); }; NgCastService.prototype.getStatus = function () { return this.status; @@ -734,7 +731,8 @@ localPlayer.pause(); }; playerTarget.stop = function () { - localPlayer.stop(); + if (typeof localPlayer.stop === "function") + localPlayer.stop(); }; playerTarget.load = function (mediaIndex) { localPlayer.src = diff --git a/dist/bundles/thinkam.net-ng-cast.umd.js.map b/dist/bundles/thinkam.net-ng-cast.umd.js.map index 3d1518f..c816343 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.js.map +++ b/dist/bundles/thinkam.net-ng-cast.umd.js.map @@ -1 +1 @@ -{"version":3,"file":"thinkam.net-ng-cast.umd.js","sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n this.window['__onGCastApiAvailable'] = (isAvailable: boolean) => {\n if (isAvailable) {\n globalThis.CastPlayer.initializeCastPlayer();\n }\n };\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["NgCastComponent","tslib_1.__decorate","Input","Component","NgCastService","Subject","Injectable","NgCastModule","NgModule","CUSTOM_ELEMENTS_SCHEMA","CommonModule"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"thinkam.net-ng-cast.umd.js","sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeCastPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n globalThis.CastPlayer.setupRemotePlayer();\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = () => {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n if (typeof localPlayer.stop === \"function\")\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["NgCastComponent","tslib_1.__decorate","Input","Component","NgCastService","Subject","Injectable","NgCastModule","NgModule","CUSTOM_ELEMENTS_SCHEMA","CommonModule"],"mappings":";;;;;;IAAA;;;;;;;;;;;;;;IAcA;IAEA,IAAI,aAAa,GAAG,UAAS,CAAC,EAAE,CAAC;QAC7B,aAAa,GAAG,MAAM,CAAC,cAAc;aAChC,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,KAAK,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;YAC5E,UAAU,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;oBAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,OAAO,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC;aAEc,SAAS,CAAC,CAAC,EAAE,CAAC;QAC1B,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,SAAS,EAAE,KAAK,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE;QACvC,CAAC,CAAC,SAAS,GAAG,CAAC,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IACzF,CAAC;IAEM,IAAI,QAAQ,GAAG;QAClB,QAAQ,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,QAAQ,CAAC,CAAC;YAC3C,KAAK,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBACjD,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBACjB,KAAK,IAAI,CAAC,IAAI,CAAC;oBAAE,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;wBAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAChF;YACD,OAAO,CAAC,CAAC;SACZ,CAAA;QACD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAA;aAEe,MAAM,CAAC,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,EAAE,CAAC;QACX,KAAK,IAAI,CAAC,IAAI,CAAC;YAAE,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC/E,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,IAAI,CAAC,IAAI,IAAI,IAAI,OAAO,MAAM,CAAC,qBAAqB,KAAK,UAAU;YAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACpE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC1E,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACzB;QACL,OAAO,CAAC,CAAC;IACb,CAAC;aAEe,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI;QACpD,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QAC7H,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU;YAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;;YAC1H,KAAK,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAAE,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;oBAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAClJ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;aAEe,OAAO,CAAC,UAAU,EAAE,SAAS;QACzC,OAAO,UAAU,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,EAAE,CAAA;IACzE,CAAC;aAEe,UAAU,CAAC,WAAW,EAAE,aAAa;QACjD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU;YAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACnI,CAAC;aAEe,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS;QACvD,SAAS,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,YAAY,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,UAAU,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QAC5G,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,EAAE,UAAU,OAAO,EAAE,MAAM;YACrD,SAAS,SAAS,CAAC,KAAK,IAAI,IAAI;gBAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;aAAE;YAAC,OAAO,CAAC,EAAE;gBAAE,MAAM,CAAC,CAAC,CAAC,CAAC;aAAE,EAAE;YAC3F,SAAS,QAAQ,CAAC,KAAK,IAAI,IAAI;gBAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;aAAE;YAAC,OAAO,CAAC,EAAE;gBAAE,MAAM,CAAC,CAAC,CAAC,CAAC;aAAE,EAAE;YAC9F,SAAS,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE;YAC9G,IAAI,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;SACzE,CAAC,CAAC;IACP,CAAC;aAEe,WAAW,CAAC,OAAO,EAAE,IAAI;QACrC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,cAAa,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACjH,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,MAAM,KAAK,UAAU,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,cAAa,OAAO,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACzJ,SAAS,IAAI,CAAC,CAAC,IAAI,OAAO,UAAU,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;QAClE,SAAS,IAAI,CAAC,EAAE;YACZ,IAAI,CAAC;gBAAE,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC;YAC9D,OAAO,CAAC;gBAAE,IAAI;oBACV,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI;wBAAE,OAAO,CAAC,CAAC;oBAC7J,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;wBAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;oBACxC,QAAQ,EAAE,CAAC,CAAC,CAAC;wBACT,KAAK,CAAC,CAAC;wBAAC,KAAK,CAAC;4BAAE,CAAC,GAAG,EAAE,CAAC;4BAAC,MAAM;wBAC9B,KAAK,CAAC;4BAAE,CAAC,CAAC,KAAK,EAAE,CAAC;4BAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;wBACxD,KAAK,CAAC;4BAAE,CAAC,CAAC,KAAK,EAAE,CAAC;4BAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;4BAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;4BAAC,SAAS;wBACjD,KAAK,CAAC;4BAAE,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;4BAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;4BAAC,SAAS;wBACjD;4BACI,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;gCAAE,CAAC,GAAG,CAAC,CAAC;gCAAC,SAAS;6BAAE;4BAC5G,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;gCAAE,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;gCAAC,MAAM;6BAAE;4BACtF,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;gCAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gCAAC,CAAC,GAAG,EAAE,CAAC;gCAAC,MAAM;6BAAE;4BACrE,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;gCAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gCAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gCAAC,MAAM;6BAAE;4BACnE,IAAI,CAAC,CAAC,CAAC,CAAC;gCAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;4BACtB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;4BAAC,SAAS;qBAC9B;oBACD,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;iBAC9B;gBAAC,OAAO,CAAC,EAAE;oBAAE,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAAC,CAAC,GAAG,CAAC,CAAC;iBAAE;wBAAS;oBAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;iBAAE;YAC1D,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;gBAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;SACpF;IACL,CAAC;aAEe,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;QACvC,IAAI,EAAE,KAAK,SAAS;YAAE,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;aAEe,YAAY,CAAC,CAAC,EAAE,OAAO;QACnC,KAAK,IAAI,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;gBAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,CAAC;aAEe,QAAQ,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAC9E,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO;gBAC1C,IAAI,EAAE;oBACF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM;wBAAE,CAAC,GAAG,KAAK,CAAC,CAAC;oBACnC,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;iBAC3C;aACJ,CAAC;QACF,MAAM,IAAI,SAAS,CAAC,CAAC,GAAG,yBAAyB,GAAG,iCAAiC,CAAC,CAAC;IAC3F,CAAC;aAEe,MAAM,CAAC,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,OAAO,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC3D,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QACjB,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI;YACA,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI;gBAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;SAC9E;QACD,OAAO,KAAK,EAAE;YAAE,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;SAAE;gBAC/B;YACJ,IAAI;gBACA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;oBAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACpD;oBACO;gBAAE,IAAI,CAAC;oBAAE,MAAM,CAAC,CAAC,KAAK,CAAC;aAAE;SACpC;QACD,OAAO,EAAE,CAAC;IACd,CAAC;aAEe,QAAQ;QACpB,KAAK,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE;YAC9C,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,OAAO,EAAE,CAAC;IACd,CAAC;aAEe,cAAc;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;YAAE,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACpF,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;YAC5C,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE;gBAC7D,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,CAAC,CAAC;IACb,CAAC;IAAA,CAAC;aAEc,OAAO,CAAC,CAAC;QACrB,OAAO,IAAI,YAAY,OAAO,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC;aAEe,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS;QAC3D,IAAI,CAAC,MAAM,CAAC,aAAa;YAAE,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;QACvF,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;QAC9D,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,cAAc,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACtH,SAAS,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YAAE,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE;QAC1I,SAAS,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI;YAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAAE;QAAC,OAAO,CAAC,EAAE;YAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SAAE,EAAE;QAClF,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,YAAY,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QACxH,SAAS,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE;QAClD,SAAS,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE;QAClD,SAAS,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM;YAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;IACtF,CAAC;aAEe,gBAAgB,CAAC,CAAC;QAC9B,IAAI,CAAC,EAAE,CAAC,CAAC;QACT,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,cAAc,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5I,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;IACnJ,CAAC;aAEe,aAAa,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,aAAa;YAAE,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;QACvF,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,QAAQ,KAAK,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,cAAc,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACjN,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,OAAO,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE;QAChK,SAAS,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAS,CAAC,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE;IAChI,CAAC;aAEe,oBAAoB,CAAC,MAAM,EAAE,GAAG;QAC5C,IAAI,MAAM,CAAC,cAAc,EAAE;YAAE,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;SAAE;aAAM;YAAE,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;SAAE;QAC/G,OAAO,MAAM,CAAC;IAClB,CAAC;IAAA,CAAC;aAEc,YAAY,CAAC,GAAG;QAC5B,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU;YAAE,OAAO,GAAG,CAAC;QACtC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,GAAG,IAAI,IAAI;YAAE,KAAK,IAAI,CAAC,IAAI,GAAG;gBAAE,IAAI,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;oBAAE,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/F,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC;QACrB,OAAO,MAAM,CAAC;IAClB,CAAC;aAEe,eAAe,CAAC,GAAG;QAC/B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAC5D,CAAC;aAEe,sBAAsB,CAAC,QAAQ,EAAE,UAAU;QACvD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YAC3B,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;SACzE;QACD,OAAO,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;aAEe,sBAAsB,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK;QAC9D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YAC3B,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;SACzE;QACD,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChC,OAAO,KAAK,CAAC;IACjB;;AC9MaA,cAAe;QAQ1B,yBACU,aAA4B;YAA5B,kBAAa,GAAb,aAAa,CAAe;YAL7B,eAAU,GAAG,EAAE,CAAC;YAChB,iBAAY,GAAG,KAAK,CAAC;YACrB,oBAAe,GAAG,EAAE,CAAC;SAIzB;QAEL,kCAAQ,GAAR;YACE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YAErB,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,GAAG,UAAU,WAAoB;gBACnE,IAAI,WAAW,EAAE;oBACf,aAAa,CAAC,iBAAiB,EAAE,CAAC;iBACnC;aACF,CAAC;YAEF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;SACrD;QAED,qCAAW,GAAX;YACE,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;SACtC;QAED,sCAAY,GAAZ;YACE,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;SACtC;8BACF;KAhCD,IAgCC;AA5BUC;QAARC,UAAK,EAAE;kDAAiB;AAChBD;QAARC,UAAK,EAAE;oDAAsB;AACrBD;QAARC,UAAK,EAAE;uDAAsB;AANnBF,cAAe;QAP3BG,cAAS,CAAC;YACT,QAAQ,EAAE,SAAS;YACnB,o2CAAuC;;SAIxC,CAAC;OACWH,UAAe,CAgC3B;;AClCYI,yBAAa;QASxB;YAAA,iBAIC;YAVO,WAAM,GAAQ,MAAM,CAAC;YAEtB,WAAM,GAAG;gBACd,OAAO,EAAE,KAAK;aACf,CAAC;YAkBF,kBAAa,GAAG;gBACd,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;aAC7C,CAAC;YAEF,YAAO,GAAG,UAAU,GAAQ;gBAC1B,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;aACjD,CAAC;YAEF,oBAAe,GAAG;gBAChB,IAAI,IAAI,GAAQ,KAAI,CAAC;gBACrB,IAAI,IAAI,GAAG,IAAIC,YAAO,EAAE,CAAC;gBACzB,KAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAC,CAAM;oBAC9B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;oBACjB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBACtB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;iBACxB,EAAE,UAAU,GAAQ;oBACnB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;oBACvB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;wBACzB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;wBACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;qBACrB;yBAAM;wBACL,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;qBACrD;iBACF,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;aACb,CAAC;YAEF,sBAAiB,GAAG,UAAC,UAAiB;gBACpC,IAAI,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACxD,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;gBAC/C,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,4EAA4E,CAAC,CAAC;gBACzG,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBAE5C,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,UAAU,CAAC;gBAExD,OAAO,UAAU,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;aACjD,CAAC;YAUF,SAAI,GAAG;gBACL,KAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC9B,CAAC;YAEF,UAAK,GAAG;gBACN,KAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;aAC/B,CAAC;YAEF,SAAI,GAAG;gBACL,KAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC9B,CAAC;YAEF,iBAAY,GAAG,UAAC,GAAQ;gBACtB,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;aAC7C,CAAC;YA3EA,UAAU,CAAC,UAAU,CAAC,SAAS,GAAG;gBAChC,UAAU,EAAE,EAAE;aACf,CAAC;SACH;QAED,yCAAiB,GAAjB;YAAA,iBAQC;YAPC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;YACvC,IAAI,cAAc,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC9D,IAAI,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EACpD,eAAS,EACT,UAAC,MAAW,IAAO,IAAI,MAAM,KAAK,KAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,CAClF,CAAC;YACF,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;SAC3E;QAAA,CAAC;QAwCF,kCAAU,GAAV,UAAW,aAAkB;YAC3B,IAAI,aAAa,EAAE;gBACjB,UAAU,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;gBACrC,UAAU,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;gBACzC,UAAU,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC;aAC9C;SACF;QAkBD,kCAAU,GAAV,UAAW,KAAU;YACnB,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;YAC5B,UAAU,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC;SAC3C;QAED,iCAAS,GAAT;YACE,OAAO,IAAI,CAAC,MAAM,CAAA;SACnB;4BACF;KA/FD,IA+FC;AA/FYD,yBAAa;QADzBE,eAAU,EAAE;OACAF,qBAAa,CA+FzB;;ACzFYG,wBAAY;QAAzB;SAA6B;2BAAA;KAA7B,IAA6B;AAAhBA,wBAAY;QATxBC,aAAQ,CAAC;YACR,OAAO,EAAE,CAAEC,2BAAsB,CAAE;YACnC,OAAO,EAAE;gBACPC,mBAAY;aACb;YACD,OAAO,EAAE,CAACV,UAAe,CAAC;YAC1B,SAAS,EAAE,CAACI,qBAAa,CAAC;YAC1B,YAAY,EAAE,CAACJ,UAAe,CAAC;SAChC,CAAC;OACWO,oBAAY,CAAI;;ICf7B,YAAY,CAAC;IAEb;IACA,IAAM,iBAAiB,GAAG,EAAE,CAAC;IAE7B;;;;IAIA,IAAI,kBAAkB,GAAG,GAAG,CAAC;IAE7B;IACA,IAAI,UAAU,GAAG,IAAI,CAAC;IAEtB;IACA,IAAI,cAAc,GAAG,GAAG,CAAC;IAEzB;IACA,IAAI,kBAAkB,GAAG,GAAG,CAAC;IAE7B;IACA,IAAM,YAAY,GAAG;;;QAGnB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,SAAS;;;QAGlB,SAAS,EAAE,WAAW;;QAEtB,MAAM,EAAE,QAAQ;;QAEhB,OAAO,EAAE,SAAS;;QAElB,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,OAAO;KACf,CAAC;IAEF;;;;;;;;;;IAUA,IAAI,UAAU,GAAG;;QAEf,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;;QAG7C,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;;;;;QAMrC,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;;;QAIpC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;;QAEzB,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;;;QAInC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;;;;;QAK1B,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;;QAGxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;;QAElB,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;QAEpE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;;QAInD,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;;QAE3B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;;QAE1B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;;;QAIxB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;;;;;;;QAOtB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;;;QAI1B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;;QAE9B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAE3B,IAAI,CAAC,SAAS,GAAG;YACf,YAAY,EAAE,EAAE;SACjB,CAAC;IACJ,CAAC,CAAC;IAEF,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG;QAC1C,IAAI,OAAO,GAAG,EAAE,CAAC;;;;QAKjB,OAAO,CAAC,qBAAqB,GAAG,UAAU,CAAC;;;;;QAM3C,OAAO,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;QAElE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAE7D,UAAU,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;QAC5D,UAAU,CAAC,sBAAsB,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACvG,UAAU,CAAC,sBAAsB,CAAC,gBAAgB,CAC9C,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,oBAAoB,EACzD,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAC3C,CAAC;IACJ,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,YAAY,GAAG;QAClC,UAAU,CAAC,iBAAiB,EAAE,CAAC;QAC/B,UAAU,CAAC,iBAAiB,EAAE,CAAC;QAC/B,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;QAChC,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;QAC3C,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;YACxB,IAAI,UAAU,CAAC,YAAY,CAAC,WAAW,EAAE;gBACvC,UAAU,CAAC,iBAAiB,EAAE,CAAC;gBAC7B,OAAO;aACV;SACJ;QACD,UAAU,CAAC,gBAAgB,EAAE,CAAC;IAChC,CAAC,CAAC;IAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgCA,IAAI,aAAa,GAAG,UAAU,UAAU;QACtC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QAEjB,IAAI,CAAC,SAAS,GAAG,UAAU,MAAM;YAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;SACtB,CAAC;QAEF,IAAI,CAAC,IAAI,GAAG;YACV,IAAI,UAAU,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO;gBACjD,UAAU,CAAC,WAAW,KAAK,YAAY,CAAC,MAAM;gBAC9C,UAAU,CAAC,WAAW,KAAK,YAAY,CAAC,MAAM,EAAE;gBAChD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;gBACxC,OAAO;aACR;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACnB,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC;YAC9C,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YACvD,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YACzD,IAAI,CAAC,oBAAoB,EAAE,CAAC;SAC7B,CAAC;QAEF,IAAI,CAAC,oBAAoB,GAAG;YAC1B,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;SACpC,CAAA;QAED,IAAI,CAAC,KAAK,GAAG;YACX,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpB,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;YAC7C,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YACxD,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;SACzD,CAAC;QAEF,IAAI,CAAC,IAAI,GAAG;YACV,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;SACpB,CAAC;QAEF,IAAI,CAAC,IAAI,GAAG,UAAU,UAAiB;YAAjB,2BAAA,EAAA,iBAAiB;YACrC,IAAI,CAAC,UAAU,EAAE;gBACf,UAAU,GAAG,UAAU,CAAC,iBAAiB,CAAC;aAC3C;YACD,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SAC9B,CAAC;;;;;;QAOF,IAAI,CAAC,aAAa,GAAG,UAAU,UAAU;YACvC,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;SAC9C,CAAC;;;;;;;QAQF,IAAI,CAAC,aAAa,GAAG;YACnB,UAAU,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACnD,UAAU,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;YACjD,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;YAE7C,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,UAAU,CAAC,kBAAkB,EAAE,CAAC;YAChC,IAAI,CAAC,aAAa,EAAE,CAAC;SACtB,CAAC;QAEF,IAAI,CAAC,MAAM,GAAG;YACZ,UAAU,CAAC,oBAAoB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1D,UAAU,CAAC,mBAAmB,EAAE,CAAC;YACjC,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;YAC7C,IAAI,UAAU,CAAC,gBAAgB,GAAG,CAAC,EAAE;gBACjC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;aAC5C;YACD,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,UAAU,CAAC,kBAAkB,EAAE,CAAC;YAChC,IAAI,CAAC,oBAAoB,EAAE,CAAC;SAC7B,CAAC;QAEF,IAAI,CAAC,mBAAmB,GAAG;YACzB,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;SAC1C,CAAC;QAEF,IAAI,CAAC,gBAAgB,GAAG;YACtB,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;SACvC,CAAC;QAEF,IAAI,CAAC,aAAa,GAAG;;YAEnB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC1D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAEpD,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;SAC7B,CAAC;QAEF,IAAI,CAAC,wBAAwB,GAAG;YAC9B,IAAI,CAAC,MAAM,CAAC,wBAAwB,EAAE,CAAC;SACxC,CAAC;;;;QAKF,IAAI,CAAC,aAAa,GAAG,UAAU,OAAO,EAAE,IAAI;YAC1C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;SAC1C,CAAC;QAEF,IAAI,CAAC,SAAS,GAAG,UAAU,oBAAoB;YAC7C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;SAC7C,CAAC;QAEF,IAAI,CAAC,IAAI,GAAG;YACV,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACnB,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YAC3D,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;SAC9D,CAAC;QAEF,IAAI,CAAC,MAAM,GAAG;YACZ,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACrB,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YAC5D,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;SAC7D,CAAC;QAEF,IAAI,CAAC,OAAO,GAAG;YACb,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;SAC9B,CAAC;QAEF,IAAI,CAAC,MAAM,GAAG,UAAU,IAAI;YAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SAC1B,CAAC;IACJ,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG;QACtC,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QAC3D,WAAW,CAAC,gBAAgB,CAC1B,YAAY,EAAE,UAAU,CAAC,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;;QAGlE,IAAI,YAAY,GAAG,EAAE,CAAC;QAEtB,YAAY,CAAC,IAAI,GAAG;YAClB,WAAW,CAAC,IAAI,EAAE,CAAC;YAEnB,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YAChD,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YAC1B,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;SACrC,CAAC;QAEF,YAAY,CAAC,KAAK,GAAG;YACnB,WAAW,CAAC,KAAK,EAAE,CAAC;SACrB,CAAC;QAEF,YAAY,CAAC,IAAI,GAAG;YAClB,IAAI,OAAO,WAAW,CAAC,IAAI,KAAK,UAAU;gBACxC,WAAW,CAAC,IAAI,EAAE,CAAC;SACtB,CAAC;QAEF,YAAY,CAAC,IAAI,GAAG,UAAU,UAAU;YACtC,WAAW,CAAC,GAAG;gBACb,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,WAAW,CAAC,IAAI,EAAE,CAAC;SACpB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEnB,YAAY,CAAC,mBAAmB,GAAG;YACjC,OAAO,WAAW,CAAC,WAAW,CAAC;SAChC,CAAC;QAEF,YAAY,CAAC,gBAAgB,GAAG;YAC9B,OAAO,WAAW,CAAC,QAAQ,CAAC;SAC7B,CAAC;QAEF,YAAY,CAAC,oBAAoB,GAAG;YAClC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YAC9D,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YAChE,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;SACvE,CAAC;QAEF,YAAY,CAAC,SAAS,GAAG,UAAU,oBAAoB;YACrD,WAAW,CAAC,MAAM,GAAG,oBAAoB,GAAG,kBAAkB;gBAC5D,oBAAoB,GAAG,kBAAkB,GAAG,CAAC,CAAC;YAChD,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;YAClD,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAC;YAC7C,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,oBAAoB,GAAG,IAAI,CAAC;SAClD,CAAC;QAEF,YAAY,CAAC,IAAI,GAAG;YAClB,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;SAC1B,CAAC;QAEF,YAAY,CAAC,MAAM,GAAG;YACpB,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC;SAC3B,CAAC;QAEF,YAAY,CAAC,OAAO,GAAG;YACrB,OAAO,WAAW,CAAC,KAAK,CAAC;SAC1B,CAAC;QAEF,YAAY,CAAC,MAAM,GAAG,UAAU,IAAI;YAClC,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC;SAChC,CAAC;QAEF,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAEjD,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,GAAG,kBAAkB,CAAC,CAAC;QAExE,UAAU,CAAC,oBAAoB,EAAE,CAAC;QAElC,IAAI,UAAU,CAAC,gBAAgB,GAAG,CAAC,EAAE;YACnC,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;SACjC;IACH,CAAC,CAAC;IAEF;;;;IAIA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG;QACvC,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;;QAG/E,UAAU,CAAC,sBAAsB,CAAC,gBAAgB,CAC9C,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,iBAAiB,EACtD;YACI,IAAI,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE;gBAClC,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;aACpC;iBAAM;gBACH,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;aACnC;SACJ,CAAC,IAAI,CAAC,UAAU,CAAC,CACrB,CAAC;QAEF,UAAU,CAAC,sBAAsB,CAAC,gBAAgB,CAC9C,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,gBAAgB,EACrD;YACI,IAAI,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE;gBACjC,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;aACnC;iBAAM;gBACH,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;aACrC;SACJ,CAAC,IAAI,CAAC,UAAU,CAAC,CACrB,CAAC;QAEF,UAAU,CAAC,sBAAsB,CAAC,gBAAgB,CAC9C,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,oBAAoB,EACzD;YACI,IAAI,SAAS,GAAG,UAAU,CAAC,YAAY,CAAC,WAAW,GAAG,kBAAkB,CAAC;YACzE,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;YAClD,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;YAClC,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;SACzC,CAAC,IAAI,CAAC,UAAU,CAAC,CACrB,CAAC;;;;QAKF,IAAI,YAAY,GAAG,EAAE,CAAC;QAEtB,YAAY,CAAC,IAAI,GAAG;YAChB,IAAI,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE;gBAClC,UAAU,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC;aACnD;YAED,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YAChD,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YAC3B,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;YAC3D,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;SACtC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEnB,YAAY,CAAC,KAAK,GAAG;YACjB,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE;gBACnC,UAAU,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC;aACnD;SACJ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEnB,YAAY,CAAC,IAAI,GAAG;YACf,UAAU,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;SAC7C,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEnB,YAAY,CAAC,IAAI,GAAG,UAAU,UAAU;YACpC,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1E,IAAI,SAAS,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAC3C,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YAErE,SAAS,CAAC,QAAQ,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC;YAClE,SAAS,CAAC,QAAQ,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC;YACzE,SAAS,CAAC,QAAQ,CAAC,KAAK,GAAG,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;YACzE,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG;gBACxB,EAAC,KAAK,EAAE,iBAAiB,GAAG,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAC;aAAC,CAAC;YAEhF,IAAI,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAC3D,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAC/B,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAC9D,UAAU,SAAS;gBACf,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,2BAA2B;oBACnC,UAAU,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;aAC9C,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;SAC3B,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEnB,YAAY,CAAC,mBAAmB,GAAG;YAC/B,OAAO,UAAU,CAAC,YAAY,CAAC,WAAW,CAAC;SAC9C,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEnB,YAAY,CAAC,gBAAgB,GAAG;YAC5B,OAAO,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC;SAC3C,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEnB,YAAY,CAAC,oBAAoB,GAAG;YAChC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YAC/D,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YACjE,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YACvE,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;gBAC5C,UAAU,CAAC,aAAa,CAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,GAAG,GAAG;oBACtE,UAAU,CAAC,WAAW,GAAG,MAAM,GAAG,WAAW,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC;SAClF,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEnB,YAAY,CAAC,SAAS,GAAG,UAAU,oBAAoB;;YAEnD,IAAI,aAAa,GAAG,UAAU,CAAC,YAAY,CAAC,WAAW,CAAC;YACxD,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;YAClD,IAAI,oBAAoB,GAAG,kBAAkB,EAAE;gBAC3C,IAAI,MAAM,GAAI,UAAU,CAAC,aAAa,GAAG,kBAAkB,CAAC;gBAC5D,IAAI,oBAAoB,GAAG,MAAM,EAAE;oBAC/B,oBAAoB,GAAG,MAAM,GAAG,CAAC,GAAG,GAAG,MAAM,IAAI,CAAC,CAAC;iBACtD;gBACD,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAC;gBAC7C,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBACjD,aAAa,GAAG,oBAAoB,GAAG,kBAAkB,CAAC;aAC7D;iBAAM;gBACH,aAAa,GAAG,CAAC,CAAC;aACrB;YACD,UAAU,CAAC,YAAY,CAAC,WAAW,GAAG,aAAa,CAAC;YACpD,UAAU,CAAC,sBAAsB,CAAC,cAAc,EAAE,CAAC;SACtD,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEnB,YAAY,CAAC,IAAI,GAAG;YAChB,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE;gBAClC,UAAU,CAAC,sBAAsB,CAAC,YAAY,EAAE,CAAC;aACpD;SACJ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEnB,YAAY,CAAC,MAAM,GAAG;YAClB,IAAI,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE;gBACjC,UAAU,CAAC,sBAAsB,CAAC,YAAY,EAAE,CAAC;aACpD;SACJ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEnB,YAAY,CAAC,OAAO,GAAG;YACnB,OAAO,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC;SAC1C,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEnB,YAAY,CAAC,MAAM,GAAG,UAAU,IAAI;YAChC,UAAU,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC;YAC3C,UAAU,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;SAC5C,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEnB,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;;;QAIjD,IAAI,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE;YACjC,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;SACnC;QACD,IAAI,aAAa,GAAG,UAAU,CAAC,YAAY,CAAC,WAAW,GAAG,kBAAkB,CAAC;QAC7E,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;QAClD,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,aAAa,GAAG,IAAI,CAAC;QACtC,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC;QAE1C,UAAU,CAAC,oBAAoB,EAAE,CAAC;QAElC,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG;QAC1C,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QAC3D,WAAW,CAAC,WAAW,GAAG,UAAU,CAAC,gBAAgB,CAAC;QAEtD,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;IACpC,CAAC,CAAC;IAEF;;;;IAIA,UAAU,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,UAAU;QACrD,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,UAAU,CAAC,CAAC;QAEnD,UAAU,CAAC,iBAAiB,GAAG,UAAU,CAAC;;QAE1C,UAAU,CAAC,aAAa,CAAC,gBAAgB,GAAG,SAAS,CAAC;;QAGtD,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QAChD,EAAE,CAAC,GAAG,GAAG,iBAAiB,GAAG,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;;QAG3E,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;QACvD,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;QAC5B,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACnD,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QAE7B,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;QACjE,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;QACvE,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,kBAAkB,CAAC;QACjD,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;;QAGvC,UAAU,CAAC,iBAAiB,EAAE,CAAC;QAC/B,UAAU,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAChC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;QAClF,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAE/E,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;QAC3C,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC,CAAC;IAEF;;;;IAIA,UAAU,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,KAAK;QAC9C,IAAI,UAAU,CAAC,aAAa,IAAI,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;YAC1I,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,OAAO;SACR;QAED,IAAI,UAAU,CAAC,aAAa,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE;YAC7D,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAA;YAClD,OAAO;SACR;QAED,IAAI,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC3C,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;QACvD,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,IAAI,oBAAoB,EAAE;YAClD,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,gBAAgB,GAAG,UAAU,CAAC,aAAa,GAAG,QAAQ;gBACnF,kBAAkB,EAAE,EAAE,CAAC,CAAC;YAC1B,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC;YAClD,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC;SACpD;aAAM;YACL,QAAQ,GAAG,QAAQ,CAAC,QAAQ,GAAG,UAAU,CAAC,aAAa,GAAG,kBAAkB,EAAE,EAAE,CAAC,CAAC;YAClF,EAAE,GAAG,QAAQ,CAAC;YACd,EAAE,GAAG,QAAQ,CAAC;SACf;QAED,IAAI,UAAU,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO;YACjD,UAAU,CAAC,WAAW,KAAK,YAAY,CAAC,MAAM,EAAE;YAChD,UAAU,CAAC,gBAAgB,GAAG,QAAQ,CAAC;YACvC,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC;YACjC,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC;SACjC;QAED,IAAI,UAAU,CAAC,aAAa,EAAE;YAC5B,QAAQ,IAAI,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SACnE;QAED,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEF;;;;IAIA,UAAU,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,UAAU;QACnD,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;QAClD,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,KAAK,gBAAgB,EAAE;YACpD,GAAG,GAAG,kBAAkB,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;SAC7D;aAAM;YACL,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;SACvE;QACD,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG;QACxC,UAAU,CAAC,iBAAiB,EAAE,CAAC;;QAG/B,UAAU,CAAC,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,yBAAyB,EAAE,UAAU,CAAC,CAAC;IACnF,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG;QACvC,IAAI,UAAU,CAAC,KAAK,EAAE;YACpB,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAChC,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC;SACzB;IACH,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG;;QAEtC,UAAU,CAAC,gBAAgB,GAAG,UAAU,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC;QAC7E,UAAU,CAAC,oBAAoB,GAAG,UAAU,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;QAE9E,IAAI,UAAU,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO,EAAE;YACjD,IAAI,UAAU,CAAC,gBAAgB,GAAG,UAAU,CAAC,oBAAoB,EAAE;gBACjE,UAAU,CAAC,gBAAgB,IAAI,CAAC,CAAC;gBACjC,UAAU,CAAC,wBAAwB,EAAE,CAAC;aACvC;iBAAM;gBACL,UAAU,CAAC,WAAW,EAAE,CAAC;aAC1B;SACJ;IACL,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,wBAAwB,GAAG;QAC9C,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE;YACpC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;SACrB;QACD,IAAI,UAAU,CAAC,oBAAoB,GAAG,CAAC,EAAE;YACrC,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CACf,kBAAkB,GAAG,UAAU,CAAC,gBAAgB,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;SAC3F;QAED,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC;QAC1B,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;QACvD,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,GAAG,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;QAE3D,IAAI,EAAE,IAAI,kBAAkB,EAAE;YAC5B,UAAU,CAAC,WAAW,EAAE,CAAC;SAC1B;IACH,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,WAAW,GAAG;QACjC,UAAU,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAChC,UAAU,CAAC,iBAAiB,EAAE,CAAC;QAC/B,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;QAC3C,UAAU,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;QAEzC,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO;YACpC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QAE/B,IAAI,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO;YAC7C,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;IACjC,CAAC,CAAC;IAEF;;;;IAIA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,SAAS;QAC3D,IAAI,SAAS,IAAI,SAAS,IAAI,SAAS,IAAI,IAAI,EAAE;YAC/C,OAAO,IAAI,CAAC;SACb;QAED,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,SAAS,GAAG,CAAC,EAAE;YACjB,UAAU,GAAG,IAAI,CAAC;YAClB,SAAS,IAAI,CAAC,CAAC,CAAC;SACjB;QAED,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;QACzC,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;QAEtE,IAAI,KAAK,GAAG,EAAE;YAAE,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC;QACpC,IAAI,OAAO,GAAG,EAAE;YAAE,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;QAC1C,IAAI,OAAO,GAAG,EAAE;YAAE,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;QAE1C,OAAO,CAAC,UAAU,GAAG,GAAG,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;IACzE,CAAC,CAAC;IAEF;;;;IAIA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,SAAS;QAC3D,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS,CAAC;QAEjC,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;QACtC,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAChC,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAChC,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;QACrC,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;;QAEnB,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;QAC3B,OAAO,GAAG,CAAC,GAAG,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,OAAO,GAAG,CAAC,GAAG,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,SAAS,GAAG,KAAK,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC;QACnE,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,eAAe,GAAG;QACrC,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAC/E,IAAI,CAAC,WAAW;YAAE,OAAO;QAEzB,IAAI,KAAK,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;QAC1C,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,IAAI,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;QAC5B,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,IAAI,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QAC9B,IAAI,eAAe,GAAG,SAAS,CAAC,QAAQ,CAAC;QAEzC,IAAI,CAAC,MAAM,EAAE;YACX,OAAO;SACR;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,IAAI,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;;;YAIxB,IAAI,OAAO,CAAC,QAAQ,GAAG,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE;gBAC5D,SAAS;aACV;;YAGD,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE;gBACrD,IAAI,GAAG,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAA;gBAC7C,GAAG,CAAC,SAAS,IAAI,8BAA8B,GAAG,OAAO,CAAC,QAAQ;oBAChE,wBAAwB;oBACxB,UAAU,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,GAAG,YAAY,CAAC;aACnF;SACF;IACH,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,eAAe,GAAG;QACrC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,UAAU,QAAQ;YAC/D,QAAQ,CAAC,MAAM,EAAE,CAAC;SACnB,CAAC,CAAC;IACL,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,QAAQ,EAAE,eAAe;;QAE3E,IAAI,QAAQ,IAAI,CAAC,CAAC,EAAE;YAClB,OAAO,kBAAkB,CAAC;SAC3B;;;QAID,IAAI,QAAQ,GAAG,eAAe,EAAE;YAC9B,OAAO,kBAAkB,CAAC;SAC3B;;QAGD,OAAO,CAAC,kBAAkB,GAAG,QAAQ,IAAI,eAAe,CAAC;IAC3D,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG;;QAE1C,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;YAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;IAChC,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,cAAc,GAAG,UAAU,cAAc;QAC5D,UAAU,CAAC,iBAAiB,CAAC,CAAC,cAAc,CAAC,CAAC;IAChD,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,sBAAsB,GAAG,UAAU,aAAa;QACnE,UAAU,CAAC,aAAa,GAAG,aAAa,CAAC;IAC3C,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,6BAA6B,GAAG,UAAU,oBAAoB;QACjF,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;;QAG3C,IAAI,UAAU,CAAC,aAAa,IAAI,SAAS,IAAI,UAAU,CAAC,aAAa,GAAG,CAAC,EAAE;;YAEzE,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;gBAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;SAC/B;;aAEI,IAAI,UAAU,CAAC,aAAa,KAAK,SAAS,IAAI,oBAAoB,IAAI,UAAU,CAAC,aAAa,EAAE;;YAEnG,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;gBAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;SAChC;;aAEI;;YAEH,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;gBAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;SAC/B;IACH,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG;QAC5B,UAAU,CAAC,sBAAsB,CAAC,MAAM,EAAE,CAAC;IAC7C,CAAC,CAAA;IAED;;;IAGA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,UAAU,MAAM;QACvD,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACnD,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;QACvE,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;QAEjE,IAAI,MAAM,EAAE;;YAEV,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,qDAAqD,CAAC;YACvF,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;YAClC,eAAe,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;YACzC,kBAAkB,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;YAC5C,kBAAkB,CAAC,SAAS,GAAG,IAAI,CAAC;;YAGpC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;YACjE,eAAe,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;YACxE,kBAAkB,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;SAC9E;aAAM;;YAEL,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,mDAAmD,CAAC;YACrF,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;YAClC,eAAe,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;YACzC,kBAAkB,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;YAC5C,kBAAkB,CAAC,SAAS,GAAG,KAAK,CAAC;;YAGrC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;YACpE,eAAe,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;YAC3E,kBAAkB,CAAC,mBAAmB,CAAC,SAAS,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;SACjF;IACH,CAAC,CAAA;IAED;;;IAGA,UAAU,CAAC,SAAS,CAAC,mBAAmB,GAAG;QACzC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,SAAS;YACzC,UAAU,CAAC,iBAAiB,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;IACpE,CAAC,CAAC;IAEF;;;;IAIA,UAAU,CAAC,iBAAiB,GAAG,UAAS,aAAa;QACnD,IAAI,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;QACzD,IAAI,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;QACnD,IAAI,aAAa,KAAK,CAAC,EAAE;YACrB,OAAO,cAAc,CAAC;SACzB;QACD,cAAc,GAAG,CAAC,aAAa,GAAG,EAAE,IAAI,GAAG,GAAG,cAAc,CAAC;QAC7D,IAAI,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;QACpD,IAAI,cAAc,KAAK,CAAC,EAAE;YACtB,OAAO,cAAc,CAAC;SACzB;QACD,OAAO,cAAc,GAAG,GAAG,GAAG,cAAc,CAAC;IAC/C,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG;;QAEvC,IAAI,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QACvD,IAAI,aAAa,GACf,OAAO,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAErE,IAAI,aAAa,EAAE;;YAEjB,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;SACrC;IACH,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG;;QAEtC,IAAI,aAAa,GACf,QAAQ,CAAC,kBAAkB,CAAC,IAAI,QAAQ,CAAC,wBAAwB,CAAC,CAAC;QAErE,IAAI,aAAa,EAAE;YACjB,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SAC9B;IACH,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,uBAAuB,GAAG;QAC7C,UAAU,CAAC,UAAU,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;IACjD,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG;QAC1C,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QACrE,IAAI,mBAAmB,GAAG,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;QAEzE,IAAI,UAAU,CAAC,UAAU,EAAE;YACzB,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO;gBACjF,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YAE3C,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO;gBACvF,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;SAC/C;aAAM;YACL,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO;gBACjF,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YAE5C,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO;gBACvF,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;SAC9C;IACH,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG;QAC1C,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QACrE,IAAI,mBAAmB,GAAG,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;QAEzE,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO;YACjF,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;QAE3C,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO;YACvF,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;IAC/C,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG;QACtC,IAAI,aAAa,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QAC7D,IAAI,aAAa,IAAI,aAAa,CAAC,KAAK,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO;YACrE,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;IACtC,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG;QACtC,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE;YAC/B,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;YACvD,IAAI,OAAO,IAAI,OAAO,CAAC,iBAAiB,EAAE,EAAE;;gBAE1C,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;aAC9D;iBAAM;gBACL,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;aAC5D;SACF;IACH,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG;QACtC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE;YACvC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;YACtD,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;YAC5D,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;YAC5D,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;SAC9D;IACH,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG;QACtC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;QACtD,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;QAC5D,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;QAC5D,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;IAC/D,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG;QACvC,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC;QAC/E,IAAI,yBAAyB,GAAG,cAAc,GAAG,iBAAiB,CAAC;QACnE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,MAAM;YACpD,yBAAyB,GAAG,IAAI,CAAC;QACnC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QAC5D,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;IAC9D,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,YAAY,GAAG;;QAElC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;YAC9C,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACvC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS;YACjD,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,UAAU,CAAC,CAAC;QACrE,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,SAAS;YAC7C,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,aAAa,CAAC,CAAC;;QAGxE,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,gBAAgB,CACrD,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAClD,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB,CAClD,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAClD,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,gBAAgB,CAC5D,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACpD,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB,CAClD,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;QACzE,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,gBAAgB,CACnD,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;QAC3E,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB,CAClD,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC7D,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB,CAClD,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC7D,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB,CACxD,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC7D,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB,CACxD,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC7D,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB,CACxD,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAClD,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB,CACxD,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAClD,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB,CAClD,UAAU,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5D,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB,CAClD,UAAU,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5D,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,gBAAgB,CACpD,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC7D,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,gBAAgB,CACpD,UAAU,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5D,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,gBAAgB,CACvD,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC7D,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,gBAAgB,CACvD,UAAU,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5D,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,gBAAgB,CAC3D,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC1D,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,gBAAgB,CAC7D,OAAO,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QACzD,QAAQ,CAAC,gBAAgB,CACvB,kBAAkB,EAAE,UAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;QAClF,QAAQ,CAAC,gBAAgB,CACvB,wBAAwB,EAAE,UAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;;QAGxF,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAC9C,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;QACzE,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,gBAAgB,CAC/C,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;QAC1E,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;IACjE,CAAC,CAAC;IAEF;;;IAGA,UAAU,CAAC,SAAS,CAAC,cAAc,GAAG;QACpC,IAAI,OAAO,UAAU,CAAC,SAAS,KAAK,WAAW,IAAI,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YACtI,UAAU,CAAC,aAAa,GAAG,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC3E,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC7C,IAAI,MAAM,GAAG,IAAI,CAAC;YAClB,IAAI,SAAS,GAAG,IAAI,CAAC;YACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACxD,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACvC,SAAS,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC;gBAChC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACrC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACtC,MAAM,CAAC,SAAS;oBACd,YAAY,GAAG,iBAAiB,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;wBACvE,sBAAsB,CAAC;gBACzB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC7E,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;aACxB;SACF;IACH,CAAC,CAAC;IAEF,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG;QACtC,IAAI,OAAO,UAAU,CAAC,SAAS,KAAK,WAAW,IAAI,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;YACtI,UAAU,CAAC,aAAa,GAAG,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC3E,OAAO,UAAU,CAAC,aAAa,CAAC;SACjC;aAAM;YACL,OAAO,IAAI,CAAC;SACb;IACH,CAAC,CAAC;IAEF;;;;;IAKA,UAAU,CAAC,eAAe,GAAG,UAAU,KAAK;QAC1C,QAAQ,KAAK,CAAC,IAAI;YAChB,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB;gBAC5C,OAAO,6BAA6B;qBACjC,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;YACxD,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM;gBAC/B,OAAO,wCAAwC;qBAC5C,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;YACxD,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa;gBACtC,OAAO,6CAA6C;qBACjD,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;YACxD,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB;gBAC1C,OAAO,sCAAsC;qBAC1C,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;YACxD,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB;gBAC1C,OAAO,iDAAiD;qBACrD,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;YACxD,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB;gBAC7C,OAAO,sDAAsD;qBAC1D,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;YACxD,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa;gBACtC,OAAO,2DAA2D;qBAC/D,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;YACxD,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO;gBAChC,OAAO,0BAA0B;qBAC9B,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;YACxD;gBACE,OAAO,KAAK,CAAC;SAChB;IACH,CAAC,CAAC;IAEF,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;IAClC,MAAM,CAAC,uBAAuB,CAAC,GAAG,UAAU,WAAW;QACrD,IAAI,WAAW,EAAE;YACf,UAAU,CAAC,oBAAoB,EAAE,CAAC;SACnC;IACH,CAAC,CAAC;IAEF,MAAM,CAAC,UAAU,GAAG,UAAU;;ICpuC9B;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/bundles/thinkam.net-ng-cast.umd.min.js b/dist/bundles/thinkam.net-ng-cast.umd.min.js index c71f208..547a886 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.min.js +++ b/dist/bundles/thinkam.net-ng-cast.umd.min.js @@ -12,5 +12,5 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */function a(e,t,i,n){var a,o=arguments.length,r=o<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,i,n);else for(var d=e.length-1;d>=0;d--)(a=e[d])&&(r=(o<3?a(r):o>3?a(t,i,r):a(t,i))||r);return o>3&&r&&Object.defineProperty(t,i,r),r}e.ɵa=function(){function e(e){this.ngCastService=e,this.videoImage="",this.imageOffline=!1,this.srcImageOffline=""}return e.prototype.ngOnInit=function(){this.window=window;var e=this.ngCastService;this.window.__onGCastApiAvailable=function(t){t&&e.initializeCastApi()},this.castingStatus=this.ngCastService.getStatus()},e.prototype.openSession=function(){this.ngCastService.discoverDevices()},e.prototype.closeSession=function(){this.ngCastService.discoverDevices()},e}(),a([t.Input()],e.ɵa.prototype,"videoImage",void 0),a([t.Input()],e.ɵa.prototype,"imageOffline",void 0),a([t.Input()],e.ɵa.prototype,"srcImageOffline",void 0),e.ɵa=a([t.Component({selector:"ng-cast",template:'
\n
\x3c!-- Put Your Image Width --\x3e\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\nTV Offline\n',styles:['body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:1100px}#video_image{height:536px;margin:20px auto 0 40px;width:960px}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin:0 0 0 40px;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;width:960px}#video_element{background-color:#000;margin:20px auto 0 40px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin:-4px 0 0 40px;opacity:.9;padding:10px;width:940px}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px;width:95%}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;left:8px;margin:-60px 0 0 40px;opacity:.7;padding:0;position:absolute;top:650px;transition:opacity 1s;width:960px;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}']})],e.ɵa),e.NgCastService=function(){function e(){var e=this;this.window=window,this.status={casting:!1},this.onInitSuccess=function(){console.log("GCast initialization success")},this.onError=function(e){console.log("GCast initialization failed",e)},this.discoverDevices=function(){var t=e,i=new n.Subject;return e.cast.requestSession((function(e){t.session=e,t.setCasting(!0),i.next("CONNECTED")}),(function(e){t.setCasting(!1),"cancel"===e.code?(t.session=void 0,i.next("CANCEL")):console.error("Error selecting a cast device",e)})),i},this.onMediaDiscovered=function(e){var t=window.document.createElement("script");return t.setAttribute("type","text/javascript"),t.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"),window.document.body.appendChild(t),globalThis.CastPlayer.mediaJSON.categories=e,globalThis.CastPlayer.addMediaContents()},this.play=function(){e.currentMedia.play(null)},this.pause=function(){e.currentMedia.pause(null)},this.stop=function(){e.currentMedia.stop(null)},this.onMediaError=function(e){console.error("Error launching media",e)},globalThis.CastPlayer.mediaJSON={categories:[]}}return e.prototype.initializeCastApi=function(){var e=this;this.cast=this.window.chrome.cast;var t=new this.cast.SessionRequest("4F8B3483"),i=new this.cast.ApiConfig(t,(function(){}),(function(t){e.cast.ReceiverAvailability.AVAILABLE}));this.cast.initialize(i,this.onInitSuccess,this.onError)},e.prototype.initialize=function(e){e&&(globalThis.CastPlayer.initializeUI(),globalThis.CastPlayer.setupLocalPlayer(),this.window.__onGCastApiAvailable=function(e){e&&globalThis.CastPlayer.initializeCastPlayer()})},e.prototype.setCasting=function(e){this.status.casting=e},e.prototype.getStatus=function(){return this.status},e}(),e.NgCastService=a([t.Injectable()],e.NgCastService),e.NgCastModule=function(){},e.NgCastModule=a([t.NgModule({schemas:[t.CUSTOM_ELEMENTS_SCHEMA],imports:[i.CommonModule],exports:[e.ɵa],providers:[e.NgCastService],declarations:[e.ɵa]})],e.NgCastModule);var o=600,r=100,d="IDLE",l="BUFFERING",s="LOADED",u="PLAYING",c="PAUSED",p="ERROR",m=function(){this.playerHandler=new g(this),this.playerState=d,this.playerStateBeforeSwitch=null,this.remotePlayer=null,this.remotePlayerController=null,this.currentMediaTime=0,this.mediaDuration=-1,this.timer=null,this.incrementMediaTimeHandler=this.incrementMediaTime.bind(this),this.seekMediaListener=this.seekMedia.bind(this),this.currentMediaIndex=0,this.mediaContents=null,this.fullscreen=!1,this.mediaInfo=null,this.whenSkippable=null,this.liveSeekableRange=null,this.isLiveContent=!1,this.mediaJSON={categories:[]}};m.prototype.initializeCastPlayer=function(){var e={receiverApplicationId:"4F8B3483"};e.autoJoinPolicy=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,cast.framework.CastContext.getInstance().setOptions(e),y.remotePlayer=new cast.framework.RemotePlayer,y.remotePlayerController=new cast.framework.RemotePlayerController(y.remotePlayer),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,y.switchPlayer.bind(y))},m.prototype.switchPlayer=function(){y.stopProgressTimer(),y.resetVolumeSlider(),y.playerHandler.stop(),y.playerState=d,cast&&cast.framework&&y.remotePlayer.isConnected?y.setupRemotePlayer():y.setupLocalPlayer()};var g=function(e){this.target={},this.setTarget=function(e){this.target=e},this.play=function(){e.playerState===u||e.playerState===c||e.playerState===s?(this.target.play(),e.playerState=u,document.getElementById("play").style.display="none",document.getElementById("pause").style.display="block",this.updateDisplayMessage()):this.load(e.currentMediaIndex)},this.updateDisplayMessage=function(){this.target.updateDisplayMessage()},this.pause=function(){this.target.pause(),e.playerState=c,document.getElementById("play").style.display="block",document.getElementById("pause").style.display="none"},this.stop=function(){e.playerState=d,this.target.stop()},this.load=function(t){void 0===t&&(t=null),t||(t=e.currentMediaIndex),e.playerState=l,this.target.load(t)},this.isMediaLoaded=function(e){return this.target.isMediaLoaded(e)},this.prepareToPlay=function(){e.mediaDuration=this.getMediaDuration(),e.playerHandler.updateDurationDisplay(),e.playerState=s,this.play(),e.startProgressTimer(),this.updateDisplay()},this.loaded=function(){e.currentMediaDuration=this.getMediaDuration(),e.updateMediaDuration(),e.playerState=s,e.currentMediaTime>0&&this.seekTo(e.currentMediaTime),this.play(),e.startProgressTimer(),this.updateDisplayMessage()},this.getCurrentMediaTime=function(){return this.target.getCurrentMediaTime()},this.getMediaDuration=function(){return this.target.getMediaDuration()},this.updateDisplay=function(){this.currentMediaTime=this.target.getCurrentMediaTime(),this.mediaDuration=this.target.getMediaDuration(),this.target.updateDisplay()},this.updateCurrentTimeDisplay=function(){this.target.updateCurrentTimeDisplay()},this.setTimeString=function(e,t){this.target.setTimeString(e,t)},this.setVolume=function(e){this.target.setVolume(e)},this.mute=function(){this.target.mute(),document.getElementById("audio_on").style.display="none",document.getElementById("audio_off").style.display="block"},this.unMute=function(){this.target.unMute(),document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},this.isMuted=function(){return this.target.isMuted()},this.seekTo=function(e){this.target.seekTo(e)}};m.prototype.setupLocalPlayer=function(){var e=document.getElementById("video_element");e.addEventListener("loadeddata",y.onMediaLoadedLocally.bind(y));var t={play:function(){e.play(),document.getElementById("video_image").style.display="none",e.style.display="block"},pause:function(){e.pause()},stop:function(){e.stop()}};t.load=function(t){e.src=y.mediaContents[t].sources[0],e.load()}.bind(y),t.getCurrentMediaTime=function(){return e.currentTime},t.getMediaDuration=function(){return e.duration},t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none"},t.setVolume=function(t){e.volume=t0&&y.playerHandler.play()},m.prototype.setupRemotePlayer=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,function(){y.remotePlayer.isPaused?y.playerHandler.pause():y.playerHandler.play()}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,function(){y.remotePlayer.isMuted?y.playerHandler.mute():y.playerHandler.unMute()}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,function(){var e=y.remotePlayer.volumeLevel*r,t=document.getElementById("audio_bg_level");t.style.height=e+"px",t.style.marginTop=-e+"px"}.bind(y));var t={};t.play=function(){y.remotePlayer.isPaused&&y.remotePlayerController.playOrPause(),document.getElementById("video_image").style.display="block",document.getElementById("video_element").style.display="none"}.bind(y),t.pause=function(){y.remotePlayer.isPaused||y.remotePlayerController.playOrPause()}.bind(y),t.stop=function(){y.remotePlayerController.stop()}.bind(y),t.load=function(t){console.log("Loading..."+y.mediaContents[t].title);var i=new chrome.cast.media.MediaInfo(y.mediaContents[t].sources[0],"video/mp4");i.metadata=new chrome.cast.media.GenericMediaMetadata,i.metadata.metadataType=chrome.cast.media.MetadataType.GENERIC,i.metadata.title=y.mediaContents[t].title,i.metadata.images=[{url:""+y.mediaContents[t].thumb}];var n=new chrome.cast.media.LoadRequest(i);e.loadMedia(n).then(y.playerHandler.loaded.bind(y.playerHandler),function(e){y.playerState=p,console.log("Remote media load error: "+m.getErrorMessage(e))}.bind(y))}.bind(y),t.getCurrentMediaTime=function(){return y.remotePlayer.currentTime}.bind(y),t.getMediaDuration=function(){return y.remotePlayer.duration}.bind(y),t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="block",document.getElementById("playerstatebg").style.display="block",document.getElementById("video_image_overlay").style.display="block",document.getElementById("playerstate").innerHTML=y.mediaContents[y.currentMediaIndex].title+" "+y.playerState+" on "+e.getCastDevice().friendlyName}.bind(y),t.setVolume=function(e){var t=y.remotePlayer.volumeLevel,i=document.getElementById("audio_bg_level");if(en&&(e=n+(pos-n)/2),i.style.height=e+"px",i.style.marginTop=-e+"px",t=e/r}else t=1;y.remotePlayer.volumeLevel=t,y.remotePlayerController.setVolumeLevel()}.bind(y),t.mute=function(){y.remotePlayer.isMuted||y.remotePlayerController.muteOrUnmute()}.bind(y),t.unMute=function(){y.remotePlayer.isMuted&&y.remotePlayerController.muteOrUnmute()}.bind(y),t.isMuted=function(){return y.remotePlayer.isMuted}.bind(y),t.seekTo=function(e){y.remotePlayer.currentTime=e,y.remotePlayerController.seek()}.bind(y),y.playerHandler.setTarget(t),y.remotePlayer.isMuted&&y.playerHandler.mute();var i=y.remotePlayer.volumeLevel*r,n=document.getElementById("audio_bg_level");n.style.height=i+"px",n.style.marginTop=-i+"px",y.hideFullscreenButton(),y.playerHandler.play()},m.prototype.onMediaLoadedLocally=function(){document.getElementById("video_element").currentTime=y.currentMediaTime,y.playerHandler.loaded()},m.prototype.selectMedia=function(e){console.log("Media index selected: "+e),y.currentMediaIndex=e,y.playerHandler.currentMediaInfo=void 0,document.getElementById("video_image").src=""+y.mediaContents[e].thumb,document.getElementById("progress_indicator").style.marginLeft="0px",document.getElementById("progress").style.width="0px";var t=document.getElementById("seekable_window"),i=document.getElementById("unseekable_overlay");t.style.width=o,i.style.width="0px",y.stopProgressTimer(),y.currentMediaTime=0,y.playerHandler.setTimeString(document.getElementById("currentTime"),0),y.playerHandler.setTimeString(document.getElementById("duration"),0),y.playerState=d,y.playerHandler.play()},m.prototype.seekMedia=function(e){if(null==y.mediaDuration||cast.framework.CastContext.getInstance().getCurrentSession()&&!y.remotePlayer.canSeek)console.log("Error - Not seekable");else if(!y.isLiveContent||y.liveSeekableRange){var t=parseInt(e.offsetX,10),i=document.getElementById("progress_indicator"),n=document.getElementById("progress"),a=0,r=0,d=0;"progress_indicator"==e.currentTarget.id?(a=parseInt(y.currentMediaTime+y.mediaDuration*t/o,10),r=parseInt(i.style.marginLeft,10)+t,d=parseInt(n.style.width,10)+t):(a=parseInt(t*y.mediaDuration/o,10),r=t,d=t),y.playerState!==u&&y.playerState!==c||(y.currentMediaTime=a,n.style.width=d+"px",i.style.marginLeft=r+"px"),y.isLiveContent&&(a+=y.mediaInfo.metadata.sectionStartTimeInMedia),y.playerHandler.seekTo(a)}else console.log("Live content has no seekable range.")},m.prototype.setVolume=function(e){var t=document.getElementById("audio_bg_level"),i=0;i="audio_bg_track"===e.currentTarget.id?r-parseInt(e.offsetY,10):parseInt(t.clientHeight,10)-parseInt(e.offsetY,10),y.playerHandler.setVolume(i)},m.prototype.startProgressTimer=function(){y.stopProgressTimer(),y.timer=setInterval(y.incrementMediaTimeHandler,1e3)},m.prototype.stopProgressTimer=function(){y.timer&&(clearInterval(y.timer),y.timer=null)},m.prototype.incrementMediaTime=function(){y.currentMediaTime=y.playerHandler.getCurrentMediaTime(),y.currentMediaDuration=y.playerHandler.getMediaDuration(),y.playerState===u&&(y.currentMediaTime0)var t=Math.floor(o*y.currentMediaTime/y.currentMediaDuration);e.style.width=t+"px",document.getElementById("progress_indicator").style.marginLeft=-621+t+"px",t>=o&&y.endPlayback()},m.prototype.endPlayback=function(){y.currentMediaTime=0,y.stopProgressTimer(),y.playerState=d,y.playerHandler.updateDisplay();var e=document.getElementById("play");e&&e.style&&e.display&&(e.style.display="block");var t=document.getElementById("pause");t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.getMediaTimeString=function(e){if(null==e||null==e)return null;var t=!1;e<0&&(t=!0,e*=-1);var i=Math.floor(e/3600),n=Math.floor((e-3600*i)/60),a=Math.floor(e-3600*i-60*n);return i<10&&(i="0"+i),n<10&&(n="0"+n),a<10&&(a="0"+a),(t?"-":"")+i+":"+n+":"+a},m.prototype.getClockTimeString=function(e){if(!e)return"0:00:00";var t=new Date(1e3*e),i=t.getHours(),n=t.getMinutes(),a=t.getSeconds(),o=i>=12?"PM":"AM";return(i=(i%=12)||12)+":"+(n=("0"+n).slice(-2))+":"+(a=("0"+a).slice(-2))+" "+o},m.prototype.updateAdMarkers=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e){var t=e.getMediaSession();if(t){var i=t.media;if(i){var n=i.breaks,a=i.duration;if(n)for(var o=0;oa&&r.isEmbedded))if(!document.getElementById("ad"+r.position))document.getElementById("progress").innerHTML+='
'}}}}},m.prototype.removeAdMarkers=function(){document.querySelectorAll(".adMarker").forEach((function(e){e.remove()}))},m.prototype.adPositionToMargin=function(e,t){return-1==e||e>t?o:o*e/t},m.prototype.onBreakClipIdChanged=function(){var e=document.getElementById("skip");e&&e.style&&e.style.display&&(e.style.display="none")},m.prototype.isPlayingBreak=function(e){y.enableProgressBar(!e)},m.prototype.onWhenSkippableChanged=function(e){y.whenSkippable=e},m.prototype.onCurrentBreakClipTimeChanged=function(e){var t=document.getElementById("skip");null==y.whenSkippable||y.whenSkippable<0?t&&t.style&&t.style.display&&(t.style.display="none"):void 0!==y.whenSkippable||e>=y.whenSkippable?t&&t.style&&t.style.display&&(t.style.display="block"):t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.skipAd=function(){y.remotePlayerController.skipAd()},m.prototype.enableProgressBar=function(e){var t=document.getElementById("progress"),i=document.getElementById("progress_indicator"),n=document.getElementById("seekable_window");e?(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_progress.png')",t.style.cursor="pointer",n.style.cursor="pointer",i.style.cursor="pointer",i.draggable=!0,t.addEventListener("click",y.seekMediaListener),n.addEventListener("click",y.seekMediaListener),i.addEventListener("dragend",y.seekMediaListener)):(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_buffer.png')",t.style.cursor="default",n.style.cursor="default",i.style.cursor="default",i.draggable=!1,t.removeEventListener("click",y.seekMediaListener),n.removeEventListener("click",y.seekMediaListener),i.removeEventListener("dragend",y.seekMediaListener))},m.prototype.updateMediaDuration=function(){document.getElementById("duration").innerHTML=m.getDurationString(y.currentMediaDuration)},m.getDurationString=function(e){var t=""+Math.floor(e%60),i=Math.floor(e/60);if(0===i)return t;t=i%60+":"+t;var n=Math.floor(i/60);return 0===n?t:n+":"+t},m.prototype.requestFullScreen=function(){var e=document.getElementById("video_element"),t=e.requestFullScreen||e.webkitRequestFullScreen;t&&(t.call(e),console.log("Requested fullscreen"))},m.prototype.cancelFullScreen=function(){var e=document.cancelFullScreen||document.webkitCancelFullScreen;e&&e.call(document)},m.prototype.fullscreenChangeHandler=function(){y.fullscreen=!y.fullscreen},m.prototype.showFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");y.fullscreen?(e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="block")):(e&&e.style&&e.style.display&&(e.style.display="block"),t&&t.style&&t.style.display&&(t.style.display="none"))},m.prototype.hideFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.showMediaControl=function(){var e=document.getElementById("media_control");e&&e.style&&e.style.opacity&&(e.style.opacity=.7)},m.prototype.hideMediaControl=function(){if("undefined"!=typeof cast){var e=cast.framework.CastContext.getInstance();e&&e.getCurrentSession()?document.getElementById("media_control").style.opacity=.7:document.getElementById("media_control").style.opacity=0}},m.prototype.showVolumeSlider=function(){y.playerHandler.isMuted()||(document.getElementById("audio_bg").style.opacity=1,document.getElementById("audio_bg_track").style.opacity=1,document.getElementById("audio_bg_level").style.opacity=1,document.getElementById("audio_indicator").style.opacity=1)},m.prototype.hideVolumeSlider=function(){document.getElementById("audio_bg").style.opacity=0,document.getElementById("audio_bg_track").style.opacity=0,document.getElementById("audio_bg_level").style.opacity=0,document.getElementById("audio_indicator").style.opacity=0},m.prototype.resetVolumeSlider=function(){var e=.5*document.getElementById("audio_bg_track").clientHeight;document.getElementById("audio_bg_level").style.height=e+"px",document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},m.prototype.initializeUI=function(){document.getElementById("media_title").innerHTML=y.mediaContents[0].title,document.getElementById("media_subtitle").innerHTML=y.mediaContents[y.currentMediaIndex].subtitle,document.getElementById("media_desc").innerHTML=y.mediaContents[y.currentMediaIndex].description,document.getElementById("progress_bg").addEventListener("click",y.seekMedia.bind(y)),document.getElementById("progress").addEventListener("click",y.seekMedia.bind(y)),document.getElementById("progress_indicator").addEventListener("dragend",y.seekMedia.bind(y)),document.getElementById("audio_on").addEventListener("click",y.playerHandler.mute.bind(y.playerHandler)),document.getElementById("audio_off").addEventListener("click",y.playerHandler.unMute.bind(y.playerHandler)),document.getElementById("audio_bg").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_on").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_level").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_track").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_level").addEventListener("click",y.setVolume.bind(y)),document.getElementById("audio_bg_track").addEventListener("click",y.setVolume.bind(y)),document.getElementById("audio_bg").addEventListener("mouseout",y.hideVolumeSlider.bind(y)),document.getElementById("audio_on").addEventListener("mouseout",y.hideVolumeSlider.bind(y)),document.getElementById("main_video").addEventListener("mouseover",y.showMediaControl.bind(y)),document.getElementById("main_video").addEventListener("mouseout",y.hideMediaControl.bind(y)),document.getElementById("media_control").addEventListener("mouseover",y.showMediaControl.bind(y)),document.getElementById("media_control").addEventListener("mouseout",y.hideMediaControl.bind(y)),document.getElementById("fullscreen_expand").addEventListener("click",y.requestFullScreen.bind(y)),document.getElementById("fullscreen_collapse").addEventListener("click",y.cancelFullScreen.bind(y)),document.addEventListener("fullscreenchange",y.fullscreenChangeHandler.bind(y),!1),document.addEventListener("webkitfullscreenchange",y.fullscreenChangeHandler.bind(y),!1),document.getElementById("play").addEventListener("click",y.playerHandler.play.bind(y.playerHandler)),document.getElementById("pause").addEventListener("click",y.playerHandler.pause.bind(y.playerHandler)),document.getElementById("progress_indicator").draggable=!0},m.prototype.addVideoThumbs=function(){if(void 0!==y.mediaJSON&&y.mediaJSON.categories&&y.mediaJSON.categories.length>0){y.mediaContents=y.mediaJSON.categories[0].videos;for(var e=document.getElementById("carousel"),t=null,i=null,n=0;n',t.addEventListener("click",y.selectMedia.bind(y,n)),e.appendChild(t)}},m.prototype.addMediaContents=function(){return void 0!==y.mediaJSON&&y.mediaJSON.categories&&y.mediaJSON.categories.length>0?(y.mediaContents=y.mediaJSON.categories[0].videos,y.mediaContents):null},m.getErrorMessage=function(e){switch(e.code){case chrome.cast.ErrorCode.API_NOT_INITIALIZED:return"The API is not initialized."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CANCEL:return"The operation was canceled by the user"+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CHANNEL_ERROR:return"A channel to the receiver is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.EXTENSION_MISSING:return"The Cast extension is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.INVALID_PARAMETER:return"The parameters to the operation were not valid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:return"No receiver was compatible with the session request."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.SESSION_ERROR:return"A session could not be created, or a session was invalid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.TIMEOUT:return"The operation timed out."+(e.description?" :"+e.description:"");default:return e}};var y=new m;window.__onGCastApiAvailable=function(e){e&&y.initializeCastPlayer()},window.CastPlayer=y,Object.defineProperty(e,"__esModule",{value:!0})})); + ***************************************************************************** */function a(e,t,i,n){var a,o=arguments.length,r=o<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,i,n);else for(var d=e.length-1;d>=0;d--)(a=e[d])&&(r=(o<3?a(r):o>3?a(t,i,r):a(t,i))||r);return o>3&&r&&Object.defineProperty(t,i,r),r}e.ɵa=function(){function e(e){this.ngCastService=e,this.videoImage="",this.imageOffline=!1,this.srcImageOffline=""}return e.prototype.ngOnInit=function(){this.window=window;var e=this.ngCastService;this.window.__onGCastApiAvailable=function(t){t&&e.initializeCastApi()},this.castingStatus=this.ngCastService.getStatus()},e.prototype.openSession=function(){this.ngCastService.discoverDevices()},e.prototype.closeSession=function(){this.ngCastService.discoverDevices()},e}(),a([t.Input()],e.ɵa.prototype,"videoImage",void 0),a([t.Input()],e.ɵa.prototype,"imageOffline",void 0),a([t.Input()],e.ɵa.prototype,"srcImageOffline",void 0),e.ɵa=a([t.Component({selector:"ng-cast",template:'
\n
\x3c!-- Put Your Image Width --\x3e\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\nTV Offline\n',styles:['body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:1100px}#video_image{height:536px;margin:20px auto 0 40px;width:960px}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin:0 0 0 40px;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;width:960px}#video_element{background-color:#000;margin:20px auto 0 40px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin:-4px 0 0 40px;opacity:.9;padding:10px;width:940px}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px;width:95%}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;left:8px;margin:-60px 0 0 40px;opacity:.7;padding:0;position:absolute;top:650px;transition:opacity 1s;width:960px;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}']})],e.ɵa),e.NgCastService=function(){function e(){var e=this;this.window=window,this.status={casting:!1},this.onInitSuccess=function(){console.log("GCast initialization success")},this.onError=function(e){console.log("GCast initialization failed",e)},this.discoverDevices=function(){var t=e,i=new n.Subject;return e.cast.requestSession((function(e){t.session=e,t.setCasting(!0),i.next("CONNECTED")}),(function(e){t.setCasting(!1),"cancel"===e.code?(t.session=void 0,i.next("CANCEL")):console.error("Error selecting a cast device",e)})),i},this.onMediaDiscovered=function(e){var t=window.document.createElement("script");return t.setAttribute("type","text/javascript"),t.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"),window.document.body.appendChild(t),globalThis.CastPlayer.mediaJSON.categories=e,globalThis.CastPlayer.addMediaContents()},this.play=function(){e.currentMedia.play(null)},this.pause=function(){e.currentMedia.pause(null)},this.stop=function(){e.currentMedia.stop(null)},this.onMediaError=function(e){console.error("Error launching media",e)},globalThis.CastPlayer.mediaJSON={categories:[]}}return e.prototype.initializeCastApi=function(){var e=this;this.cast=this.window.chrome.cast;var t=new this.cast.SessionRequest("4F8B3483"),i=new this.cast.ApiConfig(t,(function(){}),(function(t){e.cast.ReceiverAvailability.AVAILABLE}));this.cast.initialize(i,this.onInitSuccess,this.onError)},e.prototype.initialize=function(e){e&&(globalThis.CastPlayer.initializeUI(),globalThis.CastPlayer.setupLocalPlayer(),globalThis.CastPlayer.initializeCastPlayer())},e.prototype.setCasting=function(e){this.status.casting=e,globalThis.CastPlayer.setupRemotePlayer()},e.prototype.getStatus=function(){return this.status},e}(),e.NgCastService=a([t.Injectable()],e.NgCastService),e.NgCastModule=function(){},e.NgCastModule=a([t.NgModule({schemas:[t.CUSTOM_ELEMENTS_SCHEMA],imports:[i.CommonModule],exports:[e.ɵa],providers:[e.NgCastService],declarations:[e.ɵa]})],e.NgCastModule);var o=600,r=100,d="IDLE",l="BUFFERING",s="LOADED",u="PLAYING",c="PAUSED",p="ERROR",m=function(){this.playerHandler=new g(this),this.playerState=d,this.playerStateBeforeSwitch=null,this.remotePlayer=null,this.remotePlayerController=null,this.currentMediaTime=0,this.mediaDuration=-1,this.timer=null,this.incrementMediaTimeHandler=this.incrementMediaTime.bind(this),this.seekMediaListener=this.seekMedia.bind(this),this.currentMediaIndex=0,this.mediaContents=null,this.fullscreen=!1,this.mediaInfo=null,this.whenSkippable=null,this.liveSeekableRange=null,this.isLiveContent=!1,this.mediaJSON={categories:[]}};m.prototype.initializeCastPlayer=function(){var e={receiverApplicationId:"4F8B3483"};e.autoJoinPolicy=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,cast.framework.CastContext.getInstance().setOptions(e),y.remotePlayer=new cast.framework.RemotePlayer,y.remotePlayerController=new cast.framework.RemotePlayerController(y.remotePlayer),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,y.switchPlayer.bind(y))},m.prototype.switchPlayer=function(){y.stopProgressTimer(),y.resetVolumeSlider(),y.playerHandler.stop(),y.playerState=d,cast&&cast.framework&&y.remotePlayer.isConnected?y.setupRemotePlayer():y.setupLocalPlayer()};var g=function(e){this.target={},this.setTarget=function(e){this.target=e},this.play=function(){e.playerState===u||e.playerState===c||e.playerState===s?(this.target.play(),e.playerState=u,document.getElementById("play").style.display="none",document.getElementById("pause").style.display="block",this.updateDisplayMessage()):this.load(e.currentMediaIndex)},this.updateDisplayMessage=function(){this.target.updateDisplayMessage()},this.pause=function(){this.target.pause(),e.playerState=c,document.getElementById("play").style.display="block",document.getElementById("pause").style.display="none"},this.stop=function(){e.playerState=d,this.target.stop()},this.load=function(t){void 0===t&&(t=null),t||(t=e.currentMediaIndex),e.playerState=l,this.target.load(t)},this.isMediaLoaded=function(e){return this.target.isMediaLoaded(e)},this.prepareToPlay=function(){e.mediaDuration=this.getMediaDuration(),e.playerHandler.updateDurationDisplay(),e.playerState=s,this.play(),e.startProgressTimer(),this.updateDisplay()},this.loaded=function(){e.currentMediaDuration=this.getMediaDuration(),e.updateMediaDuration(),e.playerState=s,e.currentMediaTime>0&&this.seekTo(e.currentMediaTime),this.play(),e.startProgressTimer(),this.updateDisplayMessage()},this.getCurrentMediaTime=function(){return this.target.getCurrentMediaTime()},this.getMediaDuration=function(){return this.target.getMediaDuration()},this.updateDisplay=function(){this.currentMediaTime=this.target.getCurrentMediaTime(),this.mediaDuration=this.target.getMediaDuration(),this.target.updateDisplay()},this.updateCurrentTimeDisplay=function(){this.target.updateCurrentTimeDisplay()},this.setTimeString=function(e,t){this.target.setTimeString(e,t)},this.setVolume=function(e){this.target.setVolume(e)},this.mute=function(){this.target.mute(),document.getElementById("audio_on").style.display="none",document.getElementById("audio_off").style.display="block"},this.unMute=function(){this.target.unMute(),document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},this.isMuted=function(){return this.target.isMuted()},this.seekTo=function(e){this.target.seekTo(e)}};m.prototype.setupLocalPlayer=function(){var e=document.getElementById("video_element");e.addEventListener("loadeddata",y.onMediaLoadedLocally.bind(y));var t={play:function(){e.play(),document.getElementById("video_image").style.display="none",e.style.display="block"},pause:function(){e.pause()},stop:function(){"function"==typeof e.stop&&e.stop()}};t.load=function(t){e.src=y.mediaContents[t].sources[0],e.load()}.bind(y),t.getCurrentMediaTime=function(){return e.currentTime},t.getMediaDuration=function(){return e.duration},t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none"},t.setVolume=function(t){e.volume=t0&&y.playerHandler.play()},m.prototype.setupRemotePlayer=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,function(){y.remotePlayer.isPaused?y.playerHandler.pause():y.playerHandler.play()}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,function(){y.remotePlayer.isMuted?y.playerHandler.mute():y.playerHandler.unMute()}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,function(){var e=y.remotePlayer.volumeLevel*r,t=document.getElementById("audio_bg_level");t.style.height=e+"px",t.style.marginTop=-e+"px"}.bind(y));var t={};t.play=function(){y.remotePlayer.isPaused&&y.remotePlayerController.playOrPause(),document.getElementById("video_image").style.display="block",document.getElementById("video_element").style.display="none"}.bind(y),t.pause=function(){y.remotePlayer.isPaused||y.remotePlayerController.playOrPause()}.bind(y),t.stop=function(){y.remotePlayerController.stop()}.bind(y),t.load=function(t){console.log("Loading..."+y.mediaContents[t].title);var i=new chrome.cast.media.MediaInfo(y.mediaContents[t].sources[0],"video/mp4");i.metadata=new chrome.cast.media.GenericMediaMetadata,i.metadata.metadataType=chrome.cast.media.MetadataType.GENERIC,i.metadata.title=y.mediaContents[t].title,i.metadata.images=[{url:""+y.mediaContents[t].thumb}];var n=new chrome.cast.media.LoadRequest(i);e.loadMedia(n).then(y.playerHandler.loaded.bind(y.playerHandler),function(e){y.playerState=p,console.log("Remote media load error: "+m.getErrorMessage(e))}.bind(y))}.bind(y),t.getCurrentMediaTime=function(){return y.remotePlayer.currentTime}.bind(y),t.getMediaDuration=function(){return y.remotePlayer.duration}.bind(y),t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="block",document.getElementById("playerstatebg").style.display="block",document.getElementById("video_image_overlay").style.display="block",document.getElementById("playerstate").innerHTML=y.mediaContents[y.currentMediaIndex].title+" "+y.playerState+" on "+e.getCastDevice().friendlyName}.bind(y),t.setVolume=function(e){var t=y.remotePlayer.volumeLevel,i=document.getElementById("audio_bg_level");if(en&&(e=n+(pos-n)/2),i.style.height=e+"px",i.style.marginTop=-e+"px",t=e/r}else t=1;y.remotePlayer.volumeLevel=t,y.remotePlayerController.setVolumeLevel()}.bind(y),t.mute=function(){y.remotePlayer.isMuted||y.remotePlayerController.muteOrUnmute()}.bind(y),t.unMute=function(){y.remotePlayer.isMuted&&y.remotePlayerController.muteOrUnmute()}.bind(y),t.isMuted=function(){return y.remotePlayer.isMuted}.bind(y),t.seekTo=function(e){y.remotePlayer.currentTime=e,y.remotePlayerController.seek()}.bind(y),y.playerHandler.setTarget(t),y.remotePlayer.isMuted&&y.playerHandler.mute();var i=y.remotePlayer.volumeLevel*r,n=document.getElementById("audio_bg_level");n.style.height=i+"px",n.style.marginTop=-i+"px",y.hideFullscreenButton(),y.playerHandler.play()},m.prototype.onMediaLoadedLocally=function(){document.getElementById("video_element").currentTime=y.currentMediaTime,y.playerHandler.loaded()},m.prototype.selectMedia=function(e){console.log("Media index selected: "+e),y.currentMediaIndex=e,y.playerHandler.currentMediaInfo=void 0,document.getElementById("video_image").src=""+y.mediaContents[e].thumb,document.getElementById("progress_indicator").style.marginLeft="0px",document.getElementById("progress").style.width="0px";var t=document.getElementById("seekable_window"),i=document.getElementById("unseekable_overlay");t.style.width=o,i.style.width="0px",y.stopProgressTimer(),y.currentMediaTime=0,y.playerHandler.setTimeString(document.getElementById("currentTime"),0),y.playerHandler.setTimeString(document.getElementById("duration"),0),y.playerState=d,y.playerHandler.play()},m.prototype.seekMedia=function(e){if(null==y.mediaDuration||cast.framework.CastContext.getInstance().getCurrentSession()&&!y.remotePlayer.canSeek)console.log("Error - Not seekable");else if(!y.isLiveContent||y.liveSeekableRange){var t=parseInt(e.offsetX,10),i=document.getElementById("progress_indicator"),n=document.getElementById("progress"),a=0,r=0,d=0;"progress_indicator"==e.currentTarget.id?(a=parseInt(y.currentMediaTime+y.mediaDuration*t/o,10),r=parseInt(i.style.marginLeft,10)+t,d=parseInt(n.style.width,10)+t):(a=parseInt(t*y.mediaDuration/o,10),r=t,d=t),y.playerState!==u&&y.playerState!==c||(y.currentMediaTime=a,n.style.width=d+"px",i.style.marginLeft=r+"px"),y.isLiveContent&&(a+=y.mediaInfo.metadata.sectionStartTimeInMedia),y.playerHandler.seekTo(a)}else console.log("Live content has no seekable range.")},m.prototype.setVolume=function(e){var t=document.getElementById("audio_bg_level"),i=0;i="audio_bg_track"===e.currentTarget.id?r-parseInt(e.offsetY,10):parseInt(t.clientHeight,10)-parseInt(e.offsetY,10),y.playerHandler.setVolume(i)},m.prototype.startProgressTimer=function(){y.stopProgressTimer(),y.timer=setInterval(y.incrementMediaTimeHandler,1e3)},m.prototype.stopProgressTimer=function(){y.timer&&(clearInterval(y.timer),y.timer=null)},m.prototype.incrementMediaTime=function(){y.currentMediaTime=y.playerHandler.getCurrentMediaTime(),y.currentMediaDuration=y.playerHandler.getMediaDuration(),y.playerState===u&&(y.currentMediaTime0)var t=Math.floor(o*y.currentMediaTime/y.currentMediaDuration);e.style.width=t+"px",document.getElementById("progress_indicator").style.marginLeft=-621+t+"px",t>=o&&y.endPlayback()},m.prototype.endPlayback=function(){y.currentMediaTime=0,y.stopProgressTimer(),y.playerState=d,y.playerHandler.updateDisplay();var e=document.getElementById("play");e&&e.style&&e.display&&(e.style.display="block");var t=document.getElementById("pause");t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.getMediaTimeString=function(e){if(null==e||null==e)return null;var t=!1;e<0&&(t=!0,e*=-1);var i=Math.floor(e/3600),n=Math.floor((e-3600*i)/60),a=Math.floor(e-3600*i-60*n);return i<10&&(i="0"+i),n<10&&(n="0"+n),a<10&&(a="0"+a),(t?"-":"")+i+":"+n+":"+a},m.prototype.getClockTimeString=function(e){if(!e)return"0:00:00";var t=new Date(1e3*e),i=t.getHours(),n=t.getMinutes(),a=t.getSeconds(),o=i>=12?"PM":"AM";return(i=(i%=12)||12)+":"+(n=("0"+n).slice(-2))+":"+(a=("0"+a).slice(-2))+" "+o},m.prototype.updateAdMarkers=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e){var t=e.getMediaSession();if(t){var i=t.media;if(i){var n=i.breaks,a=i.duration;if(n)for(var o=0;oa&&r.isEmbedded))if(!document.getElementById("ad"+r.position))document.getElementById("progress").innerHTML+='
'}}}}},m.prototype.removeAdMarkers=function(){document.querySelectorAll(".adMarker").forEach((function(e){e.remove()}))},m.prototype.adPositionToMargin=function(e,t){return-1==e||e>t?o:o*e/t},m.prototype.onBreakClipIdChanged=function(){var e=document.getElementById("skip");e&&e.style&&e.style.display&&(e.style.display="none")},m.prototype.isPlayingBreak=function(e){y.enableProgressBar(!e)},m.prototype.onWhenSkippableChanged=function(e){y.whenSkippable=e},m.prototype.onCurrentBreakClipTimeChanged=function(e){var t=document.getElementById("skip");null==y.whenSkippable||y.whenSkippable<0?t&&t.style&&t.style.display&&(t.style.display="none"):void 0!==y.whenSkippable||e>=y.whenSkippable?t&&t.style&&t.style.display&&(t.style.display="block"):t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.skipAd=function(){y.remotePlayerController.skipAd()},m.prototype.enableProgressBar=function(e){var t=document.getElementById("progress"),i=document.getElementById("progress_indicator"),n=document.getElementById("seekable_window");e?(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_progress.png')",t.style.cursor="pointer",n.style.cursor="pointer",i.style.cursor="pointer",i.draggable=!0,t.addEventListener("click",y.seekMediaListener),n.addEventListener("click",y.seekMediaListener),i.addEventListener("dragend",y.seekMediaListener)):(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_buffer.png')",t.style.cursor="default",n.style.cursor="default",i.style.cursor="default",i.draggable=!1,t.removeEventListener("click",y.seekMediaListener),n.removeEventListener("click",y.seekMediaListener),i.removeEventListener("dragend",y.seekMediaListener))},m.prototype.updateMediaDuration=function(){document.getElementById("duration").innerHTML=m.getDurationString(y.currentMediaDuration)},m.getDurationString=function(e){var t=""+Math.floor(e%60),i=Math.floor(e/60);if(0===i)return t;t=i%60+":"+t;var n=Math.floor(i/60);return 0===n?t:n+":"+t},m.prototype.requestFullScreen=function(){var e=document.getElementById("video_element"),t=e.requestFullScreen||e.webkitRequestFullScreen;t&&(t.call(e),console.log("Requested fullscreen"))},m.prototype.cancelFullScreen=function(){var e=document.cancelFullScreen||document.webkitCancelFullScreen;e&&e.call(document)},m.prototype.fullscreenChangeHandler=function(){y.fullscreen=!y.fullscreen},m.prototype.showFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");y.fullscreen?(e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="block")):(e&&e.style&&e.style.display&&(e.style.display="block"),t&&t.style&&t.style.display&&(t.style.display="none"))},m.prototype.hideFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.showMediaControl=function(){var e=document.getElementById("media_control");e&&e.style&&e.style.opacity&&(e.style.opacity=.7)},m.prototype.hideMediaControl=function(){if("undefined"!=typeof cast){var e=cast.framework.CastContext.getInstance();e&&e.getCurrentSession()?document.getElementById("media_control").style.opacity=.7:document.getElementById("media_control").style.opacity=0}},m.prototype.showVolumeSlider=function(){y.playerHandler.isMuted()||(document.getElementById("audio_bg").style.opacity=1,document.getElementById("audio_bg_track").style.opacity=1,document.getElementById("audio_bg_level").style.opacity=1,document.getElementById("audio_indicator").style.opacity=1)},m.prototype.hideVolumeSlider=function(){document.getElementById("audio_bg").style.opacity=0,document.getElementById("audio_bg_track").style.opacity=0,document.getElementById("audio_bg_level").style.opacity=0,document.getElementById("audio_indicator").style.opacity=0},m.prototype.resetVolumeSlider=function(){var e=.5*document.getElementById("audio_bg_track").clientHeight;document.getElementById("audio_bg_level").style.height=e+"px",document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},m.prototype.initializeUI=function(){document.getElementById("media_title").innerHTML=y.mediaContents[0].title,document.getElementById("media_subtitle").innerHTML=y.mediaContents[y.currentMediaIndex].subtitle,document.getElementById("media_desc").innerHTML=y.mediaContents[y.currentMediaIndex].description,document.getElementById("progress_bg").addEventListener("click",y.seekMedia.bind(y)),document.getElementById("progress").addEventListener("click",y.seekMedia.bind(y)),document.getElementById("progress_indicator").addEventListener("dragend",y.seekMedia.bind(y)),document.getElementById("audio_on").addEventListener("click",y.playerHandler.mute.bind(y.playerHandler)),document.getElementById("audio_off").addEventListener("click",y.playerHandler.unMute.bind(y.playerHandler)),document.getElementById("audio_bg").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_on").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_level").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_track").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_level").addEventListener("click",y.setVolume.bind(y)),document.getElementById("audio_bg_track").addEventListener("click",y.setVolume.bind(y)),document.getElementById("audio_bg").addEventListener("mouseout",y.hideVolumeSlider.bind(y)),document.getElementById("audio_on").addEventListener("mouseout",y.hideVolumeSlider.bind(y)),document.getElementById("main_video").addEventListener("mouseover",y.showMediaControl.bind(y)),document.getElementById("main_video").addEventListener("mouseout",y.hideMediaControl.bind(y)),document.getElementById("media_control").addEventListener("mouseover",y.showMediaControl.bind(y)),document.getElementById("media_control").addEventListener("mouseout",y.hideMediaControl.bind(y)),document.getElementById("fullscreen_expand").addEventListener("click",y.requestFullScreen.bind(y)),document.getElementById("fullscreen_collapse").addEventListener("click",y.cancelFullScreen.bind(y)),document.addEventListener("fullscreenchange",y.fullscreenChangeHandler.bind(y),!1),document.addEventListener("webkitfullscreenchange",y.fullscreenChangeHandler.bind(y),!1),document.getElementById("play").addEventListener("click",y.playerHandler.play.bind(y.playerHandler)),document.getElementById("pause").addEventListener("click",y.playerHandler.pause.bind(y.playerHandler)),document.getElementById("progress_indicator").draggable=!0},m.prototype.addVideoThumbs=function(){if(void 0!==y.mediaJSON&&y.mediaJSON.categories&&y.mediaJSON.categories.length>0){y.mediaContents=y.mediaJSON.categories[0].videos;for(var e=document.getElementById("carousel"),t=null,i=null,n=0;n',t.addEventListener("click",y.selectMedia.bind(y,n)),e.appendChild(t)}},m.prototype.addMediaContents=function(){return void 0!==y.mediaJSON&&y.mediaJSON.categories&&y.mediaJSON.categories.length>0?(y.mediaContents=y.mediaJSON.categories[0].videos,y.mediaContents):null},m.getErrorMessage=function(e){switch(e.code){case chrome.cast.ErrorCode.API_NOT_INITIALIZED:return"The API is not initialized."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CANCEL:return"The operation was canceled by the user"+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CHANNEL_ERROR:return"A channel to the receiver is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.EXTENSION_MISSING:return"The Cast extension is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.INVALID_PARAMETER:return"The parameters to the operation were not valid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:return"No receiver was compatible with the session request."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.SESSION_ERROR:return"A session could not be created, or a session was invalid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.TIMEOUT:return"The operation timed out."+(e.description?" :"+e.description:"");default:return e}};var y=new m;window.__onGCastApiAvailable=function(e){e&&y.initializeCastPlayer()},window.CastPlayer=y,Object.defineProperty(e,"__esModule",{value:!0})})); //# sourceMappingURL=thinkam.net-ng-cast.umd.min.js.map \ No newline at end of file diff --git a/dist/bundles/thinkam.net-ng-cast.umd.min.js.map b/dist/bundles/thinkam.net-ng-cast.umd.min.js.map index 2e5a70e..3a0caa7 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.min.js.map +++ b/dist/bundles/thinkam.net-ng-cast.umd.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","NgCastComponent","ngCastService","this","videoImage","imageOffline","srcImageOffline","prototype","ngOnInit","window","isAvailable","initializeCastApi","castingStatus","getStatus","openSession","discoverDevices","closeSession","tslib_1.__decorate","Input","Component","selector","template","NgCastService","_this","status","casting","onInitSuccess","console","log","onError","err","self","subj","Subject","cast","requestSession","s","session","setCasting","next","code","undefined","error","onMediaDiscovered","categories","script","createElement","setAttribute","body","appendChild","globalThis","CastPlayer","mediaJSON","addMediaContents","play","currentMedia","pause","stop","onMediaError","sessionRequest","SessionRequest","apiConfig","ApiConfig","ReceiverAvailability","AVAILABLE","initialize","mediaContents","initializeUI","setupLocalPlayer","initializeCastPlayer","value","Injectable","NgCastModule","NgModule","schemas","CUSTOM_ELEMENTS_SCHEMA","imports","CommonModule","exports","providers","declarations","PROGRESS_BAR_WIDTH","FULL_VOLUME_HEIGHT","PLAYER_STATE","playerHandler","PlayerHandler","playerState","playerStateBeforeSwitch","remotePlayer","remotePlayerController","currentMediaTime","mediaDuration","timer","incrementMediaTimeHandler","incrementMediaTime","bind","seekMediaListener","seekMedia","currentMediaIndex","fullscreen","mediaInfo","whenSkippable","liveSeekableRange","isLiveContent","options","receiverApplicationId","autoJoinPolicy","chrome","AutoJoinPolicy","ORIGIN_SCOPED","framework","CastContext","getInstance","setOptions","castPlayer","RemotePlayer","RemotePlayerController","addEventListener","RemotePlayerEventType","IS_CONNECTED_CHANGED","switchPlayer","stopProgressTimer","resetVolumeSlider","isConnected","setupRemotePlayer","setTarget","document","getElementById","style","display","updateDisplayMessage","load","mediaIndex","isMediaLoaded","prepareToPlay","getMediaDuration","updateDurationDisplay","startProgressTimer","updateDisplay","loaded","currentMediaDuration","updateMediaDuration","seekTo","getCurrentMediaTime","updateCurrentTimeDisplay","setTimeString","element","time","setVolume","volumeSliderPosition","mute","unMute","isMuted","localPlayer","onMediaLoadedLocally","playerTarget","src","currentTime","duration","volume","p","height","marginTop","muted","DEFAULT_VOLUME","showFullscreenButton","castSession","getCurrentSession","IS_PAUSED_CHANGED","isPaused","IS_MUTED_CHANGED","VOLUME_LEVEL_CHANGED","newVolume","volumeLevel","playOrPause","media","MediaInfo","metadata","GenericMediaMetadata","metadataType","MetadataType","GENERIC","title","images","url","request","LoadRequest","loadMedia","then","errorCode","getErrorMessage","innerHTML","getCastDevice","friendlyName","currentVolume","vScale","pos","setVolumeLevel","muteOrUnmute","seek","hideFullscreenButton","selectMedia","currentMediaInfo","marginLeft","width","seekable_window","unseekable_overlay","event","canSeek","position","parseInt","offsetX","pi","progress","seekTime","pp","pw","currentTarget","id","sectionStartTimeInMedia","mouseEvent","offsetY","clientHeight","setInterval","clearInterval","updateProgressBarByTimer","endPlayback","isNaN","Math","floor","getMediaTimeString","timestamp","isNegative","hours","minutes","seconds","getClockTimeString","date","Date","getHours","getMinutes","getSeconds","ampm","slice","updateAdMarkers","getMediaSession","breaks","contentDuration","adBreak","isEmbedded","adPositionToMargin","removeAdMarkers","querySelectorAll","forEach","adMarker","remove","onBreakClipIdChanged","skip","isPlayingBreak","enableProgressBar","onWhenSkippableChanged","onCurrentBreakClipTimeChanged","currentBreakClipTime","skipAd","enable","progress_indicator","backgroundImage","cursor","draggable","removeEventListener","getDurationString","durationInSec","durationString","durationInMin","durationInHour","requestFullScreen","requestMethod","call","cancelFullScreen","fullscreenChangeHandler","fullscreen_expand","fullscreen_collapse","showMediaControl","media_control","opacity","hideMediaControl","context","showVolumeSlider","hideVolumeSlider","defaultVolumeSliderHeight","addVideoThumbs","ni","newdiv","divIdName","ErrorCode","API_NOT_INITIALIZED","description","CANCEL","CHANNEL_ERROR","EXTENSION_MISSING","INVALID_PARAMETER","RECEIVER_UNAVAILABLE","SESSION_ERROR","TIMEOUT"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n this.window['__onGCastApiAvailable'] = (isAvailable: boolean) => {\n if (isAvailable) {\n globalThis.CastPlayer.initializeCastPlayer();\n }\n };\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n"]} \ No newline at end of file +{"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","NgCastComponent","ngCastService","this","videoImage","imageOffline","srcImageOffline","prototype","ngOnInit","window","isAvailable","initializeCastApi","castingStatus","getStatus","openSession","discoverDevices","closeSession","tslib_1.__decorate","Input","Component","selector","template","NgCastService","_this","status","casting","onInitSuccess","console","log","onError","err","self","subj","Subject","cast","requestSession","s","session","setCasting","next","code","undefined","error","onMediaDiscovered","categories","script","createElement","setAttribute","body","appendChild","globalThis","CastPlayer","mediaJSON","addMediaContents","play","currentMedia","pause","stop","onMediaError","sessionRequest","SessionRequest","apiConfig","ApiConfig","ReceiverAvailability","AVAILABLE","initialize","mediaContents","initializeUI","setupLocalPlayer","initializeCastPlayer","value","setupRemotePlayer","Injectable","NgCastModule","NgModule","schemas","CUSTOM_ELEMENTS_SCHEMA","imports","CommonModule","exports","providers","declarations","PROGRESS_BAR_WIDTH","FULL_VOLUME_HEIGHT","PLAYER_STATE","playerHandler","PlayerHandler","playerState","playerStateBeforeSwitch","remotePlayer","remotePlayerController","currentMediaTime","mediaDuration","timer","incrementMediaTimeHandler","incrementMediaTime","bind","seekMediaListener","seekMedia","currentMediaIndex","fullscreen","mediaInfo","whenSkippable","liveSeekableRange","isLiveContent","options","receiverApplicationId","autoJoinPolicy","chrome","AutoJoinPolicy","ORIGIN_SCOPED","framework","CastContext","getInstance","setOptions","castPlayer","RemotePlayer","RemotePlayerController","addEventListener","RemotePlayerEventType","IS_CONNECTED_CHANGED","switchPlayer","stopProgressTimer","resetVolumeSlider","isConnected","setTarget","document","getElementById","style","display","updateDisplayMessage","load","mediaIndex","isMediaLoaded","prepareToPlay","getMediaDuration","updateDurationDisplay","startProgressTimer","updateDisplay","loaded","currentMediaDuration","updateMediaDuration","seekTo","getCurrentMediaTime","updateCurrentTimeDisplay","setTimeString","element","time","setVolume","volumeSliderPosition","mute","unMute","isMuted","localPlayer","onMediaLoadedLocally","playerTarget","src","currentTime","duration","volume","p","height","marginTop","muted","DEFAULT_VOLUME","showFullscreenButton","castSession","getCurrentSession","IS_PAUSED_CHANGED","isPaused","IS_MUTED_CHANGED","VOLUME_LEVEL_CHANGED","newVolume","volumeLevel","playOrPause","media","MediaInfo","metadata","GenericMediaMetadata","metadataType","MetadataType","GENERIC","title","images","url","request","LoadRequest","loadMedia","then","errorCode","getErrorMessage","innerHTML","getCastDevice","friendlyName","currentVolume","vScale","pos","setVolumeLevel","muteOrUnmute","seek","hideFullscreenButton","selectMedia","currentMediaInfo","marginLeft","width","seekable_window","unseekable_overlay","event","canSeek","position","parseInt","offsetX","pi","progress","seekTime","pp","pw","currentTarget","id","sectionStartTimeInMedia","mouseEvent","offsetY","clientHeight","setInterval","clearInterval","updateProgressBarByTimer","endPlayback","isNaN","Math","floor","getMediaTimeString","timestamp","isNegative","hours","minutes","seconds","getClockTimeString","date","Date","getHours","getMinutes","getSeconds","ampm","slice","updateAdMarkers","getMediaSession","breaks","contentDuration","adBreak","isEmbedded","adPositionToMargin","removeAdMarkers","querySelectorAll","forEach","adMarker","remove","onBreakClipIdChanged","skip","isPlayingBreak","enableProgressBar","onWhenSkippableChanged","onCurrentBreakClipTimeChanged","currentBreakClipTime","skipAd","enable","progress_indicator","backgroundImage","cursor","draggable","removeEventListener","getDurationString","durationInSec","durationString","durationInMin","durationInHour","requestFullScreen","requestMethod","call","cancelFullScreen","fullscreenChangeHandler","fullscreen_expand","fullscreen_collapse","showMediaControl","media_control","opacity","hideMediaControl","context","showVolumeSlider","hideVolumeSlider","defaultVolumeSliderHeight","addVideoThumbs","ni","newdiv","divIdName","ErrorCode","API_NOT_INITIALIZED","description","CANCEL","CHANNEL_ERROR","EXTENSION_MISSING","INVALID_PARAMETER","RECEIVER_UNAVAILABLE","SESSION_ERROR","TIMEOUT"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeCastPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n globalThis.CastPlayer.setupRemotePlayer();\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = () => {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n if (typeof localPlayer.stop === \"function\")\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n"]} \ No newline at end of file diff --git a/dist/esm2015/shared/ng-cast.service.js b/dist/esm2015/shared/ng-cast.service.js index 4b99794..4d7b209 100644 --- a/dist/esm2015/shared/ng-cast.service.js +++ b/dist/esm2015/shared/ng-cast.service.js @@ -67,15 +67,12 @@ let NgCastService = class NgCastService { if (mediaContents) { globalThis.CastPlayer.initializeUI(); globalThis.CastPlayer.setupLocalPlayer(); - this.window['__onGCastApiAvailable'] = (isAvailable) => { - if (isAvailable) { - globalThis.CastPlayer.initializeCastPlayer(); - } - }; + globalThis.CastPlayer.initializeCastPlayer(); } } setCasting(value) { this.status.casting = value; + globalThis.CastPlayer.setupRemotePlayer(); } getStatus() { return this.status; @@ -85,4 +82,4 @@ NgCastService = tslib_1.__decorate([ Injectable() ], NgCastService); export { NgCastService }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3RoaW5rZXIvZGV2L3RoaW5rYW0vbmdDYXN0LyIsInNvdXJjZXMiOlsic2hhcmVkL25nLWNhc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTy9CLElBQWEsYUFBYSxHQUExQixNQUFhLGFBQWE7SUFTeEI7UUFOUSxXQUFNLEdBQVEsTUFBTSxDQUFDO1FBRXRCLFdBQU0sR0FBRztZQUNkLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztRQWtCRixrQkFBYSxHQUFHO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQztRQUVGLFlBQU8sR0FBRyxVQUFVLEdBQVE7WUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUM7UUFFRixvQkFBZSxHQUFHLEdBQUcsRUFBRTtZQUNyQixJQUFJLElBQUksR0FBUSxJQUFJLENBQUM7WUFDckIsSUFBSSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QixDQUFDLEVBQUUsVUFBVSxHQUFRO2dCQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO29C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OUM7WUFDSCxDQUFDLENBQUM7U0FDSDtJQUNILENBQUM7SUFrQkQsVUFBVSxDQUFDLEtBQVU7UUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFBO0lBQ3BCLENBQUM7Q0FDRixDQUFBO0FBbEdZLGFBQWE7SUFEekIsVUFBVSxFQUFFO0dBQ0EsYUFBYSxDQWtHekI7U0FsR1ksYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIHZhciBDYXN0UGxheWVyOiBhbnk7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ0Nhc3RTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjYXN0OiBhbnk7XG4gIHByaXZhdGUgY3VycmVudE1lZGlhOiBhbnk7XG4gIHByaXZhdGUgd2luZG93OiBhbnkgPSB3aW5kb3c7XG5cbiAgcHVibGljIHN0YXR1cyA9IHtcbiAgICBjYXN0aW5nOiBmYWxzZVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5tZWRpYUpTT04gPSB7XG4gICAgICBjYXRlZ29yaWVzOiBbXVxuICAgIH07XG4gIH1cblxuICBpbml0aWFsaXplQ2FzdEFwaSgpIHtcbiAgICB0aGlzLmNhc3QgPSB0aGlzLndpbmRvd1snY2hyb21lJ10uY2FzdDtcbiAgICBsZXQgc2Vzc2lvblJlcXVlc3QgPSBuZXcgdGhpcy5jYXN0LlNlc3Npb25SZXF1ZXN0KCc0RjhCMzQ4MycpO1xuICAgIGxldCBhcGlDb25maWcgPSBuZXcgdGhpcy5jYXN0LkFwaUNvbmZpZyhzZXNzaW9uUmVxdWVzdCxcbiAgICAgICgpID0+IHsgfSxcbiAgICAgIChzdGF0dXM6IGFueSkgPT4geyBpZiAoc3RhdHVzID09PSB0aGlzLmNhc3QuUmVjZWl2ZXJBdmFpbGFiaWxpdHkuQVZBSUxBQkxFKSB7IH0gfVxuICAgICk7XG4gICAgbGV0IHggPSB0aGlzLmNhc3QuaW5pdGlhbGl6ZShhcGlDb25maWcsIHRoaXMub25Jbml0U3VjY2VzcywgdGhpcy5vbkVycm9yKTtcbiAgfTtcblxuICBvbkluaXRTdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnNvbGUubG9nKCdHQ2FzdCBpbml0aWFsaXphdGlvbiBzdWNjZXNzJyk7XG4gIH07XG5cbiAgb25FcnJvciA9IGZ1bmN0aW9uIChlcnI6IGFueSkge1xuICAgIGNvbnNvbGUubG9nKCdHQ2FzdCBpbml0aWFsaXphdGlvbiBmYWlsZWQnLCBlcnIpO1xuICB9O1xuXG4gIGRpc2NvdmVyRGV2aWNlcyA9ICgpID0+IHtcbiAgICBsZXQgc2VsZjogYW55ID0gdGhpcztcbiAgICBsZXQgc3ViaiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgdGhpcy5jYXN0LnJlcXVlc3RTZXNzaW9uKChzOiBhbnkpID0+IHtcbiAgICAgIHNlbGYuc2Vzc2lvbiA9IHM7XG4gICAgICBzZWxmLnNldENhc3RpbmcodHJ1ZSk7XG4gICAgICBzdWJqLm5leHQoJ0NPTk5FQ1RFRCcpO1xuICAgIH0sIGZ1bmN0aW9uIChlcnI6IGFueSkge1xuICAgICAgc2VsZi5zZXRDYXN0aW5nKGZhbHNlKTtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ2NhbmNlbCcpIHtcbiAgICAgICAgc2VsZi5zZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgICAgICBzdWJqLm5leHQoJ0NBTkNFTCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc2VsZWN0aW5nIGEgY2FzdCBkZXZpY2UnLCBlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzdWJqO1xuICB9O1xuXG4gIG9uTWVkaWFEaXNjb3ZlcmVkID0gKGNhdGVnb3JpZXM6IGFueVtdKSA9PiB7XG4gICAgbGV0IHNjcmlwdCA9IHdpbmRvd1snZG9jdW1lbnQnXS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ3RleHQvamF2YXNjcmlwdCcpO1xuICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3NyYycsICdodHRwczovL3d3dy5nc3RhdGljLmNvbS9jdi9qcy9zZW5kZXIvdjEvY2FzdF9zZW5kZXIuanM/bG9hZENhc3RGcmFtZXdvcms9MScpO1xuICAgIHdpbmRvd1snZG9jdW1lbnQnXS5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cbiAgICBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIubWVkaWFKU09OLmNhdGVnb3JpZXMgPSBjYXRlZ29yaWVzO1xuXG4gICAgcmV0dXJuIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5hZGRNZWRpYUNvbnRlbnRzKCk7XG4gIH07XG5cbiAgaW5pdGlhbGl6ZShtZWRpYUNvbnRlbnRzOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAobWVkaWFDb250ZW50cykge1xuICAgICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLmluaXRpYWxpemVVSSgpO1xuICAgICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLnNldHVwTG9jYWxQbGF5ZXIoKTtcbiAgICAgIHRoaXMud2luZG93WydfX29uR0Nhc3RBcGlBdmFpbGFibGUnXSA9IChpc0F2YWlsYWJsZTogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAoaXNBdmFpbGFibGUpIHtcbiAgICAgICAgICBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIuaW5pdGlhbGl6ZUNhc3RQbGF5ZXIoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwbGF5ID0gKCkgPT4ge1xuICAgIHRoaXMuY3VycmVudE1lZGlhLnBsYXkobnVsbCk7XG4gIH07XG5cbiAgcGF1c2UgPSAoKSA9PiB7XG4gICAgdGhpcy5jdXJyZW50TWVkaWEucGF1c2UobnVsbCk7XG4gIH07XG5cbiAgc3RvcCA9ICgpID0+IHtcbiAgICB0aGlzLmN1cnJlbnRNZWRpYS5zdG9wKG51bGwpO1xuICB9O1xuXG4gIG9uTWVkaWFFcnJvciA9IChlcnI6IGFueSkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxhdW5jaGluZyBtZWRpYScsIGVycik7XG4gIH07XG5cbiAgc2V0Q2FzdGluZyh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5zdGF0dXMuY2FzdGluZyA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0U3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXR1c1xuICB9XG59XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3RoaW5rZXIvZGV2L3RoaW5rYW0vbmdDYXN0LyIsInNvdXJjZXMiOlsic2hhcmVkL25nLWNhc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTy9CLElBQWEsYUFBYSxHQUExQixNQUFhLGFBQWE7SUFTeEI7UUFOUSxXQUFNLEdBQVEsTUFBTSxDQUFDO1FBRXRCLFdBQU0sR0FBRztZQUNkLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztRQWtCRixrQkFBYSxHQUFHO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQztRQUVGLFlBQU8sR0FBRyxVQUFVLEdBQVE7WUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUM7UUFFRixvQkFBZSxHQUFHLEdBQUcsRUFBRTtZQUNyQixJQUFJLElBQUksR0FBUSxJQUFJLENBQUM7WUFDckIsSUFBSSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QixDQUFDLEVBQUUsVUFBVSxHQUFRO2dCQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO29C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QUFVLENBQUMsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUE7SUFDcEIsQ0FBQztDQUNGLENBQUE7QUEvRlksYUFBYTtJQUR6QixVQUFVLEVBQUU7R0FDQSxhQUFhLENBK0Z6QjtTQS9GWSxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgdmFyIENhc3RQbGF5ZXI6IGFueTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5nQ2FzdFNlcnZpY2Uge1xuICBwcml2YXRlIGNhc3Q6IGFueTtcbiAgcHJpdmF0ZSBjdXJyZW50TWVkaWE6IGFueTtcbiAgcHJpdmF0ZSB3aW5kb3c6IGFueSA9IHdpbmRvdztcblxuICBwdWJsaWMgc3RhdHVzID0ge1xuICAgIGNhc3Rpbmc6IGZhbHNlXG4gIH07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLm1lZGlhSlNPTiA9IHtcbiAgICAgIGNhdGVnb3JpZXM6IFtdXG4gICAgfTtcbiAgfVxuXG4gIGluaXRpYWxpemVDYXN0QXBpKCkge1xuICAgIHRoaXMuY2FzdCA9IHRoaXMud2luZG93WydjaHJvbWUnXS5jYXN0O1xuICAgIGxldCBzZXNzaW9uUmVxdWVzdCA9IG5ldyB0aGlzLmNhc3QuU2Vzc2lvblJlcXVlc3QoJzRGOEIzNDgzJyk7XG4gICAgbGV0IGFwaUNvbmZpZyA9IG5ldyB0aGlzLmNhc3QuQXBpQ29uZmlnKHNlc3Npb25SZXF1ZXN0LFxuICAgICAgKCkgPT4geyB9LFxuICAgICAgKHN0YXR1czogYW55KSA9PiB7IGlmIChzdGF0dXMgPT09IHRoaXMuY2FzdC5SZWNlaXZlckF2YWlsYWJpbGl0eS5BVkFJTEFCTEUpIHsgfSB9XG4gICAgKTtcbiAgICBsZXQgeCA9IHRoaXMuY2FzdC5pbml0aWFsaXplKGFwaUNvbmZpZywgdGhpcy5vbkluaXRTdWNjZXNzLCB0aGlzLm9uRXJyb3IpO1xuICB9O1xuXG4gIG9uSW5pdFN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc29sZS5sb2coJ0dDYXN0IGluaXRpYWxpemF0aW9uIHN1Y2Nlc3MnKTtcbiAgfTtcblxuICBvbkVycm9yID0gZnVuY3Rpb24gKGVycjogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ0dDYXN0IGluaXRpYWxpemF0aW9uIGZhaWxlZCcsIGVycik7XG4gIH07XG5cbiAgZGlzY292ZXJEZXZpY2VzID0gKCkgPT4ge1xuICAgIGxldCBzZWxmOiBhbnkgPSB0aGlzO1xuICAgIGxldCBzdWJqID0gbmV3IFN1YmplY3QoKTtcbiAgICB0aGlzLmNhc3QucmVxdWVzdFNlc3Npb24oKHM6IGFueSkgPT4ge1xuICAgICAgc2VsZi5zZXNzaW9uID0gcztcbiAgICAgIHNlbGYuc2V0Q2FzdGluZyh0cnVlKTtcbiAgICAgIHN1YmoubmV4dCgnQ09OTkVDVEVEJyk7XG4gICAgfSwgZnVuY3Rpb24gKGVycjogYW55KSB7XG4gICAgICBzZWxmLnNldENhc3RpbmcoZmFsc2UpO1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnY2FuY2VsJykge1xuICAgICAgICBzZWxmLnNlc3Npb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHN1YmoubmV4dCgnQ0FOQ0VMJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzZWxlY3RpbmcgYSBjYXN0IGRldmljZScsIGVycik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN1Ymo7XG4gIH07XG5cbiAgb25NZWRpYURpc2NvdmVyZWQgPSAoY2F0ZWdvcmllczogYW55W10pID0+IHtcbiAgICBsZXQgc2NyaXB0ID0gd2luZG93Wydkb2N1bWVudCddLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9qYXZhc2NyaXB0Jyk7XG4gICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgnc3JjJywgJ2h0dHBzOi8vd3d3LmdzdGF0aWMuY29tL2N2L2pzL3NlbmRlci92MS9jYXN0X3NlbmRlci5qcz9sb2FkQ2FzdEZyYW1ld29yaz0xJyk7XG4gICAgd2luZG93Wydkb2N1bWVudCddLmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcblxuICAgIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5tZWRpYUpTT04uY2F0ZWdvcmllcyA9IGNhdGVnb3JpZXM7XG5cbiAgICByZXR1cm4gZ2xvYmFsVGhpcy5DYXN0UGxheWVyLmFkZE1lZGlhQ29udGVudHMoKTtcbiAgfTtcblxuICBpbml0aWFsaXplKG1lZGlhQ29udGVudHM6IGFueSk6IHZvaWQge1xuICAgIGlmIChtZWRpYUNvbnRlbnRzKSB7XG4gICAgICBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIuaW5pdGlhbGl6ZVVJKCk7XG4gICAgICBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIuc2V0dXBMb2NhbFBsYXllcigpO1xuICAgICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLmluaXRpYWxpemVDYXN0UGxheWVyKCk7XG4gICAgfVxuICB9XG5cbiAgcGxheSA9ICgpID0+IHtcbiAgICB0aGlzLmN1cnJlbnRNZWRpYS5wbGF5KG51bGwpO1xuICB9O1xuXG4gIHBhdXNlID0gKCkgPT4ge1xuICAgIHRoaXMuY3VycmVudE1lZGlhLnBhdXNlKG51bGwpO1xuICB9O1xuXG4gIHN0b3AgPSAoKSA9PiB7XG4gICAgdGhpcy5jdXJyZW50TWVkaWEuc3RvcChudWxsKTtcbiAgfTtcblxuICBvbk1lZGlhRXJyb3IgPSAoZXJyOiBhbnkpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsYXVuY2hpbmcgbWVkaWEnLCBlcnIpO1xuICB9O1xuXG4gIHNldENhc3RpbmcodmFsdWU6IGFueSkge1xuICAgIHRoaXMuc3RhdHVzLmNhc3RpbmcgPSB2YWx1ZTtcbiAgICBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIuc2V0dXBSZW1vdGVQbGF5ZXIoKTtcbiAgfVxuXG4gIGdldFN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXNcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/fesm2015/thinkam.net-ng-cast.js b/dist/fesm2015/thinkam.net-ng-cast.js index 0b269e7..b33f368 100644 --- a/dist/fesm2015/thinkam.net-ng-cast.js +++ b/dist/fesm2015/thinkam.net-ng-cast.js @@ -110,15 +110,12 @@ let NgCastService = class NgCastService { if (mediaContents) { globalThis.CastPlayer.initializeUI(); globalThis.CastPlayer.setupLocalPlayer(); - this.window['__onGCastApiAvailable'] = (isAvailable) => { - if (isAvailable) { - globalThis.CastPlayer.initializeCastPlayer(); - } - }; + globalThis.CastPlayer.initializeCastPlayer(); } } setCasting(value) { this.status.casting = value; + globalThis.CastPlayer.setupRemotePlayer(); } getStatus() { return this.status; @@ -475,7 +472,7 @@ CastPlayer.prototype.setupLocalPlayer = () => { // This object will implement PlayerHandler callbacks with localPlayer var playerTarget = {}; - playerTarget.play = function () { + playerTarget.play = () => { localPlayer.play(); var vi = document.getElementById('video_image'); @@ -488,7 +485,8 @@ CastPlayer.prototype.setupLocalPlayer = () => { }; playerTarget.stop = function () { - localPlayer.stop(); + if (typeof localPlayer.stop === "function") + localPlayer.stop(); }; playerTarget.load = function (mediaIndex) { diff --git a/dist/fesm2015/thinkam.net-ng-cast.js.map b/dist/fesm2015/thinkam.net-ng-cast.js.map index 89e135c..cc7eda4 100644 --- a/dist/fesm2015/thinkam.net-ng-cast.js.map +++ b/dist/fesm2015/thinkam.net-ng-cast.js.map @@ -1 +1 @@ -{"version":3,"file":"thinkam.net-ng-cast.js","sources":["../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n this.window['__onGCastApiAvailable'] = (isAvailable: boolean) => {\n if (isAvailable) {\n globalThis.CastPlayer.initializeCastPlayer();\n }\n };\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = function () {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["tslib_1.__decorate"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"thinkam.net-ng-cast.js","sources":["../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeCastPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n globalThis.CastPlayer.setupRemotePlayer();\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = () => {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n if (typeof localPlayer.stop === \"function\")\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["tslib_1.__decorate"],"mappings":"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"} \ No newline at end of file diff --git a/dist/package.json b/dist/package.json index 36b7bae..9d77e9a 100644 --- a/dist/package.json +++ b/dist/package.json @@ -1,7 +1,7 @@ { "$schema": "./node_modules/ng-packagr/package.schema.json", "name": "@thinkam.net/ng-cast", - "version": "0.3.0", + "version": "0.3.5", "description": "Broadcast media on your TV from your Angular app", "main": "bundles/thinkam.net-ng-cast.umd.js", "repository": { diff --git a/package.json b/package.json index e6466f4..f875b73 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "$schema": "./node_modules/ng-packagr/package.schema.json", "name": "@thinkam.net/ng-cast", - "version": "0.3.0", + "version": "0.3.5", "ngPackage": { "lib": { "entryFile": "index.ts" diff --git a/shared/ng-cast.service.ts b/shared/ng-cast.service.ts index 946b539..a394a2c 100644 --- a/shared/ng-cast.service.ts +++ b/shared/ng-cast.service.ts @@ -74,11 +74,7 @@ export class NgCastService { if (mediaContents) { globalThis.CastPlayer.initializeUI(); globalThis.CastPlayer.setupLocalPlayer(); - this.window['__onGCastApiAvailable'] = (isAvailable: boolean) => { - if (isAvailable) { - globalThis.CastPlayer.initializeCastPlayer(); - } - }; + globalThis.CastPlayer.initializeCastPlayer(); } } @@ -100,6 +96,7 @@ export class NgCastService { setCasting(value: any) { this.status.casting = value; + globalThis.CastPlayer.setupRemotePlayer(); } getStatus() { From dc586f7ebdd12d84caa903451886a1753f6aeb56 Mon Sep 17 00:00:00 2001 From: Felipe de Almeida Date: Mon, 12 Oct 2020 01:17:38 -0300 Subject: [PATCH 06/10] components position --- dist/bundles/thinkam.net-ng-cast.umd.js | 2 +- dist/bundles/thinkam.net-ng-cast.umd.min.js | 2 +- .../thinkam.net-ng-cast.umd.min.js.map | 2 +- dist/esm2015/ng-cast.component.js | 2 +- dist/fesm2015/thinkam.net-ng-cast.js | 2 +- dist/package.json | 2 +- dist/thinkam.net-ng-cast.metadata.json | 2 +- ng-cast.component.scss | 23 ++++++++----------- package.json | 2 +- 9 files changed, 17 insertions(+), 22 deletions(-) diff --git a/dist/bundles/thinkam.net-ng-cast.umd.js b/dist/bundles/thinkam.net-ng-cast.umd.js index 3cd5d66..a4b80f4 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.js +++ b/dist/bundles/thinkam.net-ng-cast.umd.js @@ -334,7 +334,7 @@ core.Component({ selector: 'ng-cast', template: "
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", - styles: ["body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:1100px}#video_image{height:536px;margin:20px auto 0 40px;width:960px}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin:0 0 0 40px;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;width:960px}#video_element{background-color:#000;margin:20px auto 0 40px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin:-4px 0 0 40px;opacity:.9;padding:10px;width:940px}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px;width:95%}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;left:8px;margin:-60px 0 0 40px;opacity:.7;padding:0;position:absolute;top:650px;transition:opacity 1s;width:960px;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] + styles: ["body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] }) ], exports.ɵa); diff --git a/dist/bundles/thinkam.net-ng-cast.umd.min.js b/dist/bundles/thinkam.net-ng-cast.umd.min.js index 547a886..7c262cd 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.min.js +++ b/dist/bundles/thinkam.net-ng-cast.umd.min.js @@ -12,5 +12,5 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */function a(e,t,i,n){var a,o=arguments.length,r=o<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,i,n);else for(var d=e.length-1;d>=0;d--)(a=e[d])&&(r=(o<3?a(r):o>3?a(t,i,r):a(t,i))||r);return o>3&&r&&Object.defineProperty(t,i,r),r}e.ɵa=function(){function e(e){this.ngCastService=e,this.videoImage="",this.imageOffline=!1,this.srcImageOffline=""}return e.prototype.ngOnInit=function(){this.window=window;var e=this.ngCastService;this.window.__onGCastApiAvailable=function(t){t&&e.initializeCastApi()},this.castingStatus=this.ngCastService.getStatus()},e.prototype.openSession=function(){this.ngCastService.discoverDevices()},e.prototype.closeSession=function(){this.ngCastService.discoverDevices()},e}(),a([t.Input()],e.ɵa.prototype,"videoImage",void 0),a([t.Input()],e.ɵa.prototype,"imageOffline",void 0),a([t.Input()],e.ɵa.prototype,"srcImageOffline",void 0),e.ɵa=a([t.Component({selector:"ng-cast",template:'
\n
\x3c!-- Put Your Image Width --\x3e\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\nTV Offline\n',styles:['body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:1100px}#video_image{height:536px;margin:20px auto 0 40px;width:960px}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin:0 0 0 40px;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;width:960px}#video_element{background-color:#000;margin:20px auto 0 40px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin:-4px 0 0 40px;opacity:.9;padding:10px;width:940px}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px;width:95%}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;left:8px;margin:-60px 0 0 40px;opacity:.7;padding:0;position:absolute;top:650px;transition:opacity 1s;width:960px;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}']})],e.ɵa),e.NgCastService=function(){function e(){var e=this;this.window=window,this.status={casting:!1},this.onInitSuccess=function(){console.log("GCast initialization success")},this.onError=function(e){console.log("GCast initialization failed",e)},this.discoverDevices=function(){var t=e,i=new n.Subject;return e.cast.requestSession((function(e){t.session=e,t.setCasting(!0),i.next("CONNECTED")}),(function(e){t.setCasting(!1),"cancel"===e.code?(t.session=void 0,i.next("CANCEL")):console.error("Error selecting a cast device",e)})),i},this.onMediaDiscovered=function(e){var t=window.document.createElement("script");return t.setAttribute("type","text/javascript"),t.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"),window.document.body.appendChild(t),globalThis.CastPlayer.mediaJSON.categories=e,globalThis.CastPlayer.addMediaContents()},this.play=function(){e.currentMedia.play(null)},this.pause=function(){e.currentMedia.pause(null)},this.stop=function(){e.currentMedia.stop(null)},this.onMediaError=function(e){console.error("Error launching media",e)},globalThis.CastPlayer.mediaJSON={categories:[]}}return e.prototype.initializeCastApi=function(){var e=this;this.cast=this.window.chrome.cast;var t=new this.cast.SessionRequest("4F8B3483"),i=new this.cast.ApiConfig(t,(function(){}),(function(t){e.cast.ReceiverAvailability.AVAILABLE}));this.cast.initialize(i,this.onInitSuccess,this.onError)},e.prototype.initialize=function(e){e&&(globalThis.CastPlayer.initializeUI(),globalThis.CastPlayer.setupLocalPlayer(),globalThis.CastPlayer.initializeCastPlayer())},e.prototype.setCasting=function(e){this.status.casting=e,globalThis.CastPlayer.setupRemotePlayer()},e.prototype.getStatus=function(){return this.status},e}(),e.NgCastService=a([t.Injectable()],e.NgCastService),e.NgCastModule=function(){},e.NgCastModule=a([t.NgModule({schemas:[t.CUSTOM_ELEMENTS_SCHEMA],imports:[i.CommonModule],exports:[e.ɵa],providers:[e.NgCastService],declarations:[e.ɵa]})],e.NgCastModule);var o=600,r=100,d="IDLE",l="BUFFERING",s="LOADED",u="PLAYING",c="PAUSED",p="ERROR",m=function(){this.playerHandler=new g(this),this.playerState=d,this.playerStateBeforeSwitch=null,this.remotePlayer=null,this.remotePlayerController=null,this.currentMediaTime=0,this.mediaDuration=-1,this.timer=null,this.incrementMediaTimeHandler=this.incrementMediaTime.bind(this),this.seekMediaListener=this.seekMedia.bind(this),this.currentMediaIndex=0,this.mediaContents=null,this.fullscreen=!1,this.mediaInfo=null,this.whenSkippable=null,this.liveSeekableRange=null,this.isLiveContent=!1,this.mediaJSON={categories:[]}};m.prototype.initializeCastPlayer=function(){var e={receiverApplicationId:"4F8B3483"};e.autoJoinPolicy=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,cast.framework.CastContext.getInstance().setOptions(e),y.remotePlayer=new cast.framework.RemotePlayer,y.remotePlayerController=new cast.framework.RemotePlayerController(y.remotePlayer),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,y.switchPlayer.bind(y))},m.prototype.switchPlayer=function(){y.stopProgressTimer(),y.resetVolumeSlider(),y.playerHandler.stop(),y.playerState=d,cast&&cast.framework&&y.remotePlayer.isConnected?y.setupRemotePlayer():y.setupLocalPlayer()};var g=function(e){this.target={},this.setTarget=function(e){this.target=e},this.play=function(){e.playerState===u||e.playerState===c||e.playerState===s?(this.target.play(),e.playerState=u,document.getElementById("play").style.display="none",document.getElementById("pause").style.display="block",this.updateDisplayMessage()):this.load(e.currentMediaIndex)},this.updateDisplayMessage=function(){this.target.updateDisplayMessage()},this.pause=function(){this.target.pause(),e.playerState=c,document.getElementById("play").style.display="block",document.getElementById("pause").style.display="none"},this.stop=function(){e.playerState=d,this.target.stop()},this.load=function(t){void 0===t&&(t=null),t||(t=e.currentMediaIndex),e.playerState=l,this.target.load(t)},this.isMediaLoaded=function(e){return this.target.isMediaLoaded(e)},this.prepareToPlay=function(){e.mediaDuration=this.getMediaDuration(),e.playerHandler.updateDurationDisplay(),e.playerState=s,this.play(),e.startProgressTimer(),this.updateDisplay()},this.loaded=function(){e.currentMediaDuration=this.getMediaDuration(),e.updateMediaDuration(),e.playerState=s,e.currentMediaTime>0&&this.seekTo(e.currentMediaTime),this.play(),e.startProgressTimer(),this.updateDisplayMessage()},this.getCurrentMediaTime=function(){return this.target.getCurrentMediaTime()},this.getMediaDuration=function(){return this.target.getMediaDuration()},this.updateDisplay=function(){this.currentMediaTime=this.target.getCurrentMediaTime(),this.mediaDuration=this.target.getMediaDuration(),this.target.updateDisplay()},this.updateCurrentTimeDisplay=function(){this.target.updateCurrentTimeDisplay()},this.setTimeString=function(e,t){this.target.setTimeString(e,t)},this.setVolume=function(e){this.target.setVolume(e)},this.mute=function(){this.target.mute(),document.getElementById("audio_on").style.display="none",document.getElementById("audio_off").style.display="block"},this.unMute=function(){this.target.unMute(),document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},this.isMuted=function(){return this.target.isMuted()},this.seekTo=function(e){this.target.seekTo(e)}};m.prototype.setupLocalPlayer=function(){var e=document.getElementById("video_element");e.addEventListener("loadeddata",y.onMediaLoadedLocally.bind(y));var t={play:function(){e.play(),document.getElementById("video_image").style.display="none",e.style.display="block"},pause:function(){e.pause()},stop:function(){"function"==typeof e.stop&&e.stop()}};t.load=function(t){e.src=y.mediaContents[t].sources[0],e.load()}.bind(y),t.getCurrentMediaTime=function(){return e.currentTime},t.getMediaDuration=function(){return e.duration},t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none"},t.setVolume=function(t){e.volume=t0&&y.playerHandler.play()},m.prototype.setupRemotePlayer=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,function(){y.remotePlayer.isPaused?y.playerHandler.pause():y.playerHandler.play()}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,function(){y.remotePlayer.isMuted?y.playerHandler.mute():y.playerHandler.unMute()}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,function(){var e=y.remotePlayer.volumeLevel*r,t=document.getElementById("audio_bg_level");t.style.height=e+"px",t.style.marginTop=-e+"px"}.bind(y));var t={};t.play=function(){y.remotePlayer.isPaused&&y.remotePlayerController.playOrPause(),document.getElementById("video_image").style.display="block",document.getElementById("video_element").style.display="none"}.bind(y),t.pause=function(){y.remotePlayer.isPaused||y.remotePlayerController.playOrPause()}.bind(y),t.stop=function(){y.remotePlayerController.stop()}.bind(y),t.load=function(t){console.log("Loading..."+y.mediaContents[t].title);var i=new chrome.cast.media.MediaInfo(y.mediaContents[t].sources[0],"video/mp4");i.metadata=new chrome.cast.media.GenericMediaMetadata,i.metadata.metadataType=chrome.cast.media.MetadataType.GENERIC,i.metadata.title=y.mediaContents[t].title,i.metadata.images=[{url:""+y.mediaContents[t].thumb}];var n=new chrome.cast.media.LoadRequest(i);e.loadMedia(n).then(y.playerHandler.loaded.bind(y.playerHandler),function(e){y.playerState=p,console.log("Remote media load error: "+m.getErrorMessage(e))}.bind(y))}.bind(y),t.getCurrentMediaTime=function(){return y.remotePlayer.currentTime}.bind(y),t.getMediaDuration=function(){return y.remotePlayer.duration}.bind(y),t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="block",document.getElementById("playerstatebg").style.display="block",document.getElementById("video_image_overlay").style.display="block",document.getElementById("playerstate").innerHTML=y.mediaContents[y.currentMediaIndex].title+" "+y.playerState+" on "+e.getCastDevice().friendlyName}.bind(y),t.setVolume=function(e){var t=y.remotePlayer.volumeLevel,i=document.getElementById("audio_bg_level");if(en&&(e=n+(pos-n)/2),i.style.height=e+"px",i.style.marginTop=-e+"px",t=e/r}else t=1;y.remotePlayer.volumeLevel=t,y.remotePlayerController.setVolumeLevel()}.bind(y),t.mute=function(){y.remotePlayer.isMuted||y.remotePlayerController.muteOrUnmute()}.bind(y),t.unMute=function(){y.remotePlayer.isMuted&&y.remotePlayerController.muteOrUnmute()}.bind(y),t.isMuted=function(){return y.remotePlayer.isMuted}.bind(y),t.seekTo=function(e){y.remotePlayer.currentTime=e,y.remotePlayerController.seek()}.bind(y),y.playerHandler.setTarget(t),y.remotePlayer.isMuted&&y.playerHandler.mute();var i=y.remotePlayer.volumeLevel*r,n=document.getElementById("audio_bg_level");n.style.height=i+"px",n.style.marginTop=-i+"px",y.hideFullscreenButton(),y.playerHandler.play()},m.prototype.onMediaLoadedLocally=function(){document.getElementById("video_element").currentTime=y.currentMediaTime,y.playerHandler.loaded()},m.prototype.selectMedia=function(e){console.log("Media index selected: "+e),y.currentMediaIndex=e,y.playerHandler.currentMediaInfo=void 0,document.getElementById("video_image").src=""+y.mediaContents[e].thumb,document.getElementById("progress_indicator").style.marginLeft="0px",document.getElementById("progress").style.width="0px";var t=document.getElementById("seekable_window"),i=document.getElementById("unseekable_overlay");t.style.width=o,i.style.width="0px",y.stopProgressTimer(),y.currentMediaTime=0,y.playerHandler.setTimeString(document.getElementById("currentTime"),0),y.playerHandler.setTimeString(document.getElementById("duration"),0),y.playerState=d,y.playerHandler.play()},m.prototype.seekMedia=function(e){if(null==y.mediaDuration||cast.framework.CastContext.getInstance().getCurrentSession()&&!y.remotePlayer.canSeek)console.log("Error - Not seekable");else if(!y.isLiveContent||y.liveSeekableRange){var t=parseInt(e.offsetX,10),i=document.getElementById("progress_indicator"),n=document.getElementById("progress"),a=0,r=0,d=0;"progress_indicator"==e.currentTarget.id?(a=parseInt(y.currentMediaTime+y.mediaDuration*t/o,10),r=parseInt(i.style.marginLeft,10)+t,d=parseInt(n.style.width,10)+t):(a=parseInt(t*y.mediaDuration/o,10),r=t,d=t),y.playerState!==u&&y.playerState!==c||(y.currentMediaTime=a,n.style.width=d+"px",i.style.marginLeft=r+"px"),y.isLiveContent&&(a+=y.mediaInfo.metadata.sectionStartTimeInMedia),y.playerHandler.seekTo(a)}else console.log("Live content has no seekable range.")},m.prototype.setVolume=function(e){var t=document.getElementById("audio_bg_level"),i=0;i="audio_bg_track"===e.currentTarget.id?r-parseInt(e.offsetY,10):parseInt(t.clientHeight,10)-parseInt(e.offsetY,10),y.playerHandler.setVolume(i)},m.prototype.startProgressTimer=function(){y.stopProgressTimer(),y.timer=setInterval(y.incrementMediaTimeHandler,1e3)},m.prototype.stopProgressTimer=function(){y.timer&&(clearInterval(y.timer),y.timer=null)},m.prototype.incrementMediaTime=function(){y.currentMediaTime=y.playerHandler.getCurrentMediaTime(),y.currentMediaDuration=y.playerHandler.getMediaDuration(),y.playerState===u&&(y.currentMediaTime0)var t=Math.floor(o*y.currentMediaTime/y.currentMediaDuration);e.style.width=t+"px",document.getElementById("progress_indicator").style.marginLeft=-621+t+"px",t>=o&&y.endPlayback()},m.prototype.endPlayback=function(){y.currentMediaTime=0,y.stopProgressTimer(),y.playerState=d,y.playerHandler.updateDisplay();var e=document.getElementById("play");e&&e.style&&e.display&&(e.style.display="block");var t=document.getElementById("pause");t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.getMediaTimeString=function(e){if(null==e||null==e)return null;var t=!1;e<0&&(t=!0,e*=-1);var i=Math.floor(e/3600),n=Math.floor((e-3600*i)/60),a=Math.floor(e-3600*i-60*n);return i<10&&(i="0"+i),n<10&&(n="0"+n),a<10&&(a="0"+a),(t?"-":"")+i+":"+n+":"+a},m.prototype.getClockTimeString=function(e){if(!e)return"0:00:00";var t=new Date(1e3*e),i=t.getHours(),n=t.getMinutes(),a=t.getSeconds(),o=i>=12?"PM":"AM";return(i=(i%=12)||12)+":"+(n=("0"+n).slice(-2))+":"+(a=("0"+a).slice(-2))+" "+o},m.prototype.updateAdMarkers=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e){var t=e.getMediaSession();if(t){var i=t.media;if(i){var n=i.breaks,a=i.duration;if(n)for(var o=0;oa&&r.isEmbedded))if(!document.getElementById("ad"+r.position))document.getElementById("progress").innerHTML+='
'}}}}},m.prototype.removeAdMarkers=function(){document.querySelectorAll(".adMarker").forEach((function(e){e.remove()}))},m.prototype.adPositionToMargin=function(e,t){return-1==e||e>t?o:o*e/t},m.prototype.onBreakClipIdChanged=function(){var e=document.getElementById("skip");e&&e.style&&e.style.display&&(e.style.display="none")},m.prototype.isPlayingBreak=function(e){y.enableProgressBar(!e)},m.prototype.onWhenSkippableChanged=function(e){y.whenSkippable=e},m.prototype.onCurrentBreakClipTimeChanged=function(e){var t=document.getElementById("skip");null==y.whenSkippable||y.whenSkippable<0?t&&t.style&&t.style.display&&(t.style.display="none"):void 0!==y.whenSkippable||e>=y.whenSkippable?t&&t.style&&t.style.display&&(t.style.display="block"):t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.skipAd=function(){y.remotePlayerController.skipAd()},m.prototype.enableProgressBar=function(e){var t=document.getElementById("progress"),i=document.getElementById("progress_indicator"),n=document.getElementById("seekable_window");e?(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_progress.png')",t.style.cursor="pointer",n.style.cursor="pointer",i.style.cursor="pointer",i.draggable=!0,t.addEventListener("click",y.seekMediaListener),n.addEventListener("click",y.seekMediaListener),i.addEventListener("dragend",y.seekMediaListener)):(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_buffer.png')",t.style.cursor="default",n.style.cursor="default",i.style.cursor="default",i.draggable=!1,t.removeEventListener("click",y.seekMediaListener),n.removeEventListener("click",y.seekMediaListener),i.removeEventListener("dragend",y.seekMediaListener))},m.prototype.updateMediaDuration=function(){document.getElementById("duration").innerHTML=m.getDurationString(y.currentMediaDuration)},m.getDurationString=function(e){var t=""+Math.floor(e%60),i=Math.floor(e/60);if(0===i)return t;t=i%60+":"+t;var n=Math.floor(i/60);return 0===n?t:n+":"+t},m.prototype.requestFullScreen=function(){var e=document.getElementById("video_element"),t=e.requestFullScreen||e.webkitRequestFullScreen;t&&(t.call(e),console.log("Requested fullscreen"))},m.prototype.cancelFullScreen=function(){var e=document.cancelFullScreen||document.webkitCancelFullScreen;e&&e.call(document)},m.prototype.fullscreenChangeHandler=function(){y.fullscreen=!y.fullscreen},m.prototype.showFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");y.fullscreen?(e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="block")):(e&&e.style&&e.style.display&&(e.style.display="block"),t&&t.style&&t.style.display&&(t.style.display="none"))},m.prototype.hideFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.showMediaControl=function(){var e=document.getElementById("media_control");e&&e.style&&e.style.opacity&&(e.style.opacity=.7)},m.prototype.hideMediaControl=function(){if("undefined"!=typeof cast){var e=cast.framework.CastContext.getInstance();e&&e.getCurrentSession()?document.getElementById("media_control").style.opacity=.7:document.getElementById("media_control").style.opacity=0}},m.prototype.showVolumeSlider=function(){y.playerHandler.isMuted()||(document.getElementById("audio_bg").style.opacity=1,document.getElementById("audio_bg_track").style.opacity=1,document.getElementById("audio_bg_level").style.opacity=1,document.getElementById("audio_indicator").style.opacity=1)},m.prototype.hideVolumeSlider=function(){document.getElementById("audio_bg").style.opacity=0,document.getElementById("audio_bg_track").style.opacity=0,document.getElementById("audio_bg_level").style.opacity=0,document.getElementById("audio_indicator").style.opacity=0},m.prototype.resetVolumeSlider=function(){var e=.5*document.getElementById("audio_bg_track").clientHeight;document.getElementById("audio_bg_level").style.height=e+"px",document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},m.prototype.initializeUI=function(){document.getElementById("media_title").innerHTML=y.mediaContents[0].title,document.getElementById("media_subtitle").innerHTML=y.mediaContents[y.currentMediaIndex].subtitle,document.getElementById("media_desc").innerHTML=y.mediaContents[y.currentMediaIndex].description,document.getElementById("progress_bg").addEventListener("click",y.seekMedia.bind(y)),document.getElementById("progress").addEventListener("click",y.seekMedia.bind(y)),document.getElementById("progress_indicator").addEventListener("dragend",y.seekMedia.bind(y)),document.getElementById("audio_on").addEventListener("click",y.playerHandler.mute.bind(y.playerHandler)),document.getElementById("audio_off").addEventListener("click",y.playerHandler.unMute.bind(y.playerHandler)),document.getElementById("audio_bg").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_on").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_level").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_track").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_level").addEventListener("click",y.setVolume.bind(y)),document.getElementById("audio_bg_track").addEventListener("click",y.setVolume.bind(y)),document.getElementById("audio_bg").addEventListener("mouseout",y.hideVolumeSlider.bind(y)),document.getElementById("audio_on").addEventListener("mouseout",y.hideVolumeSlider.bind(y)),document.getElementById("main_video").addEventListener("mouseover",y.showMediaControl.bind(y)),document.getElementById("main_video").addEventListener("mouseout",y.hideMediaControl.bind(y)),document.getElementById("media_control").addEventListener("mouseover",y.showMediaControl.bind(y)),document.getElementById("media_control").addEventListener("mouseout",y.hideMediaControl.bind(y)),document.getElementById("fullscreen_expand").addEventListener("click",y.requestFullScreen.bind(y)),document.getElementById("fullscreen_collapse").addEventListener("click",y.cancelFullScreen.bind(y)),document.addEventListener("fullscreenchange",y.fullscreenChangeHandler.bind(y),!1),document.addEventListener("webkitfullscreenchange",y.fullscreenChangeHandler.bind(y),!1),document.getElementById("play").addEventListener("click",y.playerHandler.play.bind(y.playerHandler)),document.getElementById("pause").addEventListener("click",y.playerHandler.pause.bind(y.playerHandler)),document.getElementById("progress_indicator").draggable=!0},m.prototype.addVideoThumbs=function(){if(void 0!==y.mediaJSON&&y.mediaJSON.categories&&y.mediaJSON.categories.length>0){y.mediaContents=y.mediaJSON.categories[0].videos;for(var e=document.getElementById("carousel"),t=null,i=null,n=0;n',t.addEventListener("click",y.selectMedia.bind(y,n)),e.appendChild(t)}},m.prototype.addMediaContents=function(){return void 0!==y.mediaJSON&&y.mediaJSON.categories&&y.mediaJSON.categories.length>0?(y.mediaContents=y.mediaJSON.categories[0].videos,y.mediaContents):null},m.getErrorMessage=function(e){switch(e.code){case chrome.cast.ErrorCode.API_NOT_INITIALIZED:return"The API is not initialized."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CANCEL:return"The operation was canceled by the user"+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CHANNEL_ERROR:return"A channel to the receiver is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.EXTENSION_MISSING:return"The Cast extension is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.INVALID_PARAMETER:return"The parameters to the operation were not valid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:return"No receiver was compatible with the session request."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.SESSION_ERROR:return"A session could not be created, or a session was invalid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.TIMEOUT:return"The operation timed out."+(e.description?" :"+e.description:"");default:return e}};var y=new m;window.__onGCastApiAvailable=function(e){e&&y.initializeCastPlayer()},window.CastPlayer=y,Object.defineProperty(e,"__esModule",{value:!0})})); + ***************************************************************************** */function a(e,t,i,n){var a,o=arguments.length,r=o<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,i,n);else for(var d=e.length-1;d>=0;d--)(a=e[d])&&(r=(o<3?a(r):o>3?a(t,i,r):a(t,i))||r);return o>3&&r&&Object.defineProperty(t,i,r),r}e.ɵa=function(){function e(e){this.ngCastService=e,this.videoImage="",this.imageOffline=!1,this.srcImageOffline=""}return e.prototype.ngOnInit=function(){this.window=window;var e=this.ngCastService;this.window.__onGCastApiAvailable=function(t){t&&e.initializeCastApi()},this.castingStatus=this.ngCastService.getStatus()},e.prototype.openSession=function(){this.ngCastService.discoverDevices()},e.prototype.closeSession=function(){this.ngCastService.discoverDevices()},e}(),a([t.Input()],e.ɵa.prototype,"videoImage",void 0),a([t.Input()],e.ɵa.prototype,"imageOffline",void 0),a([t.Input()],e.ɵa.prototype,"srcImageOffline",void 0),e.ɵa=a([t.Component({selector:"ng-cast",template:'
\n
\x3c!-- Put Your Image Width --\x3e\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\nTV Offline\n',styles:['body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}']})],e.ɵa),e.NgCastService=function(){function e(){var e=this;this.window=window,this.status={casting:!1},this.onInitSuccess=function(){console.log("GCast initialization success")},this.onError=function(e){console.log("GCast initialization failed",e)},this.discoverDevices=function(){var t=e,i=new n.Subject;return e.cast.requestSession((function(e){t.session=e,t.setCasting(!0),i.next("CONNECTED")}),(function(e){t.setCasting(!1),"cancel"===e.code?(t.session=void 0,i.next("CANCEL")):console.error("Error selecting a cast device",e)})),i},this.onMediaDiscovered=function(e){var t=window.document.createElement("script");return t.setAttribute("type","text/javascript"),t.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"),window.document.body.appendChild(t),globalThis.CastPlayer.mediaJSON.categories=e,globalThis.CastPlayer.addMediaContents()},this.play=function(){e.currentMedia.play(null)},this.pause=function(){e.currentMedia.pause(null)},this.stop=function(){e.currentMedia.stop(null)},this.onMediaError=function(e){console.error("Error launching media",e)},globalThis.CastPlayer.mediaJSON={categories:[]}}return e.prototype.initializeCastApi=function(){var e=this;this.cast=this.window.chrome.cast;var t=new this.cast.SessionRequest("4F8B3483"),i=new this.cast.ApiConfig(t,(function(){}),(function(t){e.cast.ReceiverAvailability.AVAILABLE}));this.cast.initialize(i,this.onInitSuccess,this.onError)},e.prototype.initialize=function(e){e&&(globalThis.CastPlayer.initializeUI(),globalThis.CastPlayer.setupLocalPlayer(),globalThis.CastPlayer.initializeCastPlayer())},e.prototype.setCasting=function(e){this.status.casting=e,globalThis.CastPlayer.setupRemotePlayer()},e.prototype.getStatus=function(){return this.status},e}(),e.NgCastService=a([t.Injectable()],e.NgCastService),e.NgCastModule=function(){},e.NgCastModule=a([t.NgModule({schemas:[t.CUSTOM_ELEMENTS_SCHEMA],imports:[i.CommonModule],exports:[e.ɵa],providers:[e.NgCastService],declarations:[e.ɵa]})],e.NgCastModule);var o=600,r=100,d="IDLE",l="BUFFERING",s="LOADED",u="PLAYING",c="PAUSED",p="ERROR",m=function(){this.playerHandler=new g(this),this.playerState=d,this.playerStateBeforeSwitch=null,this.remotePlayer=null,this.remotePlayerController=null,this.currentMediaTime=0,this.mediaDuration=-1,this.timer=null,this.incrementMediaTimeHandler=this.incrementMediaTime.bind(this),this.seekMediaListener=this.seekMedia.bind(this),this.currentMediaIndex=0,this.mediaContents=null,this.fullscreen=!1,this.mediaInfo=null,this.whenSkippable=null,this.liveSeekableRange=null,this.isLiveContent=!1,this.mediaJSON={categories:[]}};m.prototype.initializeCastPlayer=function(){var e={receiverApplicationId:"4F8B3483"};e.autoJoinPolicy=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,cast.framework.CastContext.getInstance().setOptions(e),y.remotePlayer=new cast.framework.RemotePlayer,y.remotePlayerController=new cast.framework.RemotePlayerController(y.remotePlayer),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,y.switchPlayer.bind(y))},m.prototype.switchPlayer=function(){y.stopProgressTimer(),y.resetVolumeSlider(),y.playerHandler.stop(),y.playerState=d,cast&&cast.framework&&y.remotePlayer.isConnected?y.setupRemotePlayer():y.setupLocalPlayer()};var g=function(e){this.target={},this.setTarget=function(e){this.target=e},this.play=function(){e.playerState===u||e.playerState===c||e.playerState===s?(this.target.play(),e.playerState=u,document.getElementById("play").style.display="none",document.getElementById("pause").style.display="block",this.updateDisplayMessage()):this.load(e.currentMediaIndex)},this.updateDisplayMessage=function(){this.target.updateDisplayMessage()},this.pause=function(){this.target.pause(),e.playerState=c,document.getElementById("play").style.display="block",document.getElementById("pause").style.display="none"},this.stop=function(){e.playerState=d,this.target.stop()},this.load=function(t){void 0===t&&(t=null),t||(t=e.currentMediaIndex),e.playerState=l,this.target.load(t)},this.isMediaLoaded=function(e){return this.target.isMediaLoaded(e)},this.prepareToPlay=function(){e.mediaDuration=this.getMediaDuration(),e.playerHandler.updateDurationDisplay(),e.playerState=s,this.play(),e.startProgressTimer(),this.updateDisplay()},this.loaded=function(){e.currentMediaDuration=this.getMediaDuration(),e.updateMediaDuration(),e.playerState=s,e.currentMediaTime>0&&this.seekTo(e.currentMediaTime),this.play(),e.startProgressTimer(),this.updateDisplayMessage()},this.getCurrentMediaTime=function(){return this.target.getCurrentMediaTime()},this.getMediaDuration=function(){return this.target.getMediaDuration()},this.updateDisplay=function(){this.currentMediaTime=this.target.getCurrentMediaTime(),this.mediaDuration=this.target.getMediaDuration(),this.target.updateDisplay()},this.updateCurrentTimeDisplay=function(){this.target.updateCurrentTimeDisplay()},this.setTimeString=function(e,t){this.target.setTimeString(e,t)},this.setVolume=function(e){this.target.setVolume(e)},this.mute=function(){this.target.mute(),document.getElementById("audio_on").style.display="none",document.getElementById("audio_off").style.display="block"},this.unMute=function(){this.target.unMute(),document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},this.isMuted=function(){return this.target.isMuted()},this.seekTo=function(e){this.target.seekTo(e)}};m.prototype.setupLocalPlayer=function(){var e=document.getElementById("video_element");e.addEventListener("loadeddata",y.onMediaLoadedLocally.bind(y));var t={play:function(){e.play(),document.getElementById("video_image").style.display="none",e.style.display="block"},pause:function(){e.pause()},stop:function(){"function"==typeof e.stop&&e.stop()}};t.load=function(t){e.src=y.mediaContents[t].sources[0],e.load()}.bind(y),t.getCurrentMediaTime=function(){return e.currentTime},t.getMediaDuration=function(){return e.duration},t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none"},t.setVolume=function(t){e.volume=t0&&y.playerHandler.play()},m.prototype.setupRemotePlayer=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,function(){y.remotePlayer.isPaused?y.playerHandler.pause():y.playerHandler.play()}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,function(){y.remotePlayer.isMuted?y.playerHandler.mute():y.playerHandler.unMute()}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,function(){var e=y.remotePlayer.volumeLevel*r,t=document.getElementById("audio_bg_level");t.style.height=e+"px",t.style.marginTop=-e+"px"}.bind(y));var t={};t.play=function(){y.remotePlayer.isPaused&&y.remotePlayerController.playOrPause(),document.getElementById("video_image").style.display="block",document.getElementById("video_element").style.display="none"}.bind(y),t.pause=function(){y.remotePlayer.isPaused||y.remotePlayerController.playOrPause()}.bind(y),t.stop=function(){y.remotePlayerController.stop()}.bind(y),t.load=function(t){console.log("Loading..."+y.mediaContents[t].title);var i=new chrome.cast.media.MediaInfo(y.mediaContents[t].sources[0],"video/mp4");i.metadata=new chrome.cast.media.GenericMediaMetadata,i.metadata.metadataType=chrome.cast.media.MetadataType.GENERIC,i.metadata.title=y.mediaContents[t].title,i.metadata.images=[{url:""+y.mediaContents[t].thumb}];var n=new chrome.cast.media.LoadRequest(i);e.loadMedia(n).then(y.playerHandler.loaded.bind(y.playerHandler),function(e){y.playerState=p,console.log("Remote media load error: "+m.getErrorMessage(e))}.bind(y))}.bind(y),t.getCurrentMediaTime=function(){return y.remotePlayer.currentTime}.bind(y),t.getMediaDuration=function(){return y.remotePlayer.duration}.bind(y),t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="block",document.getElementById("playerstatebg").style.display="block",document.getElementById("video_image_overlay").style.display="block",document.getElementById("playerstate").innerHTML=y.mediaContents[y.currentMediaIndex].title+" "+y.playerState+" on "+e.getCastDevice().friendlyName}.bind(y),t.setVolume=function(e){var t=y.remotePlayer.volumeLevel,i=document.getElementById("audio_bg_level");if(en&&(e=n+(pos-n)/2),i.style.height=e+"px",i.style.marginTop=-e+"px",t=e/r}else t=1;y.remotePlayer.volumeLevel=t,y.remotePlayerController.setVolumeLevel()}.bind(y),t.mute=function(){y.remotePlayer.isMuted||y.remotePlayerController.muteOrUnmute()}.bind(y),t.unMute=function(){y.remotePlayer.isMuted&&y.remotePlayerController.muteOrUnmute()}.bind(y),t.isMuted=function(){return y.remotePlayer.isMuted}.bind(y),t.seekTo=function(e){y.remotePlayer.currentTime=e,y.remotePlayerController.seek()}.bind(y),y.playerHandler.setTarget(t),y.remotePlayer.isMuted&&y.playerHandler.mute();var i=y.remotePlayer.volumeLevel*r,n=document.getElementById("audio_bg_level");n.style.height=i+"px",n.style.marginTop=-i+"px",y.hideFullscreenButton(),y.playerHandler.play()},m.prototype.onMediaLoadedLocally=function(){document.getElementById("video_element").currentTime=y.currentMediaTime,y.playerHandler.loaded()},m.prototype.selectMedia=function(e){console.log("Media index selected: "+e),y.currentMediaIndex=e,y.playerHandler.currentMediaInfo=void 0,document.getElementById("video_image").src=""+y.mediaContents[e].thumb,document.getElementById("progress_indicator").style.marginLeft="0px",document.getElementById("progress").style.width="0px";var t=document.getElementById("seekable_window"),i=document.getElementById("unseekable_overlay");t.style.width=o,i.style.width="0px",y.stopProgressTimer(),y.currentMediaTime=0,y.playerHandler.setTimeString(document.getElementById("currentTime"),0),y.playerHandler.setTimeString(document.getElementById("duration"),0),y.playerState=d,y.playerHandler.play()},m.prototype.seekMedia=function(e){if(null==y.mediaDuration||cast.framework.CastContext.getInstance().getCurrentSession()&&!y.remotePlayer.canSeek)console.log("Error - Not seekable");else if(!y.isLiveContent||y.liveSeekableRange){var t=parseInt(e.offsetX,10),i=document.getElementById("progress_indicator"),n=document.getElementById("progress"),a=0,r=0,d=0;"progress_indicator"==e.currentTarget.id?(a=parseInt(y.currentMediaTime+y.mediaDuration*t/o,10),r=parseInt(i.style.marginLeft,10)+t,d=parseInt(n.style.width,10)+t):(a=parseInt(t*y.mediaDuration/o,10),r=t,d=t),y.playerState!==u&&y.playerState!==c||(y.currentMediaTime=a,n.style.width=d+"px",i.style.marginLeft=r+"px"),y.isLiveContent&&(a+=y.mediaInfo.metadata.sectionStartTimeInMedia),y.playerHandler.seekTo(a)}else console.log("Live content has no seekable range.")},m.prototype.setVolume=function(e){var t=document.getElementById("audio_bg_level"),i=0;i="audio_bg_track"===e.currentTarget.id?r-parseInt(e.offsetY,10):parseInt(t.clientHeight,10)-parseInt(e.offsetY,10),y.playerHandler.setVolume(i)},m.prototype.startProgressTimer=function(){y.stopProgressTimer(),y.timer=setInterval(y.incrementMediaTimeHandler,1e3)},m.prototype.stopProgressTimer=function(){y.timer&&(clearInterval(y.timer),y.timer=null)},m.prototype.incrementMediaTime=function(){y.currentMediaTime=y.playerHandler.getCurrentMediaTime(),y.currentMediaDuration=y.playerHandler.getMediaDuration(),y.playerState===u&&(y.currentMediaTime0)var t=Math.floor(o*y.currentMediaTime/y.currentMediaDuration);e.style.width=t+"px",document.getElementById("progress_indicator").style.marginLeft=-621+t+"px",t>=o&&y.endPlayback()},m.prototype.endPlayback=function(){y.currentMediaTime=0,y.stopProgressTimer(),y.playerState=d,y.playerHandler.updateDisplay();var e=document.getElementById("play");e&&e.style&&e.display&&(e.style.display="block");var t=document.getElementById("pause");t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.getMediaTimeString=function(e){if(null==e||null==e)return null;var t=!1;e<0&&(t=!0,e*=-1);var i=Math.floor(e/3600),n=Math.floor((e-3600*i)/60),a=Math.floor(e-3600*i-60*n);return i<10&&(i="0"+i),n<10&&(n="0"+n),a<10&&(a="0"+a),(t?"-":"")+i+":"+n+":"+a},m.prototype.getClockTimeString=function(e){if(!e)return"0:00:00";var t=new Date(1e3*e),i=t.getHours(),n=t.getMinutes(),a=t.getSeconds(),o=i>=12?"PM":"AM";return(i=(i%=12)||12)+":"+(n=("0"+n).slice(-2))+":"+(a=("0"+a).slice(-2))+" "+o},m.prototype.updateAdMarkers=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e){var t=e.getMediaSession();if(t){var i=t.media;if(i){var n=i.breaks,a=i.duration;if(n)for(var o=0;oa&&r.isEmbedded))if(!document.getElementById("ad"+r.position))document.getElementById("progress").innerHTML+='
'}}}}},m.prototype.removeAdMarkers=function(){document.querySelectorAll(".adMarker").forEach((function(e){e.remove()}))},m.prototype.adPositionToMargin=function(e,t){return-1==e||e>t?o:o*e/t},m.prototype.onBreakClipIdChanged=function(){var e=document.getElementById("skip");e&&e.style&&e.style.display&&(e.style.display="none")},m.prototype.isPlayingBreak=function(e){y.enableProgressBar(!e)},m.prototype.onWhenSkippableChanged=function(e){y.whenSkippable=e},m.prototype.onCurrentBreakClipTimeChanged=function(e){var t=document.getElementById("skip");null==y.whenSkippable||y.whenSkippable<0?t&&t.style&&t.style.display&&(t.style.display="none"):void 0!==y.whenSkippable||e>=y.whenSkippable?t&&t.style&&t.style.display&&(t.style.display="block"):t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.skipAd=function(){y.remotePlayerController.skipAd()},m.prototype.enableProgressBar=function(e){var t=document.getElementById("progress"),i=document.getElementById("progress_indicator"),n=document.getElementById("seekable_window");e?(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_progress.png')",t.style.cursor="pointer",n.style.cursor="pointer",i.style.cursor="pointer",i.draggable=!0,t.addEventListener("click",y.seekMediaListener),n.addEventListener("click",y.seekMediaListener),i.addEventListener("dragend",y.seekMediaListener)):(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_buffer.png')",t.style.cursor="default",n.style.cursor="default",i.style.cursor="default",i.draggable=!1,t.removeEventListener("click",y.seekMediaListener),n.removeEventListener("click",y.seekMediaListener),i.removeEventListener("dragend",y.seekMediaListener))},m.prototype.updateMediaDuration=function(){document.getElementById("duration").innerHTML=m.getDurationString(y.currentMediaDuration)},m.getDurationString=function(e){var t=""+Math.floor(e%60),i=Math.floor(e/60);if(0===i)return t;t=i%60+":"+t;var n=Math.floor(i/60);return 0===n?t:n+":"+t},m.prototype.requestFullScreen=function(){var e=document.getElementById("video_element"),t=e.requestFullScreen||e.webkitRequestFullScreen;t&&(t.call(e),console.log("Requested fullscreen"))},m.prototype.cancelFullScreen=function(){var e=document.cancelFullScreen||document.webkitCancelFullScreen;e&&e.call(document)},m.prototype.fullscreenChangeHandler=function(){y.fullscreen=!y.fullscreen},m.prototype.showFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");y.fullscreen?(e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="block")):(e&&e.style&&e.style.display&&(e.style.display="block"),t&&t.style&&t.style.display&&(t.style.display="none"))},m.prototype.hideFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.showMediaControl=function(){var e=document.getElementById("media_control");e&&e.style&&e.style.opacity&&(e.style.opacity=.7)},m.prototype.hideMediaControl=function(){if("undefined"!=typeof cast){var e=cast.framework.CastContext.getInstance();e&&e.getCurrentSession()?document.getElementById("media_control").style.opacity=.7:document.getElementById("media_control").style.opacity=0}},m.prototype.showVolumeSlider=function(){y.playerHandler.isMuted()||(document.getElementById("audio_bg").style.opacity=1,document.getElementById("audio_bg_track").style.opacity=1,document.getElementById("audio_bg_level").style.opacity=1,document.getElementById("audio_indicator").style.opacity=1)},m.prototype.hideVolumeSlider=function(){document.getElementById("audio_bg").style.opacity=0,document.getElementById("audio_bg_track").style.opacity=0,document.getElementById("audio_bg_level").style.opacity=0,document.getElementById("audio_indicator").style.opacity=0},m.prototype.resetVolumeSlider=function(){var e=.5*document.getElementById("audio_bg_track").clientHeight;document.getElementById("audio_bg_level").style.height=e+"px",document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},m.prototype.initializeUI=function(){document.getElementById("media_title").innerHTML=y.mediaContents[0].title,document.getElementById("media_subtitle").innerHTML=y.mediaContents[y.currentMediaIndex].subtitle,document.getElementById("media_desc").innerHTML=y.mediaContents[y.currentMediaIndex].description,document.getElementById("progress_bg").addEventListener("click",y.seekMedia.bind(y)),document.getElementById("progress").addEventListener("click",y.seekMedia.bind(y)),document.getElementById("progress_indicator").addEventListener("dragend",y.seekMedia.bind(y)),document.getElementById("audio_on").addEventListener("click",y.playerHandler.mute.bind(y.playerHandler)),document.getElementById("audio_off").addEventListener("click",y.playerHandler.unMute.bind(y.playerHandler)),document.getElementById("audio_bg").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_on").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_level").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_track").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_level").addEventListener("click",y.setVolume.bind(y)),document.getElementById("audio_bg_track").addEventListener("click",y.setVolume.bind(y)),document.getElementById("audio_bg").addEventListener("mouseout",y.hideVolumeSlider.bind(y)),document.getElementById("audio_on").addEventListener("mouseout",y.hideVolumeSlider.bind(y)),document.getElementById("main_video").addEventListener("mouseover",y.showMediaControl.bind(y)),document.getElementById("main_video").addEventListener("mouseout",y.hideMediaControl.bind(y)),document.getElementById("media_control").addEventListener("mouseover",y.showMediaControl.bind(y)),document.getElementById("media_control").addEventListener("mouseout",y.hideMediaControl.bind(y)),document.getElementById("fullscreen_expand").addEventListener("click",y.requestFullScreen.bind(y)),document.getElementById("fullscreen_collapse").addEventListener("click",y.cancelFullScreen.bind(y)),document.addEventListener("fullscreenchange",y.fullscreenChangeHandler.bind(y),!1),document.addEventListener("webkitfullscreenchange",y.fullscreenChangeHandler.bind(y),!1),document.getElementById("play").addEventListener("click",y.playerHandler.play.bind(y.playerHandler)),document.getElementById("pause").addEventListener("click",y.playerHandler.pause.bind(y.playerHandler)),document.getElementById("progress_indicator").draggable=!0},m.prototype.addVideoThumbs=function(){if(void 0!==y.mediaJSON&&y.mediaJSON.categories&&y.mediaJSON.categories.length>0){y.mediaContents=y.mediaJSON.categories[0].videos;for(var e=document.getElementById("carousel"),t=null,i=null,n=0;n',t.addEventListener("click",y.selectMedia.bind(y,n)),e.appendChild(t)}},m.prototype.addMediaContents=function(){return void 0!==y.mediaJSON&&y.mediaJSON.categories&&y.mediaJSON.categories.length>0?(y.mediaContents=y.mediaJSON.categories[0].videos,y.mediaContents):null},m.getErrorMessage=function(e){switch(e.code){case chrome.cast.ErrorCode.API_NOT_INITIALIZED:return"The API is not initialized."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CANCEL:return"The operation was canceled by the user"+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CHANNEL_ERROR:return"A channel to the receiver is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.EXTENSION_MISSING:return"The Cast extension is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.INVALID_PARAMETER:return"The parameters to the operation were not valid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:return"No receiver was compatible with the session request."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.SESSION_ERROR:return"A session could not be created, or a session was invalid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.TIMEOUT:return"The operation timed out."+(e.description?" :"+e.description:"");default:return e}};var y=new m;window.__onGCastApiAvailable=function(e){e&&y.initializeCastPlayer()},window.CastPlayer=y,Object.defineProperty(e,"__esModule",{value:!0})})); //# sourceMappingURL=thinkam.net-ng-cast.umd.min.js.map \ No newline at end of file diff --git a/dist/bundles/thinkam.net-ng-cast.umd.min.js.map b/dist/bundles/thinkam.net-ng-cast.umd.min.js.map index 3a0caa7..0c22c0e 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.min.js.map +++ b/dist/bundles/thinkam.net-ng-cast.umd.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","NgCastComponent","ngCastService","this","videoImage","imageOffline","srcImageOffline","prototype","ngOnInit","window","isAvailable","initializeCastApi","castingStatus","getStatus","openSession","discoverDevices","closeSession","tslib_1.__decorate","Input","Component","selector","template","NgCastService","_this","status","casting","onInitSuccess","console","log","onError","err","self","subj","Subject","cast","requestSession","s","session","setCasting","next","code","undefined","error","onMediaDiscovered","categories","script","createElement","setAttribute","body","appendChild","globalThis","CastPlayer","mediaJSON","addMediaContents","play","currentMedia","pause","stop","onMediaError","sessionRequest","SessionRequest","apiConfig","ApiConfig","ReceiverAvailability","AVAILABLE","initialize","mediaContents","initializeUI","setupLocalPlayer","initializeCastPlayer","value","setupRemotePlayer","Injectable","NgCastModule","NgModule","schemas","CUSTOM_ELEMENTS_SCHEMA","imports","CommonModule","exports","providers","declarations","PROGRESS_BAR_WIDTH","FULL_VOLUME_HEIGHT","PLAYER_STATE","playerHandler","PlayerHandler","playerState","playerStateBeforeSwitch","remotePlayer","remotePlayerController","currentMediaTime","mediaDuration","timer","incrementMediaTimeHandler","incrementMediaTime","bind","seekMediaListener","seekMedia","currentMediaIndex","fullscreen","mediaInfo","whenSkippable","liveSeekableRange","isLiveContent","options","receiverApplicationId","autoJoinPolicy","chrome","AutoJoinPolicy","ORIGIN_SCOPED","framework","CastContext","getInstance","setOptions","castPlayer","RemotePlayer","RemotePlayerController","addEventListener","RemotePlayerEventType","IS_CONNECTED_CHANGED","switchPlayer","stopProgressTimer","resetVolumeSlider","isConnected","setTarget","document","getElementById","style","display","updateDisplayMessage","load","mediaIndex","isMediaLoaded","prepareToPlay","getMediaDuration","updateDurationDisplay","startProgressTimer","updateDisplay","loaded","currentMediaDuration","updateMediaDuration","seekTo","getCurrentMediaTime","updateCurrentTimeDisplay","setTimeString","element","time","setVolume","volumeSliderPosition","mute","unMute","isMuted","localPlayer","onMediaLoadedLocally","playerTarget","src","currentTime","duration","volume","p","height","marginTop","muted","DEFAULT_VOLUME","showFullscreenButton","castSession","getCurrentSession","IS_PAUSED_CHANGED","isPaused","IS_MUTED_CHANGED","VOLUME_LEVEL_CHANGED","newVolume","volumeLevel","playOrPause","media","MediaInfo","metadata","GenericMediaMetadata","metadataType","MetadataType","GENERIC","title","images","url","request","LoadRequest","loadMedia","then","errorCode","getErrorMessage","innerHTML","getCastDevice","friendlyName","currentVolume","vScale","pos","setVolumeLevel","muteOrUnmute","seek","hideFullscreenButton","selectMedia","currentMediaInfo","marginLeft","width","seekable_window","unseekable_overlay","event","canSeek","position","parseInt","offsetX","pi","progress","seekTime","pp","pw","currentTarget","id","sectionStartTimeInMedia","mouseEvent","offsetY","clientHeight","setInterval","clearInterval","updateProgressBarByTimer","endPlayback","isNaN","Math","floor","getMediaTimeString","timestamp","isNegative","hours","minutes","seconds","getClockTimeString","date","Date","getHours","getMinutes","getSeconds","ampm","slice","updateAdMarkers","getMediaSession","breaks","contentDuration","adBreak","isEmbedded","adPositionToMargin","removeAdMarkers","querySelectorAll","forEach","adMarker","remove","onBreakClipIdChanged","skip","isPlayingBreak","enableProgressBar","onWhenSkippableChanged","onCurrentBreakClipTimeChanged","currentBreakClipTime","skipAd","enable","progress_indicator","backgroundImage","cursor","draggable","removeEventListener","getDurationString","durationInSec","durationString","durationInMin","durationInHour","requestFullScreen","requestMethod","call","cancelFullScreen","fullscreenChangeHandler","fullscreen_expand","fullscreen_collapse","showMediaControl","media_control","opacity","hideMediaControl","context","showVolumeSlider","hideVolumeSlider","defaultVolumeSliderHeight","addVideoThumbs","ni","newdiv","divIdName","ErrorCode","API_NOT_INITIALIZED","description","CANCEL","CHANNEL_ERROR","EXTENSION_MISSING","INVALID_PARAMETER","RECEIVER_UNAVAILABLE","SESSION_ERROR","TIMEOUT"],"mappings":";;;;;;;;;;;;;;6FAoDgBA,EAAWC,EAAYC,EAAQC,EAAKC,GAChD,IAA2HC,EAAvHC,EAAIC,UAAUC,OAAQC,EAAIH,EAAI,EAAIJ,EAAkB,OAATE,EAAgBA,EAAOM,OAAOC,yBAAyBT,EAAQC,GAAOC,EACrH,GAAuB,iBAAZQ,SAAoD,mBAArBA,QAAQC,SAAyBJ,EAAIG,QAAQC,SAASZ,EAAYC,EAAQC,EAAKC,QACpH,IAAK,IAAIU,EAAIb,EAAWO,OAAS,EAAGM,GAAK,EAAGA,KAAST,EAAIJ,EAAWa,MAAIL,GAAKH,EAAI,EAAID,EAAEI,GAAKH,EAAI,EAAID,EAAEH,EAAQC,EAAKM,GAAKJ,EAAEH,EAAQC,KAASM,GAChJ,OAAOH,EAAI,GAAKG,GAAKC,OAAOK,eAAeb,EAAQC,EAAKM,GAAIA,EC7CnDO,EAAAA,GAAe,WAQ1B,SAAAA,EACUC,GAAAC,KAAAD,cAAAA,EALDC,KAAAC,WAAa,GACbD,KAAAE,cAAe,EACfF,KAAAG,gBAAkB,UAM3BL,EAAAM,UAAAC,SAAA,WACEL,KAAKM,OAASA,OAEd,IAAIP,EAAgBC,KAAKD,cACzBC,KAAKM,OAA8B,sBAAI,SAAUC,GAC3CA,GACFR,EAAcS,qBAIlBR,KAAKS,cAAgBT,KAAKD,cAAcW,aAG1CZ,EAAAM,UAAAO,YAAA,WACEX,KAAKD,cAAca,mBAGrBd,EAAAM,UAAAS,aAAA,WACEb,KAAKD,cAAca,qBA9BK,GAIjBE,EAAAA,CAARC,EAAAA,6CACQD,EAAAA,CAARC,EAAAA,+CACQD,EAAAA,CAARC,EAAAA,kDANUjB,EAAAA,GAAehB,EAAA,CAP3BkC,EAAAA,UAAU,CACTC,SAAU,UACVC,SAAA,w6NAKWpB,EAAAA,ICFAqB,EAAAA,cAAa,WASxB,SAAAA,IAAA,IAAAC,EAAApB,KANQA,KAAAM,OAAcA,OAEfN,KAAAqB,OAAS,CACdC,SAAS,GAmBXtB,KAAAuB,cAAgB,WACdC,QAAQC,IAAI,iCAGdzB,KAAA0B,QAAU,SAAUC,GAClBH,QAAQC,IAAI,8BAA+BE,IAG7C3B,KAAAY,gBAAkB,WAChB,IAAIgB,EAAYR,EACZS,EAAO,IAAIC,EAAAA,QAcf,OAbAV,EAAKW,KAAKC,gBAAe,SAACC,GACxBL,EAAKM,QAAUD,EACfL,EAAKO,YAAW,GAChBN,EAAKO,KAAK,gBACT,SAAUT,GACXC,EAAKO,YAAW,GACC,WAAbR,EAAIU,MACNT,EAAKM,aAAUI,EACfT,EAAKO,KAAK,WAEVZ,QAAQe,MAAM,gCAAiCZ,MAG5CE,GAGT7B,KAAAwC,kBAAoB,SAACC,GACnB,IAAIC,EAASpC,OAAiB,SAAEqC,cAAc,UAO9C,OANAD,EAAOE,aAAa,OAAQ,mBAC5BF,EAAOE,aAAa,MAAO,8EAC3BtC,OAAiB,SAAEuC,KAAKC,YAAYJ,GAEpCK,WAAWC,WAAWC,UAAUR,WAAaA,EAEtCM,WAAWC,WAAWE,oBAW/BlD,KAAAmD,KAAO,WACL/B,EAAKgC,aAAaD,KAAK,OAGzBnD,KAAAqD,MAAQ,WACNjC,EAAKgC,aAAaC,MAAM,OAG1BrD,KAAAsD,KAAO,WACLlC,EAAKgC,aAAaE,KAAK,OAGzBtD,KAAAuD,aAAe,SAAC5B,GACdH,QAAQe,MAAM,wBAAyBZ,IA1EvCoB,WAAWC,WAAWC,UAAY,CAChCR,WAAY,WAIhBtB,EAAAf,UAAAI,kBAAA,WAAA,IAAAY,EAAApB,KACEA,KAAK+B,KAAO/B,KAAKM,OAAe,OAAEyB,KAClC,IAAIyB,EAAiB,IAAIxD,KAAK+B,KAAK0B,eAAe,YAC9CC,EAAY,IAAI1D,KAAK+B,KAAK4B,UAAUH,GACtC,eACA,SAACnC,GAAiCD,EAAKW,KAAK6B,qBAAqBC,aAE3D7D,KAAK+B,KAAK+B,WAAWJ,EAAW1D,KAAKuB,cAAevB,KAAK0B,UAyCnEP,EAAAf,UAAA0D,WAAA,SAAWC,GACLA,IACFhB,WAAWC,WAAWgB,eACtBjB,WAAWC,WAAWiB,mBACtBlB,WAAWC,WAAWkB,yBAoB1B/C,EAAAf,UAAA+B,WAAA,SAAWgC,GACTnE,KAAKqB,OAAOC,QAAU6C,EACtBpB,WAAWC,WAAWoB,qBAGxBjD,EAAAf,UAAAM,UAAA,WACE,OAAOV,KAAKqB,UA7FU,GAAbF,EAAAA,cAAarC,EAAA,CADzBuF,EAAAA,cACYlD,EAAAA,eCMAmD,EAAAA,aAAb,aAAaA,EAAAA,aAAYxF,EAAA,CATxByF,EAAAA,SAAS,CACRC,QAAS,CAAEC,EAAAA,wBACXC,QAAS,CACPC,EAAAA,cAEFC,QAAS,CAAC9E,EAAAA,IACV+E,UAAW,CAAC1D,EAAAA,eACZ2D,aAAc,CAAChF,EAAAA,OAEJwE,EAAAA,cCZb,IAMIS,EAAqB,IASrBC,EAAqB,IAGnBC,EAGE,OAHFA,EAOO,YAPPA,EASI,SATJA,EAWK,UAXLA,EAaI,SAbJA,EAeG,QAaLjC,EAAa,WAEfhD,KAAKkF,cAAgB,IAAIC,EAAcnF,MAGvCA,KAAKoF,YAAcH,EAMnBjF,KAAKqF,wBAA0B,KAI/BrF,KAAKsF,aAAe,KAEpBtF,KAAKuF,uBAAyB,KAI9BvF,KAAKwF,iBAAmB,EAKxBxF,KAAKyF,eAAiB,EAGtBzF,KAAK0F,MAAQ,KAEb1F,KAAK2F,0BAA4B3F,KAAK4F,mBAAmBC,KAAK7F,MAE9DA,KAAK8F,kBAAoB9F,KAAK+F,UAAUF,KAAK7F,MAI7CA,KAAKgG,kBAAoB,EAEzBhG,KAAK+D,cAAgB,KAErB/D,KAAKiG,YAAa,EAIlBjG,KAAKkG,UAAY,KAOjBlG,KAAKmG,cAAgB,KAIrBnG,KAAKoG,kBAAoB,KAEzBpG,KAAKqG,eAAgB,EAErBrG,KAAKiD,UAAY,CACfR,WAAc,KAIlBO,EAAW5C,UAAU8D,qBAAuB,WAC1C,IAAIoC,EAAU,CAKdC,sBAAgC,YAMhCD,EAAQE,eAAiBC,OAAO1E,KAAK2E,eAAeC,cAEpD5E,KAAK6E,UAAUC,YAAYC,cAAcC,WAAWT,GAEpDU,EAAW1B,aAAe,IAAIvD,KAAK6E,UAAUK,aAC7CD,EAAWzB,uBAAyB,IAAIxD,KAAK6E,UAAUM,uBAAuBF,EAAW1B,cACzF0B,EAAWzB,uBAAuB4B,iBAC9BpF,KAAK6E,UAAUQ,sBAAsBC,qBACrCL,EAAWM,aAAazB,KAAKmB,KAOnChE,EAAW5C,UAAUkH,aAAe,WAClCN,EAAWO,oBACXP,EAAWQ,oBACXR,EAAW9B,cAAc5B,OACzB0D,EAAW5B,YAAcH,EACrBlD,MAAQA,KAAK6E,WACTI,EAAW1B,aAAamC,YAC1BT,EAAW5C,oBAIjB4C,EAAW/C,oBAmCb,IAAIkB,EAAgB,SAAU6B,GAC5BhH,KAAKhB,OAAS,GAEdgB,KAAK0H,UAAY,SAAU1I,GACzBgB,KAAKhB,OAASA,GAGhBgB,KAAKmD,KAAO,WACN6D,EAAW5B,cAAgBH,GAC7B+B,EAAW5B,cAAgBH,GAC3B+B,EAAW5B,cAAgBH,GAK7BjF,KAAKhB,OAAOmE,OACZ6D,EAAW5B,YAAcH,EACzB0C,SAASC,eAAe,QAAQC,MAAMC,QAAU,OAChDH,SAASC,eAAe,SAASC,MAAMC,QAAU,QACjD9H,KAAK+H,wBARH/H,KAAKgI,KAAKhB,EAAWhB,oBAWzBhG,KAAK+H,qBAAuB,WAC1B/H,KAAKhB,OAAO+I,wBAGd/H,KAAKqD,MAAQ,WACXrD,KAAKhB,OAAOqE,QACZ2D,EAAW5B,YAAcH,EACzB0C,SAASC,eAAe,QAAQC,MAAMC,QAAU,QAChDH,SAASC,eAAe,SAASC,MAAMC,QAAU,QAGnD9H,KAAKsD,KAAO,WACV0D,EAAW5B,YAAcH,EACzBjF,KAAKhB,OAAOsE,QAGdtD,KAAKgI,KAAO,SAAUC,QAAA,IAAAA,IAAAA,EAAA,MACfA,IACHA,EAAajB,EAAWhB,mBAE1BgB,EAAW5B,YAAcH,EACzBjF,KAAKhB,OAAOgJ,KAAKC,IAQnBjI,KAAKkI,cAAgB,SAAUD,GAC7B,OAAOjI,KAAKhB,OAAOkJ,cAAcD,IASnCjI,KAAKmI,cAAgB,WACnBnB,EAAWvB,cAAgBzF,KAAKoI,mBAChCpB,EAAW9B,cAAcmD,wBACzBrB,EAAW5B,YAAcH,EAEzBjF,KAAKmD,OACL6D,EAAWsB,qBACXtI,KAAKuI,iBAGPvI,KAAKwI,OAAS,WACZxB,EAAWyB,qBAAuBzI,KAAKoI,mBACvCpB,EAAW0B,sBACX1B,EAAW5B,YAAcH,EACrB+B,EAAWxB,iBAAmB,GAC9BxF,KAAK2I,OAAO3B,EAAWxB,kBAE3BxF,KAAKmD,OACL6D,EAAWsB,qBACXtI,KAAK+H,wBAGP/H,KAAK4I,oBAAsB,WACzB,OAAO5I,KAAKhB,OAAO4J,uBAGrB5I,KAAKoI,iBAAmB,WACtB,OAAOpI,KAAKhB,OAAOoJ,oBAGrBpI,KAAKuI,cAAgB,WAEnBvI,KAAKwF,iBAAmBxF,KAAKhB,OAAO4J,sBACpC5I,KAAKyF,cAAgBzF,KAAKhB,OAAOoJ,mBAEjCpI,KAAKhB,OAAOuJ,iBAGdvI,KAAK6I,yBAA2B,WAC9B7I,KAAKhB,OAAO6J,4BAMd7I,KAAK8I,cAAgB,SAAUC,EAASC,GACtChJ,KAAKhB,OAAO8J,cAAcC,EAASC,IAGrChJ,KAAKiJ,UAAY,SAAUC,GACzBlJ,KAAKhB,OAAOiK,UAAUC,IAGxBlJ,KAAKmJ,KAAO,WACVnJ,KAAKhB,OAAOmK,OACZxB,SAASC,eAAe,YAAYC,MAAMC,QAAU,OACpDH,SAASC,eAAe,aAAaC,MAAMC,QAAU,SAGvD9H,KAAKoJ,OAAS,WACZpJ,KAAKhB,OAAOoK,SACZzB,SAASC,eAAe,YAAYC,MAAMC,QAAU,QACpDH,SAASC,eAAe,aAAaC,MAAMC,QAAU,QAGvD9H,KAAKqJ,QAAU,WACb,OAAOrJ,KAAKhB,OAAOqK,WAGrBrJ,KAAK2I,OAAS,SAAUK,GACtBhJ,KAAKhB,OAAO2J,OAAOK,KAOvBhG,EAAW5C,UAAU6D,iBAAmB,WACtC,IAAIqF,EAAc3B,SAASC,eAAe,iBAC1C0B,EAAYnC,iBACV,aAAcH,EAAWuC,qBAAqB1D,KAAKmB,IAGrD,IAAIwC,EAAe,CAEnBrG,KAAoB,WAClBmG,EAAYnG,OAEHwE,SAASC,eAAe,eAC9BC,MAAMC,QAAU,OACnBwB,EAAYzB,MAAMC,QAAU,SAG9BzE,MAAqB,WACnBiG,EAAYjG,SAGdC,KAAoB,WACc,mBAArBgG,EAAYhG,MACrBgG,EAAYhG,SAGhBkG,EAAaxB,KAAO,SAAUC,GAC5BqB,EAAYG,IACVzC,EAAWjD,cAAckE,GAAqB,QAAE,GAClDqB,EAAYtB,QACZnC,KAAKmB,GAEPwC,EAAaZ,oBAAsB,WACjC,OAAOU,EAAYI,aAGrBF,EAAapB,iBAAmB,WAC9B,OAAOkB,EAAYK,UAGrBH,EAAazB,qBAAuB,WAClCJ,SAASC,eAAe,eAAeC,MAAMC,QAAU,OACvDH,SAASC,eAAe,iBAAiBC,MAAMC,QAAU,OACzDH,SAASC,eAAe,uBAAuBC,MAAMC,QAAU,QAGjE0B,EAAaP,UAAY,SAAUC,GACjCI,EAAYM,OAASV,EAAuBlE,EAC1CkE,EAAuBlE,EAAqB,EAC9C,IAAI6E,EAAIlC,SAASC,eAAe,kBAChCiC,EAAEhC,MAAMiC,OAASZ,EAAuB,KACxCW,EAAEhC,MAAMkC,WAAab,EAAuB,MAG9CM,EAAaL,KAAO,WAClBG,EAAYU,OAAQ,GAGtBR,EAAaJ,OAAS,WACpBE,EAAYU,OAAQ,GAGtBR,EAAaH,QAAU,WACrB,OAAOC,EAAYU,OAGrBR,EAAab,OAAS,SAAUK,GAC9BM,EAAYI,YAAcV,GAG5BhC,EAAW9B,cAAcwC,UAAU8B,GAEnCxC,EAAW9B,cAAc+D,UAAUgB,IAEnCjD,EAAWkD,uBAEPlD,EAAWxB,iBAAmB,GAChCwB,EAAW9B,cAAc/B,QAQ7BH,EAAW5C,UAAUgE,kBAAoB,WACvC,IAAI+F,EAAcpI,KAAK6E,UAAUC,YAAYC,cAAcsD,oBAG3DpD,EAAWzB,uBAAuB4B,iBAC9BpF,KAAK6E,UAAUQ,sBAAsBiD,kBACrC,WACQrD,EAAW1B,aAAagF,SACxBtD,EAAW9B,cAAc7B,QAEzB2D,EAAW9B,cAAc/B,QAE/B0C,KAAKmB,IAGXA,EAAWzB,uBAAuB4B,iBAC9BpF,KAAK6E,UAAUQ,sBAAsBmD,iBACrC,WACQvD,EAAW1B,aAAa+D,QACxBrC,EAAW9B,cAAciE,OAEzBnC,EAAW9B,cAAckE,UAE/BvD,KAAKmB,IAGXA,EAAWzB,uBAAuB4B,iBAC9BpF,KAAK6E,UAAUQ,sBAAsBoD,qBACrC,WACI,IAAIC,EAAYzD,EAAW1B,aAAaoF,YAAc1F,EAClD6E,EAAIlC,SAASC,eAAe,kBAChCiC,EAAEhC,MAAMiC,OAASW,EAAY,KAC7BZ,EAAEhC,MAAMkC,WAAaU,EAAY,MACnC5E,KAAKmB,IAMX,IAAIwC,EAAe,GAEnBA,EAAarG,KAAO,WACZ6D,EAAW1B,aAAagF,UACxBtD,EAAWzB,uBAAuBoF,cAG7BhD,SAASC,eAAe,eAC9BC,MAAMC,QAAU,QACDH,SAASC,eAAe,iBAC9BC,MAAMC,QAAU,QAC9BjC,KAAKmB,GAEPwC,EAAanG,MAAQ,WACZ2D,EAAW1B,aAAagF,UACzBtD,EAAWzB,uBAAuBoF,eAExC9E,KAAKmB,GAEPwC,EAAalG,KAAO,WACf0D,EAAWzB,uBAAuBjC,QACrCuC,KAAKmB,GAEPwC,EAAaxB,KAAO,SAAUC,GAC1BzG,QAAQC,IAAI,aAAeuF,EAAWjD,cAAckE,GAAmB,OACvE,IAAI/B,EAAY,IAAIO,OAAO1E,KAAK6I,MAAMC,UAClC7D,EAAWjD,cAAckE,GAAqB,QAAE,GAAI,aAExD/B,EAAU4E,SAAW,IAAIrE,OAAO1E,KAAK6I,MAAMG,qBAC3C7E,EAAU4E,SAASE,aAAevE,OAAO1E,KAAK6I,MAAMK,aAAaC,QACjEhF,EAAU4E,SAASK,MAAQnE,EAAWjD,cAAckE,GAAmB,MACvE/B,EAAU4E,SAASM,OAAS,CACxB,CAACC,IA7de,GA6dYrE,EAAWjD,cAAckE,GAAmB,QAE5E,IAAIqD,EAAU,IAAI7E,OAAO1E,KAAK6I,MAAMW,YAAYrF,GAChDiE,EAAYqB,UAAUF,GAASG,KAC3BzE,EAAW9B,cAAcsD,OAAO3C,KAAKmB,EAAW9B,eAChD,SAAUwG,GACN1E,EAAW5B,YAAcH,EACzBzD,QAAQC,IAAI,4BACRuB,EAAW2I,gBAAgBD,KACjC7F,KAAKmB,KACbnB,KAAKmB,GAEPwC,EAAaZ,oBAAsB,WAC/B,OAAO5B,EAAW1B,aAAaoE,aACjC7D,KAAKmB,GAEPwC,EAAapB,iBAAmB,WAC5B,OAAOpB,EAAW1B,aAAaqE,UACjC9D,KAAKmB,GAEPwC,EAAazB,qBAAuB,WAChCJ,SAASC,eAAe,eAAeC,MAAMC,QAAU,QACvDH,SAASC,eAAe,iBAAiBC,MAAMC,QAAU,QACzDH,SAASC,eAAe,uBAAuBC,MAAMC,QAAU,QAC/DH,SAASC,eAAe,eAAegE,UACnC5E,EAAWjD,cAAeiD,EAAWhB,mBAA0B,MAAI,IACnEgB,EAAW5B,YAAc,OAAS+E,EAAY0B,gBAAgBC,cACpEjG,KAAKmB,GAEPwC,EAAaP,UAAY,SAAUC,GAE/B,IAAI6C,EAAgB/E,EAAW1B,aAAaoF,YACxCb,EAAIlC,SAASC,eAAe,kBAChC,GAAIsB,EAAuBlE,EAAoB,CAC3C,IAAIgH,EAAUhF,EAAW+E,cAAgB/G,EACrCkE,EAAuB8C,IACvB9C,EAAuB8C,GAAUC,IAAMD,GAAU,GAErDnC,EAAEhC,MAAMiC,OAASZ,EAAuB,KACxCW,EAAEhC,MAAMkC,WAAab,EAAuB,KAC5C6C,EAAgB7C,EAAuBlE,OAEvC+G,EAAgB,EAEpB/E,EAAW1B,aAAaoF,YAAcqB,EACtC/E,EAAWzB,uBAAuB2G,kBACpCrG,KAAKmB,GAEPwC,EAAaL,KAAO,WACXnC,EAAW1B,aAAa+D,SACzBrC,EAAWzB,uBAAuB4G,gBAExCtG,KAAKmB,GAEPwC,EAAaJ,OAAS,WACdpC,EAAW1B,aAAa+D,SACxBrC,EAAWzB,uBAAuB4G,gBAExCtG,KAAKmB,GAEPwC,EAAaH,QAAU,WACnB,OAAOrC,EAAW1B,aAAa+D,SACjCxD,KAAKmB,GAEPwC,EAAab,OAAS,SAAUK,GAC5BhC,EAAW1B,aAAaoE,YAAcV,EACtChC,EAAWzB,uBAAuB6G,QACpCvG,KAAKmB,GAEPA,EAAW9B,cAAcwC,UAAU8B,GAI/BxC,EAAW1B,aAAa+D,SACxBrC,EAAW9B,cAAciE,OAE7B,IAAI4C,EAAgB/E,EAAW1B,aAAaoF,YAAc1F,EACtD6E,EAAIlC,SAASC,eAAe,kBAChCiC,EAAEhC,MAAMiC,OAASiC,EAAgB,KACjClC,EAAEhC,MAAMkC,WAAagC,EAAgB,KAErC/E,EAAWqF,uBAEXrF,EAAW9B,cAAc/B,QAM3BH,EAAW5C,UAAUmJ,qBAAuB,WACxB5B,SAASC,eAAe,iBAC9B8B,YAAc1C,EAAWxB,iBAErCwB,EAAW9B,cAAcsD,UAO3BxF,EAAW5C,UAAUkM,YAAc,SAAUrE,GAC3CzG,QAAQC,IAAI,yBAA2BwG,GAEvCjB,EAAWhB,kBAAoBiC,EAE/BjB,EAAW9B,cAAcqH,sBAAmBjK,EAGnCqF,SAASC,eAAe,eAC9B6B,IA1kBqB,GA0kBKzC,EAAWjD,cAAckE,GAAmB,MAGhEN,SAASC,eAAe,sBAC9BC,MAAM2E,WAAa,MACP7E,SAASC,eAAe,YAC9BC,MAAM4E,MAAQ,MAEvB,IAAIC,EAAkB/E,SAASC,eAAe,mBAC1C+E,EAAqBhF,SAASC,eAAe,sBACjD8E,EAAgB7E,MAAM4E,MAAQ1H,EAC9B4H,EAAmB9E,MAAM4E,MAAQ,MAGjCzF,EAAWO,oBACXP,EAAWxB,iBAAmB,EAC9BwB,EAAW9B,cAAc4D,cAAcnB,SAASC,eAAe,eAAgB,GAC/EZ,EAAW9B,cAAc4D,cAAcnB,SAASC,eAAe,YAAa,GAE5EZ,EAAW5B,YAAcH,EACzB+B,EAAW9B,cAAc/B,QAO3BH,EAAW5C,UAAU2F,UAAY,SAAU6G,GACzC,GAAgC,MAA5B5F,EAAWvB,eAA0B1D,KAAK6E,UAAUC,YAAYC,cAAcsD,sBAAwBpD,EAAW1B,aAAauH,QAChIrL,QAAQC,IAAI,6BAId,IAAIuF,EAAWX,eAAkBW,EAAWZ,kBAA5C,CAKA,IAAI0G,EAAWC,SAASH,EAAMI,QAAS,IACnCC,EAAKtF,SAASC,eAAe,sBAC7BsF,EAAWvF,SAASC,eAAe,YACnCuF,EAAW,EACXC,EAAK,EACLC,EAAK,EACqB,sBAA1BT,EAAMU,cAAcC,IACtBJ,EAAWJ,SAAS/F,EAAWxB,iBAAmBwB,EAAWvB,cAAgBqH,EAC3E/H,EAAoB,IACtBqI,EAAKL,SAASE,EAAGpF,MAAM2E,WAAY,IAAMM,EACzCO,EAAKN,SAASG,EAASrF,MAAM4E,MAAO,IAAMK,IAE1CK,EAAWJ,SAASD,EAAW9F,EAAWvB,cAAgBV,EAAoB,IAC9EqI,EAAKN,EACLO,EAAKP,GAGH9F,EAAW5B,cAAgBH,GAC7B+B,EAAW5B,cAAgBH,IAC3B+B,EAAWxB,iBAAmB2H,EAC9BD,EAASrF,MAAM4E,MAAQY,EAAK,KAC5BJ,EAAGpF,MAAM2E,WAAaY,EAAK,MAGzBpG,EAAWX,gBACb8G,GAAYnG,EAAWd,UAAU4E,SAAS0C,yBAG5CxG,EAAW9B,cAAcyD,OAAOwE,QAhC9B3L,QAAQC,IAAI,wCAuChBuB,EAAW5C,UAAU6I,UAAY,SAAUwE,GACzC,IAAI5D,EAAIlC,SAASC,eAAe,kBAC5BqE,EAAM,EAERA,EADkC,mBAAhCwB,EAAWH,cAAcC,GACrBvI,EAAqB+H,SAASU,EAAWC,QAAS,IAElDX,SAASlD,EAAE8D,aAAc,IAAMZ,SAASU,EAAWC,QAAS,IAEpE1G,EAAW9B,cAAc+D,UAAUgD,IAMrCjJ,EAAW5C,UAAUkI,mBAAqB,WACxCtB,EAAWO,oBAGXP,EAAWtB,MAAQkI,YAAY5G,EAAWrB,0BA5pB3B,MAkqBjB3C,EAAW5C,UAAUmH,kBAAoB,WACnCP,EAAWtB,QACbmI,cAAc7G,EAAWtB,OACzBsB,EAAWtB,MAAQ,OAOvB1C,EAAW5C,UAAUwF,mBAAqB,WAEtCoB,EAAWxB,iBAAmBwB,EAAW9B,cAAc0D,sBACvD5B,EAAWyB,qBAAuBzB,EAAW9B,cAAckD,mBAEvDpB,EAAW5B,cAAgBH,IACvB+B,EAAWxB,iBAAmBwB,EAAWyB,sBAC3CzB,EAAWxB,kBAAoB,EAC/BwB,EAAW8G,4BAEX9G,EAAW+G,gBAQrB/K,EAAW5C,UAAU0N,yBAA2B,WAC9C,IAAIjE,EAAIlC,SAASC,eAAe,YAIhC,GAHIoG,MAAMjB,SAASlD,EAAEhC,MAAM4E,MAAO,OAC9B5C,EAAEhC,MAAM4E,MAAQ,GAEhBzF,EAAWyB,qBAAuB,EAClC,IAAI2E,EAAKa,KAAKC,MACVnJ,EAAqBiC,EAAWxB,iBAAmBwB,EAAWyB,sBAGtEoB,EAAEhC,MAAM4E,MAAQW,EAAK,KACZzF,SAASC,eAAe,sBAC9BC,MAAM2E,YAAa,IAA2BY,EAAK,KAElDA,GAAMrI,GACRiC,EAAW+G,eAOf/K,EAAW5C,UAAU2N,YAAc,WACjC/G,EAAWxB,iBAAmB,EAC9BwB,EAAWO,oBACXP,EAAW5B,YAAcH,EACzB+B,EAAW9B,cAAcqD,gBAEzB,IAAIpF,EAAOwE,SAASC,eAAe,QAC/BzE,GAAQA,EAAK0E,OAAS1E,EAAK2E,UAC7B3E,EAAK0E,MAAMC,QAAU,SAEvB,IAAIzE,EAAQsE,SAASC,eAAe,SAChCvE,GAASA,EAAMwE,OAASxE,EAAMwE,MAAMC,UACtCzE,EAAMwE,MAAMC,QAAU,SAO1B9E,EAAW5C,UAAU+N,mBAAqB,SAAUC,GAClD,GAAiB9L,MAAb8L,GAAuC,MAAbA,EAC5B,OAAO,KAGT,IAAIC,GAAa,EACbD,EAAY,IACdC,GAAa,EACbD,IAAc,GAGhB,IAAIE,EAAQL,KAAKC,MAAME,EAAY,MAC/BG,EAAUN,KAAKC,OAAOE,EAAqB,KAARE,GAAiB,IACpDE,EAAUP,KAAKC,MAAME,EAAqB,KAARE,EAA2B,GAAVC,GAMvD,OAJID,EAAQ,KAAIA,EAAQ,IAAMA,GAC1BC,EAAU,KAAIA,EAAU,IAAMA,GAC9BC,EAAU,KAAIA,EAAU,IAAMA,IAE1BH,EAAa,IAAM,IAAMC,EAAQ,IAAMC,EAAU,IAAMC,GAOjExL,EAAW5C,UAAUqO,mBAAqB,SAAUL,GAClD,IAAKA,EAAW,MAAO,UAEvB,IAAIM,EAAO,IAAIC,KAAiB,IAAZP,GAChBE,EAAQI,EAAKE,WACbL,EAAUG,EAAKG,aACfL,EAAUE,EAAKI,aACfC,EAAOT,GAAS,GAAK,KAAO,KAOhC,OAJAA,GAFAA,GAAgB,KAEQ,IAGA,KAFxBC,GAAW,IAAMA,GAASS,OAAO,IAEO,KADxCR,GAAW,IAAMA,GAASQ,OAAO,IACuB,IAAMD,GAOhE/L,EAAW5C,UAAU6O,gBAAkB,WACrC,IAAI9E,EAAcpI,KAAK6E,UAAUC,YAAYC,cAAcsD,oBAC3D,GAAKD,EAAL,CAEA,IAAIS,EAAQT,EAAY+E,kBACxB,GAAKtE,EAAL,CAEA,IAAI1E,EAAY0E,EAAMA,MACtB,GAAK1E,EAAL,CAEA,IAAIiJ,EAASjJ,EAAUiJ,OACnBC,EAAkBlJ,EAAUyD,SAEhC,GAAKwF,EAIL,IAAK,IAAIvP,EAAI,EAAGA,EAAIuP,EAAO7P,OAAQM,IAAK,CACtC,IAAIyP,EAAUF,EAAOvP,GAIrB,KAAIyP,EAAQvC,SAAWsC,GAAmBC,EAAQC,YAKlD,IAAK3H,SAASC,eAAe,KAAOyH,EAAQvC,UAChCnF,SAASC,eAAe,YAC9BgE,WAAa,+BAAiCyD,EAAQvC,SACxD,yBACA9F,EAAWuI,mBAAmBF,EAAQvC,SAAUsC,GAAmB,kBAQ3EpM,EAAW5C,UAAUoP,gBAAkB,WACrC7H,SAAS8H,iBAAiB,aAAaC,SAAQ,SAAUC,GACvDA,EAASC,aAOb5M,EAAW5C,UAAUmP,mBAAqB,SAAUzC,EAAUsC,GAE5D,OAAiB,GAAbtC,GAMAA,EAAWsC,EALNrK,EAUDA,EAAqB+H,EAAYsC,GAM3CpM,EAAW5C,UAAUyP,qBAAuB,WAE1C,IAAIC,EAAOnI,SAASC,eAAe,QAC/BkI,GAAQA,EAAKjI,OAASiI,EAAKjI,MAAMC,UACnCgI,EAAKjI,MAAMC,QAAU,SAMzB9E,EAAW5C,UAAU2P,eAAiB,SAAUA,GAC9C/I,EAAWgJ,mBAAmBD,IAMhC/M,EAAW5C,UAAU6P,uBAAyB,SAAU9J,GACtDa,EAAWb,cAAgBA,GAM7BnD,EAAW5C,UAAU8P,8BAAgC,SAAUC,GAC7D,IAAIL,EAAOnI,SAASC,eAAe,QAGHtF,MAA5B0E,EAAWb,eAA8Ba,EAAWb,cAAgB,EAElE2J,GAAQA,EAAKjI,OAASiI,EAAKjI,MAAMC,UACnCgI,EAAKjI,MAAMC,QAAU,aAGaxF,IAA7B0E,EAAWb,eAA+BgK,GAAwBnJ,EAAWb,cAEhF2J,GAAQA,EAAKjI,OAASiI,EAAKjI,MAAMC,UACnCgI,EAAKjI,MAAMC,QAAU,SAKnBgI,GAAQA,EAAKjI,OAASiI,EAAKjI,MAAMC,UACnCgI,EAAKjI,MAAMC,QAAU,SAO3B9E,EAAW5C,UAAUgQ,OAAS,WAC5BpJ,EAAWzB,uBAAuB6K,UAMpCpN,EAAW5C,UAAU4P,kBAAoB,SAAUK,GACjD,IAAInD,EAAWvF,SAASC,eAAe,YACnC0I,EAAqB3I,SAASC,eAAe,sBAC7C8E,EAAkB/E,SAASC,eAAe,mBAE1CyI,GAEFnD,EAASrF,MAAM0I,gBAAkB,sDACjCrD,EAASrF,MAAM2I,OAAS,UACxB9D,EAAgB7E,MAAM2I,OAAS,UAC/BF,EAAmBzI,MAAM2I,OAAS,UAClCF,EAAmBG,WAAY,EAG/BvD,EAAS/F,iBAAiB,QAASH,EAAWlB,mBAC9C4G,EAAgBvF,iBAAiB,QAASH,EAAWlB,mBACrDwK,EAAmBnJ,iBAAiB,UAAWH,EAAWlB,qBAG1DoH,EAASrF,MAAM0I,gBAAkB,oDACjCrD,EAASrF,MAAM2I,OAAS,UACxB9D,EAAgB7E,MAAM2I,OAAS,UAC/BF,EAAmBzI,MAAM2I,OAAS,UAClCF,EAAmBG,WAAY,EAG/BvD,EAASwD,oBAAoB,QAAS1J,EAAWlB,mBACjD4G,EAAgBgE,oBAAoB,QAAS1J,EAAWlB,mBACxDwK,EAAmBI,oBAAoB,UAAW1J,EAAWlB,qBAOjE9C,EAAW5C,UAAUsI,oBAAsB,WACzCf,SAASC,eAAe,YAAYgE,UAChC5I,EAAW2N,kBAAkB3J,EAAWyB,uBAO9CzF,EAAW2N,kBAAoB,SAASC,GACtC,IAAIC,EAAiB,GAAK5C,KAAKC,MAAM0C,EAAgB,IACjDE,EAAgB7C,KAAKC,MAAM0C,EAAgB,IAC/C,GAAsB,IAAlBE,EACA,OAAOD,EAEXA,EAAkBC,EAAgB,GAAM,IAAMD,EAC9C,IAAIE,EAAiB9C,KAAKC,MAAM4C,EAAgB,IAChD,OAAuB,IAAnBC,EACOF,EAEJE,EAAiB,IAAMF,GAMhC7N,EAAW5C,UAAU4Q,kBAAoB,WAEvC,IAAIjI,EAAUpB,SAASC,eAAe,iBAClCqJ,EACFlI,EAA2B,mBAAKA,EAAiC,wBAE/DkI,IAEFA,EAAcC,KAAKnI,GACnBvH,QAAQC,IAAI,0BAOhBuB,EAAW5C,UAAU+Q,iBAAmB,WAEtC,IAAIF,EACFtJ,SAA2B,kBAAKA,SAAiC,uBAE/DsJ,GACFA,EAAcC,KAAKvJ,WAOvB3E,EAAW5C,UAAUgR,wBAA0B,WAC7CpK,EAAWf,YAAce,EAAWf,YAMtCjD,EAAW5C,UAAU8J,qBAAuB,WAC1C,IAAImH,EAAoB1J,SAASC,eAAe,qBAC5C0J,EAAsB3J,SAASC,eAAe,uBAE9CZ,EAAWf,YACToL,GAAqBA,EAAkBxJ,OAASwJ,EAAkBxJ,MAAMC,UAC1EuJ,EAAkBxJ,MAAMC,QAAU,QAEhCwJ,GAAuBA,EAAoBzJ,OAASyJ,EAAoBzJ,MAAMC,UAChFwJ,EAAoBzJ,MAAMC,QAAU,WAElCuJ,GAAqBA,EAAkBxJ,OAASwJ,EAAkBxJ,MAAMC,UAC1EuJ,EAAkBxJ,MAAMC,QAAU,SAEhCwJ,GAAuBA,EAAoBzJ,OAASyJ,EAAoBzJ,MAAMC,UAChFwJ,EAAoBzJ,MAAMC,QAAU,UAO1C9E,EAAW5C,UAAUiM,qBAAuB,WAC1C,IAAIgF,EAAoB1J,SAASC,eAAe,qBAC5C0J,EAAsB3J,SAASC,eAAe,uBAE9CyJ,GAAqBA,EAAkBxJ,OAASwJ,EAAkBxJ,MAAMC,UAC1EuJ,EAAkBxJ,MAAMC,QAAU,QAEhCwJ,GAAuBA,EAAoBzJ,OAASyJ,EAAoBzJ,MAAMC,UAChFwJ,EAAoBzJ,MAAMC,QAAU,SAMxC9E,EAAW5C,UAAUmR,iBAAmB,WACtC,IAAIC,EAAgB7J,SAASC,eAAe,iBACxC4J,GAAiBA,EAAc3J,OAAS2J,EAAc3J,MAAM4J,UAC9DD,EAAc3J,MAAM4J,QAAU,KAMlCzO,EAAW5C,UAAUsR,iBAAmB,WACtC,GAAoB,oBAAT3P,KAAsB,CAC/B,IAAI4P,EAAU5P,KAAK6E,UAAUC,YAAYC,cACrC6K,GAAWA,EAAQvH,oBAErBzC,SAASC,eAAe,iBAAiBC,MAAM4J,QAAU,GAEzD9J,SAASC,eAAe,iBAAiBC,MAAM4J,QAAU,IAQ/DzO,EAAW5C,UAAUwR,iBAAmB,WACjC5K,EAAW9B,cAAcmE,YAC5B1B,SAASC,eAAe,YAAYC,MAAM4J,QAAU,EACpD9J,SAASC,eAAe,kBAAkBC,MAAM4J,QAAU,EAC1D9J,SAASC,eAAe,kBAAkBC,MAAM4J,QAAU,EAC1D9J,SAASC,eAAe,mBAAmBC,MAAM4J,QAAU,IAO/DzO,EAAW5C,UAAUyR,iBAAmB,WACtClK,SAASC,eAAe,YAAYC,MAAM4J,QAAU,EACpD9J,SAASC,eAAe,kBAAkBC,MAAM4J,QAAU,EAC1D9J,SAASC,eAAe,kBAAkBC,MAAM4J,QAAU,EAC1D9J,SAASC,eAAe,mBAAmBC,MAAM4J,QAAU,GAM7DzO,EAAW5C,UAAUoH,kBAAoB,WACvC,IACIsK,EAnkCe,GAkkCKnK,SAASC,eAAe,kBAAkB+F,aAElEhG,SAASC,eAAe,kBAAkBC,MAAMiC,OAC9CgI,EAA4B,KAC9BnK,SAASC,eAAe,YAAYC,MAAMC,QAAU,QACpDH,SAASC,eAAe,aAAaC,MAAMC,QAAU,QAMvD9E,EAAW5C,UAAU4D,aAAe,WAElC2D,SAASC,eAAe,eAAegE,UACrC5E,EAAWjD,cAAc,GAAU,MACrC4D,SAASC,eAAe,kBAAkBgE,UACxC5E,EAAWjD,cAAciD,EAAWhB,mBAA6B,SACnE2B,SAASC,eAAe,cAAcgE,UACpC5E,EAAWjD,cAAciD,EAAWhB,mBAAgC,YAGtE2B,SAASC,eAAe,eAAeT,iBACrC,QAASH,EAAWjB,UAAUF,KAAKmB,IACrCW,SAASC,eAAe,YAAYT,iBAClC,QAASH,EAAWjB,UAAUF,KAAKmB,IACrCW,SAASC,eAAe,sBAAsBT,iBAC5C,UAAWH,EAAWjB,UAAUF,KAAKmB,IACvCW,SAASC,eAAe,YAAYT,iBAClC,QAASH,EAAW9B,cAAciE,KAAKtD,KAAKmB,EAAW9B,gBACzDyC,SAASC,eAAe,aAAaT,iBACnC,QAASH,EAAW9B,cAAckE,OAAOvD,KAAKmB,EAAW9B,gBAC3DyC,SAASC,eAAe,YAAYT,iBAClC,YAAaH,EAAW4K,iBAAiB/L,KAAKmB,IAChDW,SAASC,eAAe,YAAYT,iBAClC,YAAaH,EAAW4K,iBAAiB/L,KAAKmB,IAChDW,SAASC,eAAe,kBAAkBT,iBACxC,YAAaH,EAAW4K,iBAAiB/L,KAAKmB,IAChDW,SAASC,eAAe,kBAAkBT,iBACxC,YAAaH,EAAW4K,iBAAiB/L,KAAKmB,IAChDW,SAASC,eAAe,kBAAkBT,iBACxC,QAASH,EAAWiC,UAAUpD,KAAKmB,IACrCW,SAASC,eAAe,kBAAkBT,iBACxC,QAASH,EAAWiC,UAAUpD,KAAKmB,IACrCW,SAASC,eAAe,YAAYT,iBAClC,WAAYH,EAAW6K,iBAAiBhM,KAAKmB,IAC/CW,SAASC,eAAe,YAAYT,iBAClC,WAAYH,EAAW6K,iBAAiBhM,KAAKmB,IAC/CW,SAASC,eAAe,cAAcT,iBACpC,YAAaH,EAAWuK,iBAAiB1L,KAAKmB,IAChDW,SAASC,eAAe,cAAcT,iBACpC,WAAYH,EAAW0K,iBAAiB7L,KAAKmB,IAC/CW,SAASC,eAAe,iBAAiBT,iBACvC,YAAaH,EAAWuK,iBAAiB1L,KAAKmB,IAChDW,SAASC,eAAe,iBAAiBT,iBACvC,WAAYH,EAAW0K,iBAAiB7L,KAAKmB,IAC/CW,SAASC,eAAe,qBAAqBT,iBAC3C,QAASH,EAAWgK,kBAAkBnL,KAAKmB,IAC7CW,SAASC,eAAe,uBAAuBT,iBAC7C,QAASH,EAAWmK,iBAAiBtL,KAAKmB,IAC5CW,SAASR,iBACP,mBAAoBH,EAAWoK,wBAAwBvL,KAAKmB,IAAa,GAC3EW,SAASR,iBACP,yBAA0BH,EAAWoK,wBAAwBvL,KAAKmB,IAAa,GAGjFW,SAASC,eAAe,QAAQT,iBAC9B,QAASH,EAAW9B,cAAc/B,KAAK0C,KAAKmB,EAAW9B,gBACzDyC,SAASC,eAAe,SAAST,iBAC/B,QAASH,EAAW9B,cAAc7B,MAAMwC,KAAKmB,EAAW9B,gBAC1DyC,SAASC,eAAe,sBAAsB6I,WAAY,GAM5DzN,EAAW5C,UAAU2R,eAAiB,WACpC,QAAoC,IAAzB/K,EAAW/D,WAA6B+D,EAAW/D,UAAsB,YAAK+D,EAAW/D,UAAsB,WAAE3D,OAAS,EAAG,CACtI0H,EAAWjD,cAAgBiD,EAAW/D,UAAsB,WAAE,GAAW,OAIzE,IAHA,IAAI+O,EAAKrK,SAASC,eAAe,YAC7BqK,EAAS,KACTC,EAAY,KACPtS,EAAI,EAAGA,EAAIoH,EAAWjD,cAAczE,OAAQM,IAEnDsS,EAAY,QAAUtS,EAAI,OAD1BqS,EAAStK,SAAShF,cAAc,QAEzBC,aAAa,KAAMsP,GAC1BD,EAAOrP,aAAa,QAAS,SAC7BqP,EAAOrG,UACL,aAAmC5E,EAAWjD,cAAcnE,GAAU,MACtE,uBACFqS,EAAO9K,iBAAiB,QAASH,EAAWsF,YAAYzG,KAAKmB,EAAYpH,IACzEoS,EAAGlP,YAAYmP,KAKrBjP,EAAW5C,UAAU8C,iBAAmB,WACtC,YAAoC,IAAzB8D,EAAW/D,WAA6B+D,EAAW/D,UAAsB,YAAK+D,EAAW/D,UAAsB,WAAE3D,OAAS,GACnI0H,EAAWjD,cAAgBiD,EAAW/D,UAAsB,WAAE,GAAW,OAClE+D,EAAWjD,eAEX,MASXf,EAAW2I,gBAAkB,SAAUpJ,GACrC,OAAQA,EAAMF,MACZ,KAAKoE,OAAO1E,KAAKoQ,UAAUC,oBACzB,MAAO,+BACJ7P,EAAM8P,YAAc,KAAO9P,EAAM8P,YAAc,IACpD,KAAK5L,OAAO1E,KAAKoQ,UAAUG,OACzB,MAAO,0CACJ/P,EAAM8P,YAAc,KAAO9P,EAAM8P,YAAc,IACpD,KAAK5L,OAAO1E,KAAKoQ,UAAUI,cACzB,MAAO,+CACJhQ,EAAM8P,YAAc,KAAO9P,EAAM8P,YAAc,IACpD,KAAK5L,OAAO1E,KAAKoQ,UAAUK,kBACzB,MAAO,wCACJjQ,EAAM8P,YAAc,KAAO9P,EAAM8P,YAAc,IACpD,KAAK5L,OAAO1E,KAAKoQ,UAAUM,kBACzB,MAAO,mDACJlQ,EAAM8P,YAAc,KAAO9P,EAAM8P,YAAc,IACpD,KAAK5L,OAAO1E,KAAKoQ,UAAUO,qBACzB,MAAO,wDACJnQ,EAAM8P,YAAc,KAAO9P,EAAM8P,YAAc,IACpD,KAAK5L,OAAO1E,KAAKoQ,UAAUQ,cACzB,MAAO,6DACJpQ,EAAM8P,YAAc,KAAO9P,EAAM8P,YAAc,IACpD,KAAK5L,OAAO1E,KAAKoQ,UAAUS,QACzB,MAAO,4BACJrQ,EAAM8P,YAAc,KAAO9P,EAAM8P,YAAc,IACpD,QACE,OAAO9P,IAIb,IAAIyE,EAAa,IAAIhE,EACrB1C,OAA8B,sBAAI,SAAUC,GACtCA,GACFyG,EAAW9C,wBAIf5D,OAAO0C,WAAagE","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeCastPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n globalThis.CastPlayer.setupRemotePlayer();\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = () => {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n if (typeof localPlayer.stop === \"function\")\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n"]} \ No newline at end of file +{"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","NgCastComponent","ngCastService","this","videoImage","imageOffline","srcImageOffline","prototype","ngOnInit","window","isAvailable","initializeCastApi","castingStatus","getStatus","openSession","discoverDevices","closeSession","tslib_1.__decorate","Input","Component","selector","template","NgCastService","_this","status","casting","onInitSuccess","console","log","onError","err","self","subj","Subject","cast","requestSession","s","session","setCasting","next","code","undefined","error","onMediaDiscovered","categories","script","createElement","setAttribute","body","appendChild","globalThis","CastPlayer","mediaJSON","addMediaContents","play","currentMedia","pause","stop","onMediaError","sessionRequest","SessionRequest","apiConfig","ApiConfig","ReceiverAvailability","AVAILABLE","initialize","mediaContents","initializeUI","setupLocalPlayer","initializeCastPlayer","value","setupRemotePlayer","Injectable","NgCastModule","NgModule","schemas","CUSTOM_ELEMENTS_SCHEMA","imports","CommonModule","exports","providers","declarations","PROGRESS_BAR_WIDTH","FULL_VOLUME_HEIGHT","PLAYER_STATE","playerHandler","PlayerHandler","playerState","playerStateBeforeSwitch","remotePlayer","remotePlayerController","currentMediaTime","mediaDuration","timer","incrementMediaTimeHandler","incrementMediaTime","bind","seekMediaListener","seekMedia","currentMediaIndex","fullscreen","mediaInfo","whenSkippable","liveSeekableRange","isLiveContent","options","receiverApplicationId","autoJoinPolicy","chrome","AutoJoinPolicy","ORIGIN_SCOPED","framework","CastContext","getInstance","setOptions","castPlayer","RemotePlayer","RemotePlayerController","addEventListener","RemotePlayerEventType","IS_CONNECTED_CHANGED","switchPlayer","stopProgressTimer","resetVolumeSlider","isConnected","setTarget","document","getElementById","style","display","updateDisplayMessage","load","mediaIndex","isMediaLoaded","prepareToPlay","getMediaDuration","updateDurationDisplay","startProgressTimer","updateDisplay","loaded","currentMediaDuration","updateMediaDuration","seekTo","getCurrentMediaTime","updateCurrentTimeDisplay","setTimeString","element","time","setVolume","volumeSliderPosition","mute","unMute","isMuted","localPlayer","onMediaLoadedLocally","playerTarget","src","currentTime","duration","volume","p","height","marginTop","muted","DEFAULT_VOLUME","showFullscreenButton","castSession","getCurrentSession","IS_PAUSED_CHANGED","isPaused","IS_MUTED_CHANGED","VOLUME_LEVEL_CHANGED","newVolume","volumeLevel","playOrPause","media","MediaInfo","metadata","GenericMediaMetadata","metadataType","MetadataType","GENERIC","title","images","url","request","LoadRequest","loadMedia","then","errorCode","getErrorMessage","innerHTML","getCastDevice","friendlyName","currentVolume","vScale","pos","setVolumeLevel","muteOrUnmute","seek","hideFullscreenButton","selectMedia","currentMediaInfo","marginLeft","width","seekable_window","unseekable_overlay","event","canSeek","position","parseInt","offsetX","pi","progress","seekTime","pp","pw","currentTarget","id","sectionStartTimeInMedia","mouseEvent","offsetY","clientHeight","setInterval","clearInterval","updateProgressBarByTimer","endPlayback","isNaN","Math","floor","getMediaTimeString","timestamp","isNegative","hours","minutes","seconds","getClockTimeString","date","Date","getHours","getMinutes","getSeconds","ampm","slice","updateAdMarkers","getMediaSession","breaks","contentDuration","adBreak","isEmbedded","adPositionToMargin","removeAdMarkers","querySelectorAll","forEach","adMarker","remove","onBreakClipIdChanged","skip","isPlayingBreak","enableProgressBar","onWhenSkippableChanged","onCurrentBreakClipTimeChanged","currentBreakClipTime","skipAd","enable","progress_indicator","backgroundImage","cursor","draggable","removeEventListener","getDurationString","durationInSec","durationString","durationInMin","durationInHour","requestFullScreen","requestMethod","call","cancelFullScreen","fullscreenChangeHandler","fullscreen_expand","fullscreen_collapse","showMediaControl","media_control","opacity","hideMediaControl","context","showVolumeSlider","hideVolumeSlider","defaultVolumeSliderHeight","addVideoThumbs","ni","newdiv","divIdName","ErrorCode","API_NOT_INITIALIZED","description","CANCEL","CHANNEL_ERROR","EXTENSION_MISSING","INVALID_PARAMETER","RECEIVER_UNAVAILABLE","SESSION_ERROR","TIMEOUT"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeCastPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n globalThis.CastPlayer.setupRemotePlayer();\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = () => {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n if (typeof localPlayer.stop === \"function\")\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n"]} \ No newline at end of file diff --git a/dist/esm2015/ng-cast.component.js b/dist/esm2015/ng-cast.component.js index a2254a2..b6d2ac0 100644 --- a/dist/esm2015/ng-cast.component.js +++ b/dist/esm2015/ng-cast.component.js @@ -37,7 +37,7 @@ NgCastComponent = tslib_1.__decorate([ Component({ selector: 'ng-cast', template: "
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", - styles: ["body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:1100px}#video_image{height:536px;margin:20px auto 0 40px;width:960px}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin:0 0 0 40px;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;width:960px}#video_element{background-color:#000;margin:20px auto 0 40px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin:-4px 0 0 40px;opacity:.9;padding:10px;width:940px}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px;width:95%}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;left:8px;margin:-60px 0 0 40px;opacity:.7;padding:0;position:absolute;top:650px;transition:opacity 1s;width:960px;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] + styles: ["body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] }) ], NgCastComponent); export { NgCastComponent }; diff --git a/dist/fesm2015/thinkam.net-ng-cast.js b/dist/fesm2015/thinkam.net-ng-cast.js index b33f368..df39ca5 100644 --- a/dist/fesm2015/thinkam.net-ng-cast.js +++ b/dist/fesm2015/thinkam.net-ng-cast.js @@ -40,7 +40,7 @@ NgCastComponent = __decorate([ Component({ selector: 'ng-cast', template: "
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", - styles: ["body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:1100px}#video_image{height:536px;margin:20px auto 0 40px;width:960px}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin:0 0 0 40px;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;width:960px}#video_element{background-color:#000;margin:20px auto 0 40px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin:-4px 0 0 40px;opacity:.9;padding:10px;width:940px}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px;width:95%}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;left:8px;margin:-60px 0 0 40px;opacity:.7;padding:0;position:absolute;top:650px;transition:opacity 1s;width:960px;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] + styles: ["body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] }) ], NgCastComponent); diff --git a/dist/package.json b/dist/package.json index 9d77e9a..cb5826b 100644 --- a/dist/package.json +++ b/dist/package.json @@ -1,7 +1,7 @@ { "$schema": "./node_modules/ng-packagr/package.schema.json", "name": "@thinkam.net/ng-cast", - "version": "0.3.5", + "version": "0.3.7", "description": "Broadcast media on your TV from your Angular app", "main": "bundles/thinkam.net-ng-cast.umd.js", "repository": { diff --git a/dist/thinkam.net-ng-cast.metadata.json b/dist/thinkam.net-ng-cast.metadata.json index 9c1076a..5b123ed 100644 --- a/dist/thinkam.net-ng-cast.metadata.json +++ b/dist/thinkam.net-ng-cast.metadata.json @@ -1 +1 @@ -{"__symbolic":"module","version":4,"metadata":{"NgCastModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":6,"character":1},"arguments":[{"schemas":[{"__symbolic":"reference","module":"@angular/core","name":"CUSTOM_ELEMENTS_SCHEMA","line":7,"character":13}],"imports":[{"__symbolic":"reference","module":"@angular/common","name":"CommonModule","line":9,"character":4}],"exports":[{"__symbolic":"reference","name":"ɵa"}],"providers":[{"__symbolic":"reference","name":"NgCastService"}],"declarations":[{"__symbolic":"reference","name":"ɵa"}]}]}],"members":{}},"NgCastService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":8,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor"}],"initializeCastApi":[{"__symbolic":"method"}],"initialize":[{"__symbolic":"method"}],"setCasting":[{"__symbolic":"method"}],"getStatus":[{"__symbolic":"method"}]}},"ɵa":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":4,"character":1},"arguments":[{"selector":"ng-cast","template":"
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n","styles":["body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:1100px}#video_image{height:536px;margin:20px auto 0 40px;width:960px}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin:0 0 0 40px;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;width:960px}#video_element{background-color:#000;margin:20px auto 0 40px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin:-4px 0 0 40px;opacity:.9;padding:10px;width:940px}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px;width:95%}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;left:8px;margin:-60px 0 0 40px;opacity:.7;padding:0;position:absolute;top:650px;transition:opacity 1s;width:960px;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"]}]}],"members":{"videoImage":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":15,"character":3}}]}],"imageOffline":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":16,"character":3}}]}],"srcImageOffline":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":17,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"NgCastService"}]}],"ngOnInit":[{"__symbolic":"method"}],"openSession":[{"__symbolic":"method"}],"closeSession":[{"__symbolic":"method"}]}}},"origins":{"NgCastModule":"./ng.cast.module","NgCastService":"./shared/ng-cast.service","ɵa":"./ng-cast.component"},"importAs":"@thinkam.net/ng-cast"} \ No newline at end of file +{"__symbolic":"module","version":4,"metadata":{"NgCastModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":6,"character":1},"arguments":[{"schemas":[{"__symbolic":"reference","module":"@angular/core","name":"CUSTOM_ELEMENTS_SCHEMA","line":7,"character":13}],"imports":[{"__symbolic":"reference","module":"@angular/common","name":"CommonModule","line":9,"character":4}],"exports":[{"__symbolic":"reference","name":"ɵa"}],"providers":[{"__symbolic":"reference","name":"NgCastService"}],"declarations":[{"__symbolic":"reference","name":"ɵa"}]}]}],"members":{}},"NgCastService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":8,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor"}],"initializeCastApi":[{"__symbolic":"method"}],"initialize":[{"__symbolic":"method"}],"setCasting":[{"__symbolic":"method"}],"getStatus":[{"__symbolic":"method"}]}},"ɵa":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":4,"character":1},"arguments":[{"selector":"ng-cast","template":"
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n","styles":["body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"]}]}],"members":{"videoImage":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":15,"character":3}}]}],"imageOffline":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":16,"character":3}}]}],"srcImageOffline":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":17,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"NgCastService"}]}],"ngOnInit":[{"__symbolic":"method"}],"openSession":[{"__symbolic":"method"}],"closeSession":[{"__symbolic":"method"}]}}},"origins":{"NgCastModule":"./ng.cast.module","NgCastService":"./shared/ng-cast.service","ɵa":"./ng-cast.component"},"importAs":"@thinkam.net/ng-cast"} \ No newline at end of file diff --git a/ng-cast.component.scss b/ng-cast.component.scss index 96f2aa0..135b9e6 100644 --- a/ng-cast.component.scss +++ b/ng-cast.component.scss @@ -97,24 +97,22 @@ body { #main_video { float: left; - width: 1100px; + width: 100%; } #video_image { - margin-left: 40px; margin-right: auto; margin-top: 20px; margin-bottom: 0px; - width: 960px; + width: 100%; height: 536px; } #video_image_overlay { - margin-left: 40px; margin-right: 0px; margin-top: 0px; margin-bottom: 0px; - width: 960px; + width: 100%; height: 540px; background: linear-gradient(to top, rgba(0, 0, 0, 0.9), @@ -127,11 +125,10 @@ body { #video_element { display: none; - margin-left: 40px; margin-right: auto; margin-top: 20px; margin-bottom: 0px; - width: 960px; + width: 100%; height: 540px; background-color: #000; } @@ -140,13 +137,13 @@ body { display: block; clear: both; float: left; - width: 940px; + width: 100%; height: 116px; - margin: -4px 0px 0px 40px; padding: 10px; opacity: 0.9; background-color: #DDE0E5; color: #000; + margin-top: 10px; } #media_title { @@ -168,7 +165,7 @@ body { #media_desc { float: left; - width: 95%; + width: 100%; margin: 5px; font-size: 12px; font-family: 'Roboto', "Open Sans", "Verdana", Georgia, Serif; @@ -176,12 +173,10 @@ body { #media_control { position: absolute; - left: 8px; - top: 650px; - width: 960px; + top: 595px; + width: 100%; height: 60px; z-index: 1000; - margin: -60px 0px 0px 40px; padding: 0px; opacity: 0.7; background-color: #000; diff --git a/package.json b/package.json index f875b73..8c07ebd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "$schema": "./node_modules/ng-packagr/package.schema.json", "name": "@thinkam.net/ng-cast", - "version": "0.3.5", + "version": "0.3.7", "ngPackage": { "lib": { "entryFile": "index.ts" From 5b660e762aab5d9e29fd616d39ad1d1de2de1543 Mon Sep 17 00:00:00 2001 From: Felipe de Almeida Date: Tue, 27 Oct 2020 04:27:55 -0300 Subject: [PATCH 07/10] manager playlist and player type --- dist/bundles/thinkam.net-ng-cast.umd.js | 606 +++--- dist/bundles/thinkam.net-ng-cast.umd.js.map | 2 +- dist/bundles/thinkam.net-ng-cast.umd.min.js | 16 +- .../thinkam.net-ng-cast.umd.min.js.map | 2 +- dist/dto/schedule-dto.d.ts | 27 + dist/dto/tenant-dto.d.ts | 25 + dist/esm2015/dto/schedule-dto.js | 44 + dist/esm2015/dto/tenant-dto.js | 42 + dist/esm2015/ng-cast.component.js | 176 +- dist/esm2015/ng.cast.module.js | 40 +- dist/esm2015/shared/ng-cast.service.js | 15 +- dist/fesm2015/thinkam.net-ng-cast.js | 309 ++- dist/fesm2015/thinkam.net-ng-cast.js.map | 2 +- dist/ng-cast.component.d.ts | 42 +- dist/package.json | 4 +- dist/shared/ng-cast.service.d.ts | 2 +- dist/thinkam.net-ng-cast.metadata.json | 2 +- dto/schedule-dto.ts | 70 + dto/tenant-dto.ts | 65 + ng-cast.component.html | 51 +- ng-cast.component.scss | 225 +++ ng-cast.component.ts | 167 +- ng.cast.module.ts | 12 +- package-lock.json | 1754 +++++++---------- package.json | 27 +- 25 files changed, 2155 insertions(+), 1572 deletions(-) create mode 100644 dist/dto/schedule-dto.d.ts create mode 100644 dist/dto/tenant-dto.d.ts create mode 100644 dist/esm2015/dto/schedule-dto.js create mode 100644 dist/esm2015/dto/tenant-dto.js create mode 100644 dto/schedule-dto.ts create mode 100644 dto/tenant-dto.ts diff --git a/dist/bundles/thinkam.net-ng-cast.umd.js b/dist/bundles/thinkam.net-ng-cast.umd.js index a4b80f4..ee04629 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.js +++ b/dist/bundles/thinkam.net-ng-cast.umd.js @@ -1,344 +1,10 @@ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('rxjs')) : - typeof define === 'function' && define.amd ? define('@thinkam.net/ng-cast', ['exports', '@angular/core', '@angular/common', 'rxjs'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.thinkam = global.thinkam || {}, global.thinkam.net = global.thinkam.net || {}, global.thinkam.net['ng-cast'] = {}), global.ng.core, global.ng.common, global.rxjs)); -}(this, (function (exports, core, common, rxjs) { 'use strict'; + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('rxjs'), require('videogular2/compiled/src/streaming/vg-dash/vg-dash'), require('videogular2/compiled/core'), require('videogular2/compiled/controls'), require('videogular2/compiled/streaming'), require('videogular2/compiled/buffering'), require('videogular2/compiled/overlay-play')) : + typeof define === 'function' && define.amd ? define('@thinkam.net/ng-cast', ['exports', '@angular/core', '@angular/common', 'rxjs', 'videogular2/compiled/src/streaming/vg-dash/vg-dash', 'videogular2/compiled/core', 'videogular2/compiled/controls', 'videogular2/compiled/streaming', 'videogular2/compiled/buffering', 'videogular2/compiled/overlay-play'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.thinkam = global.thinkam || {}, global.thinkam.net = global.thinkam.net || {}, global.thinkam.net['ng-cast'] = {}), global.ng.core, global.ng.common, global.rxjs, global.VgDASH, global.VgCoreModule, global.VgControlsModule, global.VgStreamingModule, global.VgBufferingModule, global.VgOverlayPlayModule)); +}(this, (function (exports, core, common, rxjs, vgDash, core$1, controls, streaming, buffering, overlayPlay) { 'use strict'; - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */ - /* global Reflect, Promise */ - var extendStatics = function (d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) - if (b.hasOwnProperty(p)) - d[p] = b[p]; }; - return extendStatics(d, b); - }; - function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - } - var __assign = function () { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - function __rest(s, e) { - var t = {}; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { - if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) - t[p[i]] = s[p[i]]; - } - return t; - } - function __decorate(decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") - r = Reflect.decorate(decorators, target, key, desc); - else - for (var i = decorators.length - 1; i >= 0; i--) - if (d = decorators[i]) - r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; - } - function __param(paramIndex, decorator) { - return function (target, key) { decorator(target, key, paramIndex); }; - } - function __metadata(metadataKey, metadataValue) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") - return Reflect.metadata(metadataKey, metadataValue); - } - function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { - step(generator.next(value)); - } - catch (e) { - reject(e); - } } - function rejected(value) { try { - step(generator["throw"](value)); - } - catch (e) { - reject(e); - } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - } - function __generator(thisArg, body) { - var _ = { label: 0, sent: function () { if (t[0] & 1) - throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) - throw new TypeError("Generator is already executing."); - while (_) - try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) - return t; - if (y = 0, t) - op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: - case 1: - t = op; - break; - case 4: - _.label++; - return { value: op[1], done: false }; - case 5: - _.label++; - y = op[1]; - op = [0]; - continue; - case 7: - op = _.ops.pop(); - _.trys.pop(); - continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { - _ = 0; - continue; - } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { - _.label = op[1]; - break; - } - if (op[0] === 6 && _.label < t[1]) { - _.label = t[1]; - t = op; - break; - } - if (t && _.label < t[2]) { - _.label = t[2]; - _.ops.push(op); - break; - } - if (t[2]) - _.ops.pop(); - _.trys.pop(); - continue; - } - op = body.call(thisArg, _); - } - catch (e) { - op = [6, e]; - y = 0; - } - finally { - f = t = 0; - } - if (op[0] & 5) - throw op[1]; - return { value: op[0] ? op[1] : void 0, done: true }; - } - } - function __createBinding(o, m, k, k2) { - if (k2 === undefined) - k2 = k; - o[k2] = m[k]; - } - function __exportStar(m, exports) { - for (var p in m) - if (p !== "default" && !exports.hasOwnProperty(p)) - exports[p] = m[p]; - } - function __values(o) { - var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; - if (m) - return m.call(o); - if (o && typeof o.length === "number") - return { - next: function () { - if (o && i >= o.length) - o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); - } - function __read(o, n) { - var m = typeof Symbol === "function" && o[Symbol.iterator]; - if (!m) - return o; - var i = m.call(o), r, ar = [], e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) - ar.push(r.value); - } - catch (error) { - e = { error: error }; - } - finally { - try { - if (r && !r.done && (m = i["return"])) - m.call(i); - } - finally { - if (e) - throw e.error; - } - } - return ar; - } - function __spread() { - for (var ar = [], i = 0; i < arguments.length; i++) - ar = ar.concat(__read(arguments[i])); - return ar; - } - function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) - s += arguments[i].length; - for (var r = Array(s), k = 0, i = 0; i < il; i++) - for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) - r[k] = a[j]; - return r; - } - ; - function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); - } - function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) - throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; - function verb(n) { if (g[n]) - i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } - function resume(n, v) { try { - step(g[n](v)); - } - catch (e) { - settle(q[0][3], e); - } } - function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } - function fulfill(value) { resume("next", value); } - function reject(value) { resume("throw", value); } - function settle(f, v) { if (f(v), q.shift(), q.length) - resume(q[0][0], q[0][1]); } - } - function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; - function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } - } - function __asyncValues(o) { - if (!Symbol.asyncIterator) - throw new TypeError("Symbol.asyncIterator is not defined."); - var m = o[Symbol.asyncIterator], i; - return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); - function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } - function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); } - } - function __makeTemplateObject(cooked, raw) { - if (Object.defineProperty) { - Object.defineProperty(cooked, "raw", { value: raw }); - } - else { - cooked.raw = raw; - } - return cooked; - } - ; - function __importStar(mod) { - if (mod && mod.__esModule) - return mod; - var result = {}; - if (mod != null) - for (var k in mod) - if (Object.hasOwnProperty.call(mod, k)) - result[k] = mod[k]; - result.default = mod; - return result; - } - function __importDefault(mod) { - return (mod && mod.__esModule) ? mod : { default: mod }; - } - function __classPrivateFieldGet(receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); - } - function __classPrivateFieldSet(receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; - } - - exports.ɵa = /** @class */ (function () { - function NgCastComponent(ngCastService) { - this.ngCastService = ngCastService; - this.videoImage = ''; - this.imageOffline = false; - this.srcImageOffline = ''; - } - NgCastComponent.prototype.ngOnInit = function () { - this.window = window; - var ngCastService = this.ngCastService; - this.window['__onGCastApiAvailable'] = function (isAvailable) { - if (isAvailable) { - ngCastService.initializeCastApi(); - } - }; - this.castingStatus = this.ngCastService.getStatus(); - }; - NgCastComponent.prototype.openSession = function () { - this.ngCastService.discoverDevices(); - }; - NgCastComponent.prototype.closeSession = function () { - this.ngCastService.discoverDevices(); - }; - return NgCastComponent; - }()); - __decorate([ - core.Input() - ], exports.ɵa.prototype, "videoImage", void 0); - __decorate([ - core.Input() - ], exports.ɵa.prototype, "imageOffline", void 0); - __decorate([ - core.Input() - ], exports.ɵa.prototype, "srcImageOffline", void 0); - exports.ɵa = __decorate([ - core.Component({ - selector: 'ng-cast', - template: "
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", - styles: ["body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] - }) - ], exports.ɵa); - - exports.NgCastService = /** @class */ (function () { + var NgCastService = /** @class */ (function () { function NgCastService() { var _this = this; this.window = window; @@ -418,26 +84,254 @@ }; return NgCastService; }()); - exports.NgCastService = __decorate([ - core.Injectable() - ], exports.NgCastService); + NgCastService.decorators = [ + { type: core.Injectable } + ]; + NgCastService.ctorParameters = function () { return []; }; + + var ScheduleDto = /** @class */ (function () { + function ScheduleDto(data) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) { + this[property] = data[property]; + } + } + } + } + ScheduleDto.fromJS = function (data) { + data = typeof data === 'object' ? data : {}; + var result = new ScheduleDto(); + result.init(data); + return result; + }; + ScheduleDto.prototype.init = function (data) { + if (data) { + this.id = data['id']; + this.tenant = data['tenant']; + this.name = data['name']; + this.description = data['description']; + this.url = data['url']; + this.duration = data['duration']; + this.actualStart = data['actualStart']; + this.realEnd = data['realEnd']; + this.isActive = data['isActive']; + } + }; + ScheduleDto.prototype.toJSON = function (data) { + data = typeof data === 'object' ? data : {}; + data['id'] = this.id; + data['tenant'] = this.tenant; + data['name'] = this.name; + data['description'] = this.description; + data['url'] = this.url; + data['duration'] = this.duration; + data['actualStart'] = this.actualStart; + data['realEnd'] = this.realEnd; + data['isActive'] = this.isActive; + return data; + }; + return ScheduleDto; + }()); + + var NgCastComponent = /** @class */ (function () { + function NgCastComponent(ngCastService) { + this.ngCastService = ngCastService; + this.videoImage = ''; + this.imageOffline = false; + this.premium = false; + this.srcImageOffline = ''; + this.currentStream = { + type: 'dash', + label: 'DASH: Media Stream test', + source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd' + }; + this.api = new core$1.VgAPI(); + this.isDebug = false; + this.paused = false; + this.streams = [ + { + type: 'dash', + label: 'DASH: Media Stream test', + source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd' + } + ]; + this.playlist = []; + this.play = false; + this.isHidden = false; + this.isShow = true; + this.currentIndex = 0; + this.video = new ScheduleDto(); + this.appBaseUrl = ''; + } + NgCastComponent.prototype.ngOnInit = function () { + this.window = window; + this.currentStream = this.streams[0]; + var ngCastService = this.ngCastService; + this.window['__onGCastApiAvailable'] = function (isAvailable) { + if (isAvailable) { + ngCastService.initializeCastApi(); + } + }; + this.castingStatus = this.ngCastService.getStatus(); + }; + NgCastComponent.prototype.onPlayerReady = function (api) { + this.api = api; + this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this)); + }; + NgCastComponent.prototype.setBitrate = function (option) { + switch (this.currentStream.type) { + case 'dash': + this.vgDash.setBitrate(option); + break; + } + }; + NgCastComponent.prototype.nextVideo = function () { + this.currentIndex++; + if (this.currentIndex === this.playlist.length) { + this.currentIndex = 0; + } + this.video = this.playlist[this.currentIndex]; + }; + NgCastComponent.prototype.getPaused = function () { + var _this = this; + if (this.media && this.media.nativeElement) { + this.paused = this.media.nativeElement.paused; + return this.media.nativeElement.paused; + } + else { + setTimeout(function () { + return _this.getPaused(); + }, 2000); + } + }; + NgCastComponent.prototype.pause = function () { + this.media.nativeElement.pause(); + this.getPaused(); + }; + NgCastComponent.prototype.openSession = function () { + this.ngCastService.discoverDevices(); + }; + NgCastComponent.prototype.closeSession = function () { + this.ngCastService.discoverDevices(); + }; + NgCastComponent.prototype.tryAgain = function () { + var _this = this; + this.imageOffline = true; + this.isHidden = true; + console.log('loading...'); + setTimeout(function () { + _this.getVideos(); + }, 500); + }; + NgCastComponent.prototype.getVideos = function () { + if (this.playlist && this.playlist.length > 0) { + this.imageOffline = false; + this.video = this.playlist[this.currentIndex]; + this.getPosition(this.video); + } + else { + this.video = new ScheduleDto(); + this.tryAgain(); + } + }; + NgCastComponent.prototype.getPosition = function (result) { + var _this = this; + setTimeout(function () { + var vid = document.getElementById('video_element'); + vid.load(); + var now = new Date(); + var currentTime = Math.abs(now.getTime() - new Date(_this.video.actualStart).getTime()); + console.log('Temos no player: ' + result.url); + console.log('Início em: ' + currentTime); + _this.video.url = result.url; + vid['currentTime'] = currentTime / 1000; + var promise = vid.play(); + if (promise !== undefined) { + promise.then(function (_) { + // Autoplay started! + console.log('Estamos ao vivo!'); + }).catch(function () { + // Autoplay was prevented. + // Show a "Play" button so that user can start playback. + _this.play = true; + }); + } + }, 1000); + }; + NgCastComponent.prototype.getMuted = function () { + return this.media && this.media.nativeElement && this.media.nativeElement.muted || false; + }; + NgCastComponent.prototype.getMaximized = function () { + return this.api && this.api.fsAPI && this.api.fsAPI.isFullscreen && this.api.fsAPI.isFullscreen || false; + }; + NgCastComponent.prototype.toggleSound = function () { + this.media.nativeElement.muted = !this.media.nativeElement.muted; + }; + NgCastComponent.prototype.toggleMaximize = function () { + this.api.fsAPI.toggleFullscreen(this.media); + }; + NgCastComponent.prototype.showVideoControls = function () { + this.isHidden = false; + this.isShow = true; + }; + NgCastComponent.prototype.hideVideoControls = function () { + this.isHidden = true; + this.isShow = false; + }; + return NgCastComponent; + }()); + NgCastComponent.decorators = [ + { type: core.Component, args: [{ + selector: 'ng-cast', + template: "
\n \n \n \n \n \n
\n \n \n
AGORA
\n
\n
\n \n \n \n \n
\n
\n \n \"TV\n \n\n\n
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", + styles: ["#video-container{background-color:#272c34;margin:0 auto;z-index:-1}#video-container vg-scrub-bar-current-time .background{background-color:red}#video-container .hidden{display:none}#video-container .show{display:block}#video-container .video-controls{background:rgba(0,0,0,.5);bottom:0;height:45px;left:0;position:absolute;right:0;transition:all .2s ease}#video-container .video-controls.hide{opacity:0;pointer-events:none}#video-container .video-progress{align-items:right;height:8.4px;position:relative}#video-container .video-progress #seek-tooltip{position:absolute}@media screen and (-webkit-min-device-pixel-ratio:0){#video-container .video-progress input[type=range]{-webkit-appearance:none;background-color:var(--youtube-red);overflow:hidden}#video-container .video-progress input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;color:var(--youtube-red);height:10px;margin-top:-1px}#video-container .video-progress input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--youtube-red);cursor:ew-resize;height:10px;width:10px}}#video-container .video-progress input[type=range]{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-moz-range-progress,#video-container .video-progress input[type=range]::-moz-range-track{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-ms-fill-lower,#video-container .video-progress input[type=range]::-ms-fill-upper{background-color:var(--youtube-red)}#video-container progress{-moz-appearance:none;-webkit-appearance:none;appearance:none;border-radius:2px;height:.5vh;pointer-events:none;position:absolute;top:0;width:100%}#video-container .buttons .video-control{align-items:center;background:none;border:2px solid #fff;border-radius:16px;color:#fff;display:flex;height:32px;justify-content:center;width:32px}#video-container .buttons .video-control i{color:#fff;line-height:16px}#video-container .buttons .video-control-paused{bottom:8px;left:1vw;position:absolute;z-index:1000}#video-container .buttons .video-control-muted{bottom:8px;position:absolute;right:5vw;z-index:1000}#video-container .buttons .video-control-maximized{bottom:8px;position:absolute;right:1vw;z-index:1000}#video-container progress::-webkit-progress-bar{background-color:var(--youtube-red);border-radius:2px}#video-container progress::-webkit-progress-value{background:#fff;border-radius:2px}#video-container progress::-moz-progress-bar{background:#fff;border:1px solid #fff}#video-container .seek{cursor:pointer;height:.5vh;margin:0;position:absolute;top:0;width:100%}#video-container .seek-tooltip{background-color:var(--youtube-red);color:#fff;content:attr(data-title);display:block;font-size:12px;font-weight:700;margin-left:5vw;padding:3px;position:absolute;top:10px}.playlist-item li{color:#fff}.kt-content.kt-grid__item.kt-grid__item--fluid.kt-grid.kt-grid--hor{background-color:#272c34}#kt_header_menu_wrapper{display:none}.kt-header__bottom{display:none!important}.player-wrapper{margin:auto;max-width:500px}.player-wrapper video{width:100%}ul{padding:0}ul li.playlist-item{background:#673ab7;cursor:pointer;list-style:none;margin-bottom:2px;padding:10px}ul li.playlist-item.selected{background-color:#ccc}body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] + },] } + ]; + NgCastComponent.ctorParameters = function () { return [ + { type: NgCastService } + ]; }; + NgCastComponent.propDecorators = { + vgDash: [{ type: core.ViewChild, args: [vgDash.VgDASH, { static: false },] }], + media: [{ type: core.ViewChild, args: ['media', { static: false },] }], + videoImage: [{ type: core.Input }], + imageOffline: [{ type: core.Input }], + premium: [{ type: core.Input }], + srcImageOffline: [{ type: core.Input }], + currentStream: [{ type: core.Input }], + isDebug: [{ type: core.Input }], + paused: [{ type: core.Input }], + streams: [{ type: core.Input }], + playlist: [{ type: core.Input }], + play: [{ type: core.Input }], + isHidden: [{ type: core.Input }], + isShow: [{ type: core.Input }], + currentIndex: [{ type: core.Input }], + video: [{ type: core.Input }], + appBaseUrl: [{ type: core.Input }] + }; - exports.NgCastModule = /** @class */ (function () { + var NgCastModule = /** @class */ (function () { function NgCastModule() { } return NgCastModule; }()); - exports.NgCastModule = __decorate([ - core.NgModule({ - schemas: [core.CUSTOM_ELEMENTS_SCHEMA], - imports: [ - common.CommonModule - ], - exports: [exports.ɵa], - providers: [exports.NgCastService], - declarations: [exports.ɵa] - }) - ], exports.NgCastModule); + NgCastModule.decorators = [ + { type: core.NgModule, args: [{ + schemas: [core.CUSTOM_ELEMENTS_SCHEMA], + imports: [ + common.CommonModule, + core$1.VgCoreModule, + controls.VgControlsModule, + streaming.VgStreamingModule, + buffering.VgBufferingModule, + overlayPlay.VgOverlayPlayModule, + ], + exports: [NgCastComponent], + providers: [NgCastService], + declarations: [NgCastComponent] + },] } + ]; "use strict"; /** @const {string} Media source root URL */ @@ -1503,6 +1397,10 @@ * Generated bundle index. Do not edit. */ + exports.NgCastModule = NgCastModule; + exports.NgCastService = NgCastService; + exports.ɵa = NgCastComponent; + Object.defineProperty(exports, '__esModule', { value: true }); }))); diff --git a/dist/bundles/thinkam.net-ng-cast.umd.js.map b/dist/bundles/thinkam.net-ng-cast.umd.js.map index c816343..c84c2f5 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.js.map +++ b/dist/bundles/thinkam.net-ng-cast.umd.js.map @@ -1 +1 @@ -{"version":3,"file":"thinkam.net-ng-cast.umd.js","sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeCastPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n globalThis.CastPlayer.setupRemotePlayer();\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = () => {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n if (typeof localPlayer.stop === \"function\")\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["NgCastComponent","tslib_1.__decorate","Input","Component","NgCastService","Subject","Injectable","NgCastModule","NgModule","CUSTOM_ELEMENTS_SCHEMA","CommonModule"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"thinkam.net-ng-cast.umd.js","sources":["../../shared/ng-cast.service.ts","../../dto/schedule-dto.ts","../../ng-cast.component.ts","../../ng.cast.module.ts","../../cast-videos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeCastPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n globalThis.CastPlayer.setupRemotePlayer();\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { TenantDto } from './tenant-dto';\n\nexport interface IScheduleDto {\n id: string | undefined;\n tenant: TenantDto | undefined;\n name: string | undefined;\n description: string | undefined;\n url: string | undefined;\n duration: number | undefined;\n actualStart: Date;\n realEnd?: Date | undefined;\n isActive: boolean | undefined;\n}\n\nexport class ScheduleDto implements IScheduleDto {\n id: string | undefined;\n tenant: TenantDto | undefined;\n name: string | undefined;\n description: string | undefined;\n url: string | undefined;\n duration: number | undefined;\n actualStart!: Date;\n realEnd?: Date | undefined;\n isActive: boolean | undefined;\n\n constructor(data?: IScheduleDto) {\n if (data) {\n for (let property in data) {\n if (data.hasOwnProperty(property)) {\n (this)[property] = (data)[property];\n }\n }\n }\n }\n\n static fromJS(data: any): ScheduleDto {\n data = typeof data === 'object' ? data : {};\n let result = new ScheduleDto();\n result.init(data);\n return result;\n }\n\n init(data?: any) {\n if (data) {\n this.id = data['id'];\n this.tenant = data['tenant'];\n this.name = data['name'];\n this.description = data['description'];\n this.url = data['url'];\n this.duration = data['duration'];\n this.actualStart = data['actualStart'];\n this.realEnd = data['realEnd'];\n this.isActive = data['isActive'];\n }\n }\n\n toJSON(data?: any) {\n data = typeof data === 'object' ? data : {};\n data['id'] = this.id;\n data['tenant'] = this.tenant;\n data['name'] = this.name;\n data['description'] = this.description;\n data['url'] = this.url;\n data['duration'] = this.duration;\n data['actualStart'] = this.actualStart;\n data['realEnd'] = this.realEnd;\n data['isActive'] = this.isActive;\n return data;\n }\n}\n","import { Component, Input, OnInit, ViewChild, ElementRef } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\nimport { VgDASH } from 'videogular2/compiled/src/streaming/vg-dash/vg-dash';\nimport { IDRMLicenseServer } from 'videogular2/compiled/src/streaming/streaming';\nimport { VgAPI, BitrateOption } from 'videogular2/compiled/core';\n\nimport { ScheduleDto } from './dto/schedule-dto';\n\nexport interface IMediaStream {\n type: 'vod' | 'dash';\n source: string;\n label: string;\n token?: string;\n licenseServers?: IDRMLicenseServer;\n}\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n @ViewChild(VgDASH, { static: false }) vgDash!: VgDASH;\n @ViewChild('media', { static: false }) media!: ElementRef;\n\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() premium = false;\n @Input() srcImageOffline = '';\n\n @Input() currentStream: IMediaStream = {\n type: 'dash',\n label: 'DASH: Media Stream test',\n source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd'\n };\n\n api: VgAPI = new VgAPI();\n\n @Input() isDebug = false;\n\n @Input() paused = false;\n\n @Input() streams: IMediaStream[] = [\n {\n type: 'dash',\n label: 'DASH: Media Stream test',\n source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd'\n }\n ];\n\n @Input() playlist: Array = [];\n\n @Input() play = false;\n @Input() isHidden = false;\n @Input() isShow = true;\n\n @Input() currentIndex = 0;\n @Input() video: ScheduleDto = new ScheduleDto();\n @Input() appBaseUrl: String = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n this.currentStream = this.streams[0];\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n onPlayerReady(api: VgAPI) {\n this.api = api;\n\n this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this));\n }\n\n setBitrate(option: BitrateOption) {\n switch (this.currentStream.type) {\n case 'dash':\n this.vgDash.setBitrate(option);\n break;\n }\n }\n\n nextVideo() {\n this.currentIndex++;\n\n if (this.currentIndex === this.playlist.length) {\n this.currentIndex = 0;\n }\n\n this.video = this.playlist[this.currentIndex];\n }\n\n getPaused() {\n if (this.media && this.media.nativeElement) {\n this.paused = this.media.nativeElement.paused;\n return this.media.nativeElement.paused;\n } else {\n setTimeout(() => {\n return this.getPaused();\n }, 2000);\n }\n }\n\n pause(): void {\n this.media.nativeElement.pause();\n this.getPaused();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n tryAgain() {\n this.imageOffline = true;\n this.isHidden = true;\n console.log('loading...');\n\n setTimeout(() => {\n this.getVideos();\n }, 500);\n }\n\n getVideos(): void {\n if (this.playlist && this.playlist.length > 0) {\n this.imageOffline = false;\n this.video = this.playlist[this.currentIndex];\n\n this.getPosition(this.video);\n } else {\n this.video = new ScheduleDto();\n this.tryAgain();\n }\n }\n\n getPosition(result: ScheduleDto) {\n setTimeout(() => {\n let vid: any = document.getElementById('video_element');\n vid.load();\n\n const now = new Date();\n const currentTime = Math.abs(now.getTime() - new Date(this.video.actualStart).getTime());\n\n console.log('Temos no player: ' + result.url);\n console.log('Início em: ' + currentTime);\n\n this.video.url = result.url;\n vid['currentTime'] = currentTime / 1000;\n\n let promise = vid.play();\n if (promise !== undefined) {\n promise.then((_: any) => {\n // Autoplay started!\n console.log('Estamos ao vivo!');\n }).catch(() => {\n // Autoplay was prevented.\n // Show a \"Play\" button so that user can start playback.\n this.play = true;\n });\n }\n }, 1000);\n }\n\n getMuted(): boolean {\n return this.media && this.media.nativeElement && this.media.nativeElement.muted || false;\n }\n\n getMaximized(): boolean {\n return this.api && this.api.fsAPI && this.api.fsAPI.isFullscreen && this.api.fsAPI.isFullscreen || false;\n }\n\n toggleSound(): void {\n this.media.nativeElement.muted = !this.media.nativeElement.muted;\n }\n\n toggleMaximize(): void {\n this.api.fsAPI.toggleFullscreen(this.media);\n }\n\n showVideoControls(): void {\n this.isHidden = false;\n this.isShow = true;\n }\n\n hideVideoControls(): void {\n this.isHidden = true;\n this.isShow = false;\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\nimport { VgCoreModule } from 'videogular2/compiled/core';\nimport { VgControlsModule } from 'videogular2/compiled/controls';\nimport { VgStreamingModule } from 'videogular2/compiled/streaming';\nimport { VgBufferingModule } from 'videogular2/compiled/buffering';\nimport { VgOverlayPlayModule } from 'videogular2/compiled/overlay-play';\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule,\n VgCoreModule,\n VgControlsModule,\n VgStreamingModule,\n VgBufferingModule,\n VgOverlayPlayModule,\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = () => {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n if (typeof localPlayer.stop === \"function\")\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["Subject","Injectable","VgAPI","Component","ViewChild","VgDASH","Input","NgModule","CUSTOM_ELEMENTS_SCHEMA","CommonModule","VgCoreModule","VgControlsModule","VgStreamingModule","VgBufferingModule","VgOverlayPlayModule"],"mappings":"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"} \ No newline at end of file diff --git a/dist/bundles/thinkam.net-ng-cast.umd.min.js b/dist/bundles/thinkam.net-ng-cast.umd.min.js index 7c262cd..0a0e237 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.min.js +++ b/dist/bundles/thinkam.net-ng-cast.umd.min.js @@ -1,16 +1,2 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("@angular/common"),require("rxjs")):"function"==typeof define&&define.amd?define("@thinkam.net/ng-cast",["exports","@angular/core","@angular/common","rxjs"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).thinkam=e.thinkam||{},e.thinkam.net=e.thinkam.net||{},e.thinkam.net["ng-cast"]={}),e.ng.core,e.ng.common,e.rxjs)}(this,(function(e,t,i,n){"use strict"; -/*! ***************************************************************************** - Copyright (c) Microsoft Corporation. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - ***************************************************************************** */function a(e,t,i,n){var a,o=arguments.length,r=o<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,i):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)r=Reflect.decorate(e,t,i,n);else for(var d=e.length-1;d>=0;d--)(a=e[d])&&(r=(o<3?a(r):o>3?a(t,i,r):a(t,i))||r);return o>3&&r&&Object.defineProperty(t,i,r),r}e.ɵa=function(){function e(e){this.ngCastService=e,this.videoImage="",this.imageOffline=!1,this.srcImageOffline=""}return e.prototype.ngOnInit=function(){this.window=window;var e=this.ngCastService;this.window.__onGCastApiAvailable=function(t){t&&e.initializeCastApi()},this.castingStatus=this.ngCastService.getStatus()},e.prototype.openSession=function(){this.ngCastService.discoverDevices()},e.prototype.closeSession=function(){this.ngCastService.discoverDevices()},e}(),a([t.Input()],e.ɵa.prototype,"videoImage",void 0),a([t.Input()],e.ɵa.prototype,"imageOffline",void 0),a([t.Input()],e.ɵa.prototype,"srcImageOffline",void 0),e.ɵa=a([t.Component({selector:"ng-cast",template:'
\n
\x3c!-- Put Your Image Width --\x3e\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\nTV Offline\n',styles:['body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}']})],e.ɵa),e.NgCastService=function(){function e(){var e=this;this.window=window,this.status={casting:!1},this.onInitSuccess=function(){console.log("GCast initialization success")},this.onError=function(e){console.log("GCast initialization failed",e)},this.discoverDevices=function(){var t=e,i=new n.Subject;return e.cast.requestSession((function(e){t.session=e,t.setCasting(!0),i.next("CONNECTED")}),(function(e){t.setCasting(!1),"cancel"===e.code?(t.session=void 0,i.next("CANCEL")):console.error("Error selecting a cast device",e)})),i},this.onMediaDiscovered=function(e){var t=window.document.createElement("script");return t.setAttribute("type","text/javascript"),t.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"),window.document.body.appendChild(t),globalThis.CastPlayer.mediaJSON.categories=e,globalThis.CastPlayer.addMediaContents()},this.play=function(){e.currentMedia.play(null)},this.pause=function(){e.currentMedia.pause(null)},this.stop=function(){e.currentMedia.stop(null)},this.onMediaError=function(e){console.error("Error launching media",e)},globalThis.CastPlayer.mediaJSON={categories:[]}}return e.prototype.initializeCastApi=function(){var e=this;this.cast=this.window.chrome.cast;var t=new this.cast.SessionRequest("4F8B3483"),i=new this.cast.ApiConfig(t,(function(){}),(function(t){e.cast.ReceiverAvailability.AVAILABLE}));this.cast.initialize(i,this.onInitSuccess,this.onError)},e.prototype.initialize=function(e){e&&(globalThis.CastPlayer.initializeUI(),globalThis.CastPlayer.setupLocalPlayer(),globalThis.CastPlayer.initializeCastPlayer())},e.prototype.setCasting=function(e){this.status.casting=e,globalThis.CastPlayer.setupRemotePlayer()},e.prototype.getStatus=function(){return this.status},e}(),e.NgCastService=a([t.Injectable()],e.NgCastService),e.NgCastModule=function(){},e.NgCastModule=a([t.NgModule({schemas:[t.CUSTOM_ELEMENTS_SCHEMA],imports:[i.CommonModule],exports:[e.ɵa],providers:[e.NgCastService],declarations:[e.ɵa]})],e.NgCastModule);var o=600,r=100,d="IDLE",l="BUFFERING",s="LOADED",u="PLAYING",c="PAUSED",p="ERROR",m=function(){this.playerHandler=new g(this),this.playerState=d,this.playerStateBeforeSwitch=null,this.remotePlayer=null,this.remotePlayerController=null,this.currentMediaTime=0,this.mediaDuration=-1,this.timer=null,this.incrementMediaTimeHandler=this.incrementMediaTime.bind(this),this.seekMediaListener=this.seekMedia.bind(this),this.currentMediaIndex=0,this.mediaContents=null,this.fullscreen=!1,this.mediaInfo=null,this.whenSkippable=null,this.liveSeekableRange=null,this.isLiveContent=!1,this.mediaJSON={categories:[]}};m.prototype.initializeCastPlayer=function(){var e={receiverApplicationId:"4F8B3483"};e.autoJoinPolicy=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,cast.framework.CastContext.getInstance().setOptions(e),y.remotePlayer=new cast.framework.RemotePlayer,y.remotePlayerController=new cast.framework.RemotePlayerController(y.remotePlayer),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,y.switchPlayer.bind(y))},m.prototype.switchPlayer=function(){y.stopProgressTimer(),y.resetVolumeSlider(),y.playerHandler.stop(),y.playerState=d,cast&&cast.framework&&y.remotePlayer.isConnected?y.setupRemotePlayer():y.setupLocalPlayer()};var g=function(e){this.target={},this.setTarget=function(e){this.target=e},this.play=function(){e.playerState===u||e.playerState===c||e.playerState===s?(this.target.play(),e.playerState=u,document.getElementById("play").style.display="none",document.getElementById("pause").style.display="block",this.updateDisplayMessage()):this.load(e.currentMediaIndex)},this.updateDisplayMessage=function(){this.target.updateDisplayMessage()},this.pause=function(){this.target.pause(),e.playerState=c,document.getElementById("play").style.display="block",document.getElementById("pause").style.display="none"},this.stop=function(){e.playerState=d,this.target.stop()},this.load=function(t){void 0===t&&(t=null),t||(t=e.currentMediaIndex),e.playerState=l,this.target.load(t)},this.isMediaLoaded=function(e){return this.target.isMediaLoaded(e)},this.prepareToPlay=function(){e.mediaDuration=this.getMediaDuration(),e.playerHandler.updateDurationDisplay(),e.playerState=s,this.play(),e.startProgressTimer(),this.updateDisplay()},this.loaded=function(){e.currentMediaDuration=this.getMediaDuration(),e.updateMediaDuration(),e.playerState=s,e.currentMediaTime>0&&this.seekTo(e.currentMediaTime),this.play(),e.startProgressTimer(),this.updateDisplayMessage()},this.getCurrentMediaTime=function(){return this.target.getCurrentMediaTime()},this.getMediaDuration=function(){return this.target.getMediaDuration()},this.updateDisplay=function(){this.currentMediaTime=this.target.getCurrentMediaTime(),this.mediaDuration=this.target.getMediaDuration(),this.target.updateDisplay()},this.updateCurrentTimeDisplay=function(){this.target.updateCurrentTimeDisplay()},this.setTimeString=function(e,t){this.target.setTimeString(e,t)},this.setVolume=function(e){this.target.setVolume(e)},this.mute=function(){this.target.mute(),document.getElementById("audio_on").style.display="none",document.getElementById("audio_off").style.display="block"},this.unMute=function(){this.target.unMute(),document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},this.isMuted=function(){return this.target.isMuted()},this.seekTo=function(e){this.target.seekTo(e)}};m.prototype.setupLocalPlayer=function(){var e=document.getElementById("video_element");e.addEventListener("loadeddata",y.onMediaLoadedLocally.bind(y));var t={play:function(){e.play(),document.getElementById("video_image").style.display="none",e.style.display="block"},pause:function(){e.pause()},stop:function(){"function"==typeof e.stop&&e.stop()}};t.load=function(t){e.src=y.mediaContents[t].sources[0],e.load()}.bind(y),t.getCurrentMediaTime=function(){return e.currentTime},t.getMediaDuration=function(){return e.duration},t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none"},t.setVolume=function(t){e.volume=t0&&y.playerHandler.play()},m.prototype.setupRemotePlayer=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,function(){y.remotePlayer.isPaused?y.playerHandler.pause():y.playerHandler.play()}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,function(){y.remotePlayer.isMuted?y.playerHandler.mute():y.playerHandler.unMute()}.bind(y)),y.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,function(){var e=y.remotePlayer.volumeLevel*r,t=document.getElementById("audio_bg_level");t.style.height=e+"px",t.style.marginTop=-e+"px"}.bind(y));var t={};t.play=function(){y.remotePlayer.isPaused&&y.remotePlayerController.playOrPause(),document.getElementById("video_image").style.display="block",document.getElementById("video_element").style.display="none"}.bind(y),t.pause=function(){y.remotePlayer.isPaused||y.remotePlayerController.playOrPause()}.bind(y),t.stop=function(){y.remotePlayerController.stop()}.bind(y),t.load=function(t){console.log("Loading..."+y.mediaContents[t].title);var i=new chrome.cast.media.MediaInfo(y.mediaContents[t].sources[0],"video/mp4");i.metadata=new chrome.cast.media.GenericMediaMetadata,i.metadata.metadataType=chrome.cast.media.MetadataType.GENERIC,i.metadata.title=y.mediaContents[t].title,i.metadata.images=[{url:""+y.mediaContents[t].thumb}];var n=new chrome.cast.media.LoadRequest(i);e.loadMedia(n).then(y.playerHandler.loaded.bind(y.playerHandler),function(e){y.playerState=p,console.log("Remote media load error: "+m.getErrorMessage(e))}.bind(y))}.bind(y),t.getCurrentMediaTime=function(){return y.remotePlayer.currentTime}.bind(y),t.getMediaDuration=function(){return y.remotePlayer.duration}.bind(y),t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="block",document.getElementById("playerstatebg").style.display="block",document.getElementById("video_image_overlay").style.display="block",document.getElementById("playerstate").innerHTML=y.mediaContents[y.currentMediaIndex].title+" "+y.playerState+" on "+e.getCastDevice().friendlyName}.bind(y),t.setVolume=function(e){var t=y.remotePlayer.volumeLevel,i=document.getElementById("audio_bg_level");if(en&&(e=n+(pos-n)/2),i.style.height=e+"px",i.style.marginTop=-e+"px",t=e/r}else t=1;y.remotePlayer.volumeLevel=t,y.remotePlayerController.setVolumeLevel()}.bind(y),t.mute=function(){y.remotePlayer.isMuted||y.remotePlayerController.muteOrUnmute()}.bind(y),t.unMute=function(){y.remotePlayer.isMuted&&y.remotePlayerController.muteOrUnmute()}.bind(y),t.isMuted=function(){return y.remotePlayer.isMuted}.bind(y),t.seekTo=function(e){y.remotePlayer.currentTime=e,y.remotePlayerController.seek()}.bind(y),y.playerHandler.setTarget(t),y.remotePlayer.isMuted&&y.playerHandler.mute();var i=y.remotePlayer.volumeLevel*r,n=document.getElementById("audio_bg_level");n.style.height=i+"px",n.style.marginTop=-i+"px",y.hideFullscreenButton(),y.playerHandler.play()},m.prototype.onMediaLoadedLocally=function(){document.getElementById("video_element").currentTime=y.currentMediaTime,y.playerHandler.loaded()},m.prototype.selectMedia=function(e){console.log("Media index selected: "+e),y.currentMediaIndex=e,y.playerHandler.currentMediaInfo=void 0,document.getElementById("video_image").src=""+y.mediaContents[e].thumb,document.getElementById("progress_indicator").style.marginLeft="0px",document.getElementById("progress").style.width="0px";var t=document.getElementById("seekable_window"),i=document.getElementById("unseekable_overlay");t.style.width=o,i.style.width="0px",y.stopProgressTimer(),y.currentMediaTime=0,y.playerHandler.setTimeString(document.getElementById("currentTime"),0),y.playerHandler.setTimeString(document.getElementById("duration"),0),y.playerState=d,y.playerHandler.play()},m.prototype.seekMedia=function(e){if(null==y.mediaDuration||cast.framework.CastContext.getInstance().getCurrentSession()&&!y.remotePlayer.canSeek)console.log("Error - Not seekable");else if(!y.isLiveContent||y.liveSeekableRange){var t=parseInt(e.offsetX,10),i=document.getElementById("progress_indicator"),n=document.getElementById("progress"),a=0,r=0,d=0;"progress_indicator"==e.currentTarget.id?(a=parseInt(y.currentMediaTime+y.mediaDuration*t/o,10),r=parseInt(i.style.marginLeft,10)+t,d=parseInt(n.style.width,10)+t):(a=parseInt(t*y.mediaDuration/o,10),r=t,d=t),y.playerState!==u&&y.playerState!==c||(y.currentMediaTime=a,n.style.width=d+"px",i.style.marginLeft=r+"px"),y.isLiveContent&&(a+=y.mediaInfo.metadata.sectionStartTimeInMedia),y.playerHandler.seekTo(a)}else console.log("Live content has no seekable range.")},m.prototype.setVolume=function(e){var t=document.getElementById("audio_bg_level"),i=0;i="audio_bg_track"===e.currentTarget.id?r-parseInt(e.offsetY,10):parseInt(t.clientHeight,10)-parseInt(e.offsetY,10),y.playerHandler.setVolume(i)},m.prototype.startProgressTimer=function(){y.stopProgressTimer(),y.timer=setInterval(y.incrementMediaTimeHandler,1e3)},m.prototype.stopProgressTimer=function(){y.timer&&(clearInterval(y.timer),y.timer=null)},m.prototype.incrementMediaTime=function(){y.currentMediaTime=y.playerHandler.getCurrentMediaTime(),y.currentMediaDuration=y.playerHandler.getMediaDuration(),y.playerState===u&&(y.currentMediaTime0)var t=Math.floor(o*y.currentMediaTime/y.currentMediaDuration);e.style.width=t+"px",document.getElementById("progress_indicator").style.marginLeft=-621+t+"px",t>=o&&y.endPlayback()},m.prototype.endPlayback=function(){y.currentMediaTime=0,y.stopProgressTimer(),y.playerState=d,y.playerHandler.updateDisplay();var e=document.getElementById("play");e&&e.style&&e.display&&(e.style.display="block");var t=document.getElementById("pause");t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.getMediaTimeString=function(e){if(null==e||null==e)return null;var t=!1;e<0&&(t=!0,e*=-1);var i=Math.floor(e/3600),n=Math.floor((e-3600*i)/60),a=Math.floor(e-3600*i-60*n);return i<10&&(i="0"+i),n<10&&(n="0"+n),a<10&&(a="0"+a),(t?"-":"")+i+":"+n+":"+a},m.prototype.getClockTimeString=function(e){if(!e)return"0:00:00";var t=new Date(1e3*e),i=t.getHours(),n=t.getMinutes(),a=t.getSeconds(),o=i>=12?"PM":"AM";return(i=(i%=12)||12)+":"+(n=("0"+n).slice(-2))+":"+(a=("0"+a).slice(-2))+" "+o},m.prototype.updateAdMarkers=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e){var t=e.getMediaSession();if(t){var i=t.media;if(i){var n=i.breaks,a=i.duration;if(n)for(var o=0;oa&&r.isEmbedded))if(!document.getElementById("ad"+r.position))document.getElementById("progress").innerHTML+='
'}}}}},m.prototype.removeAdMarkers=function(){document.querySelectorAll(".adMarker").forEach((function(e){e.remove()}))},m.prototype.adPositionToMargin=function(e,t){return-1==e||e>t?o:o*e/t},m.prototype.onBreakClipIdChanged=function(){var e=document.getElementById("skip");e&&e.style&&e.style.display&&(e.style.display="none")},m.prototype.isPlayingBreak=function(e){y.enableProgressBar(!e)},m.prototype.onWhenSkippableChanged=function(e){y.whenSkippable=e},m.prototype.onCurrentBreakClipTimeChanged=function(e){var t=document.getElementById("skip");null==y.whenSkippable||y.whenSkippable<0?t&&t.style&&t.style.display&&(t.style.display="none"):void 0!==y.whenSkippable||e>=y.whenSkippable?t&&t.style&&t.style.display&&(t.style.display="block"):t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.skipAd=function(){y.remotePlayerController.skipAd()},m.prototype.enableProgressBar=function(e){var t=document.getElementById("progress"),i=document.getElementById("progress_indicator"),n=document.getElementById("seekable_window");e?(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_progress.png')",t.style.cursor="pointer",n.style.cursor="pointer",i.style.cursor="pointer",i.draggable=!0,t.addEventListener("click",y.seekMediaListener),n.addEventListener("click",y.seekMediaListener),i.addEventListener("dragend",y.seekMediaListener)):(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_buffer.png')",t.style.cursor="default",n.style.cursor="default",i.style.cursor="default",i.draggable=!1,t.removeEventListener("click",y.seekMediaListener),n.removeEventListener("click",y.seekMediaListener),i.removeEventListener("dragend",y.seekMediaListener))},m.prototype.updateMediaDuration=function(){document.getElementById("duration").innerHTML=m.getDurationString(y.currentMediaDuration)},m.getDurationString=function(e){var t=""+Math.floor(e%60),i=Math.floor(e/60);if(0===i)return t;t=i%60+":"+t;var n=Math.floor(i/60);return 0===n?t:n+":"+t},m.prototype.requestFullScreen=function(){var e=document.getElementById("video_element"),t=e.requestFullScreen||e.webkitRequestFullScreen;t&&(t.call(e),console.log("Requested fullscreen"))},m.prototype.cancelFullScreen=function(){var e=document.cancelFullScreen||document.webkitCancelFullScreen;e&&e.call(document)},m.prototype.fullscreenChangeHandler=function(){y.fullscreen=!y.fullscreen},m.prototype.showFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");y.fullscreen?(e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="block")):(e&&e.style&&e.style.display&&(e.style.display="block"),t&&t.style&&t.style.display&&(t.style.display="none"))},m.prototype.hideFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="none")},m.prototype.showMediaControl=function(){var e=document.getElementById("media_control");e&&e.style&&e.style.opacity&&(e.style.opacity=.7)},m.prototype.hideMediaControl=function(){if("undefined"!=typeof cast){var e=cast.framework.CastContext.getInstance();e&&e.getCurrentSession()?document.getElementById("media_control").style.opacity=.7:document.getElementById("media_control").style.opacity=0}},m.prototype.showVolumeSlider=function(){y.playerHandler.isMuted()||(document.getElementById("audio_bg").style.opacity=1,document.getElementById("audio_bg_track").style.opacity=1,document.getElementById("audio_bg_level").style.opacity=1,document.getElementById("audio_indicator").style.opacity=1)},m.prototype.hideVolumeSlider=function(){document.getElementById("audio_bg").style.opacity=0,document.getElementById("audio_bg_track").style.opacity=0,document.getElementById("audio_bg_level").style.opacity=0,document.getElementById("audio_indicator").style.opacity=0},m.prototype.resetVolumeSlider=function(){var e=.5*document.getElementById("audio_bg_track").clientHeight;document.getElementById("audio_bg_level").style.height=e+"px",document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},m.prototype.initializeUI=function(){document.getElementById("media_title").innerHTML=y.mediaContents[0].title,document.getElementById("media_subtitle").innerHTML=y.mediaContents[y.currentMediaIndex].subtitle,document.getElementById("media_desc").innerHTML=y.mediaContents[y.currentMediaIndex].description,document.getElementById("progress_bg").addEventListener("click",y.seekMedia.bind(y)),document.getElementById("progress").addEventListener("click",y.seekMedia.bind(y)),document.getElementById("progress_indicator").addEventListener("dragend",y.seekMedia.bind(y)),document.getElementById("audio_on").addEventListener("click",y.playerHandler.mute.bind(y.playerHandler)),document.getElementById("audio_off").addEventListener("click",y.playerHandler.unMute.bind(y.playerHandler)),document.getElementById("audio_bg").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_on").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_level").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_track").addEventListener("mouseover",y.showVolumeSlider.bind(y)),document.getElementById("audio_bg_level").addEventListener("click",y.setVolume.bind(y)),document.getElementById("audio_bg_track").addEventListener("click",y.setVolume.bind(y)),document.getElementById("audio_bg").addEventListener("mouseout",y.hideVolumeSlider.bind(y)),document.getElementById("audio_on").addEventListener("mouseout",y.hideVolumeSlider.bind(y)),document.getElementById("main_video").addEventListener("mouseover",y.showMediaControl.bind(y)),document.getElementById("main_video").addEventListener("mouseout",y.hideMediaControl.bind(y)),document.getElementById("media_control").addEventListener("mouseover",y.showMediaControl.bind(y)),document.getElementById("media_control").addEventListener("mouseout",y.hideMediaControl.bind(y)),document.getElementById("fullscreen_expand").addEventListener("click",y.requestFullScreen.bind(y)),document.getElementById("fullscreen_collapse").addEventListener("click",y.cancelFullScreen.bind(y)),document.addEventListener("fullscreenchange",y.fullscreenChangeHandler.bind(y),!1),document.addEventListener("webkitfullscreenchange",y.fullscreenChangeHandler.bind(y),!1),document.getElementById("play").addEventListener("click",y.playerHandler.play.bind(y.playerHandler)),document.getElementById("pause").addEventListener("click",y.playerHandler.pause.bind(y.playerHandler)),document.getElementById("progress_indicator").draggable=!0},m.prototype.addVideoThumbs=function(){if(void 0!==y.mediaJSON&&y.mediaJSON.categories&&y.mediaJSON.categories.length>0){y.mediaContents=y.mediaJSON.categories[0].videos;for(var e=document.getElementById("carousel"),t=null,i=null,n=0;n',t.addEventListener("click",y.selectMedia.bind(y,n)),e.appendChild(t)}},m.prototype.addMediaContents=function(){return void 0!==y.mediaJSON&&y.mediaJSON.categories&&y.mediaJSON.categories.length>0?(y.mediaContents=y.mediaJSON.categories[0].videos,y.mediaContents):null},m.getErrorMessage=function(e){switch(e.code){case chrome.cast.ErrorCode.API_NOT_INITIALIZED:return"The API is not initialized."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CANCEL:return"The operation was canceled by the user"+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CHANNEL_ERROR:return"A channel to the receiver is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.EXTENSION_MISSING:return"The Cast extension is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.INVALID_PARAMETER:return"The parameters to the operation were not valid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:return"No receiver was compatible with the session request."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.SESSION_ERROR:return"A session could not be created, or a session was invalid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.TIMEOUT:return"The operation timed out."+(e.description?" :"+e.description:"");default:return e}};var y=new m;window.__onGCastApiAvailable=function(e){e&&y.initializeCastPlayer()},window.CastPlayer=y,Object.defineProperty(e,"__esModule",{value:!0})})); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("@angular/common"),require("rxjs"),require("videogular2/compiled/src/streaming/vg-dash/vg-dash"),require("videogular2/compiled/core"),require("videogular2/compiled/controls"),require("videogular2/compiled/streaming"),require("videogular2/compiled/buffering"),require("videogular2/compiled/overlay-play")):"function"==typeof define&&define.amd?define("@thinkam.net/ng-cast",["exports","@angular/core","@angular/common","rxjs","videogular2/compiled/src/streaming/vg-dash/vg-dash","videogular2/compiled/core","videogular2/compiled/controls","videogular2/compiled/streaming","videogular2/compiled/buffering","videogular2/compiled/overlay-play"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).thinkam=e.thinkam||{},e.thinkam.net=e.thinkam.net||{},e.thinkam.net["ng-cast"]={}),e.ng.core,e.ng.common,e.rxjs,e.VgDASH,e.VgCoreModule,e.VgControlsModule,e.VgStreamingModule,e.VgBufferingModule,e.VgOverlayPlayModule)}(this,(function(e,t,i,n,o,a,r,s,d,l){"use strict";var u=function(){function e(){var e=this;this.window=window,this.status={casting:!1},this.onInitSuccess=function(){console.log("GCast initialization success")},this.onError=function(e){console.log("GCast initialization failed",e)},this.discoverDevices=function(){var t=e,i=new n.Subject;return e.cast.requestSession((function(e){t.session=e,t.setCasting(!0),i.next("CONNECTED")}),(function(e){t.setCasting(!1),"cancel"===e.code?(t.session=void 0,i.next("CANCEL")):console.error("Error selecting a cast device",e)})),i},this.onMediaDiscovered=function(e){var t=window.document.createElement("script");return t.setAttribute("type","text/javascript"),t.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"),window.document.body.appendChild(t),globalThis.CastPlayer.mediaJSON.categories=e,globalThis.CastPlayer.addMediaContents()},this.play=function(){e.currentMedia.play(null)},this.pause=function(){e.currentMedia.pause(null)},this.stop=function(){e.currentMedia.stop(null)},this.onMediaError=function(e){console.error("Error launching media",e)},globalThis.CastPlayer.mediaJSON={categories:[]}}return e.prototype.initializeCastApi=function(){var e=this;this.cast=this.window.chrome.cast;var t=new this.cast.SessionRequest("4F8B3483"),i=new this.cast.ApiConfig(t,(function(){}),(function(t){e.cast.ReceiverAvailability.AVAILABLE}));this.cast.initialize(i,this.onInitSuccess,this.onError)},e.prototype.initialize=function(e){e&&(globalThis.CastPlayer.initializeUI(),globalThis.CastPlayer.setupLocalPlayer(),globalThis.CastPlayer.initializeCastPlayer())},e.prototype.setCasting=function(e){this.status.casting=e,globalThis.CastPlayer.setupRemotePlayer()},e.prototype.getStatus=function(){return this.status},e}();u.decorators=[{type:t.Injectable}],u.ctorParameters=function(){return[]};var p=function(){function e(e){if(e)for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t])}return e.fromJS=function(t){t="object"==typeof t?t:{};var i=new e;return i.init(t),i},e.prototype.init=function(e){e&&(this.id=e.id,this.tenant=e.tenant,this.name=e.name,this.description=e.description,this.url=e.url,this.duration=e.duration,this.actualStart=e.actualStart,this.realEnd=e.realEnd,this.isActive=e.isActive)},e.prototype.toJSON=function(e){return(e="object"==typeof e?e:{}).id=this.id,e.tenant=this.tenant,e.name=this.name,e.description=this.description,e.url=this.url,e.duration=this.duration,e.actualStart=this.actualStart,e.realEnd=this.realEnd,e.isActive=this.isActive,e},e}(),c=function(){function e(e){this.ngCastService=e,this.videoImage="",this.imageOffline=!1,this.premium=!1,this.srcImageOffline="",this.currentStream={type:"dash",label:"DASH: Media Stream test",source:"http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd"},this.api=new a.VgAPI,this.isDebug=!1,this.paused=!1,this.streams=[{type:"dash",label:"DASH: Media Stream test",source:"http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd"}],this.playlist=[],this.play=!1,this.isHidden=!1,this.isShow=!0,this.currentIndex=0,this.video=new p,this.appBaseUrl=""}return e.prototype.ngOnInit=function(){this.window=window,this.currentStream=this.streams[0];var e=this.ngCastService;this.window.__onGCastApiAvailable=function(t){t&&e.initializeCastApi()},this.castingStatus=this.ngCastService.getStatus()},e.prototype.onPlayerReady=function(e){this.api=e,this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this))},e.prototype.setBitrate=function(e){switch(this.currentStream.type){case"dash":this.vgDash.setBitrate(e)}},e.prototype.nextVideo=function(){this.currentIndex++,this.currentIndex===this.playlist.length&&(this.currentIndex=0),this.video=this.playlist[this.currentIndex]},e.prototype.getPaused=function(){var e=this;if(this.media&&this.media.nativeElement)return this.paused=this.media.nativeElement.paused,this.media.nativeElement.paused;setTimeout((function(){return e.getPaused()}),2e3)},e.prototype.pause=function(){this.media.nativeElement.pause(),this.getPaused()},e.prototype.openSession=function(){this.ngCastService.discoverDevices()},e.prototype.closeSession=function(){this.ngCastService.discoverDevices()},e.prototype.tryAgain=function(){var e=this;this.imageOffline=!0,this.isHidden=!0,console.log("loading..."),setTimeout((function(){e.getVideos()}),500)},e.prototype.getVideos=function(){this.playlist&&this.playlist.length>0?(this.imageOffline=!1,this.video=this.playlist[this.currentIndex],this.getPosition(this.video)):(this.video=new p,this.tryAgain())},e.prototype.getPosition=function(e){var t=this;setTimeout((function(){var i=document.getElementById("video_element");i.load();var n=new Date,o=Math.abs(n.getTime()-new Date(t.video.actualStart).getTime());console.log("Temos no player: "+e.url),console.log("Início em: "+o),t.video.url=e.url,i.currentTime=o/1e3;var a=i.play();void 0!==a&&a.then((function(e){console.log("Estamos ao vivo!")})).catch((function(){t.play=!0}))}),1e3)},e.prototype.getMuted=function(){return this.media&&this.media.nativeElement&&this.media.nativeElement.muted||!1},e.prototype.getMaximized=function(){return this.api&&this.api.fsAPI&&this.api.fsAPI.isFullscreen&&this.api.fsAPI.isFullscreen||!1},e.prototype.toggleSound=function(){this.media.nativeElement.muted=!this.media.nativeElement.muted},e.prototype.toggleMaximize=function(){this.api.fsAPI.toggleFullscreen(this.media)},e.prototype.showVideoControls=function(){this.isHidden=!1,this.isShow=!0},e.prototype.hideVideoControls=function(){this.isHidden=!0,this.isShow=!1},e}();c.decorators=[{type:t.Component,args:[{selector:"ng-cast",template:'
\n \n \n \n \n \n
\n \n \n
AGORA
\n
\n
\n \n \n \n \n
\n
\n \n TV Offline\n \n\n\n
\n
\x3c!-- Put Your Image Width --\x3e\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\nTV Offline\n',styles:['#video-container{background-color:#272c34;margin:0 auto;z-index:-1}#video-container vg-scrub-bar-current-time .background{background-color:red}#video-container .hidden{display:none}#video-container .show{display:block}#video-container .video-controls{background:rgba(0,0,0,.5);bottom:0;height:45px;left:0;position:absolute;right:0;transition:all .2s ease}#video-container .video-controls.hide{opacity:0;pointer-events:none}#video-container .video-progress{align-items:right;height:8.4px;position:relative}#video-container .video-progress #seek-tooltip{position:absolute}@media screen and (-webkit-min-device-pixel-ratio:0){#video-container .video-progress input[type=range]{-webkit-appearance:none;background-color:var(--youtube-red);overflow:hidden}#video-container .video-progress input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;color:var(--youtube-red);height:10px;margin-top:-1px}#video-container .video-progress input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--youtube-red);cursor:ew-resize;height:10px;width:10px}}#video-container .video-progress input[type=range]{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-moz-range-progress,#video-container .video-progress input[type=range]::-moz-range-track{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-ms-fill-lower,#video-container .video-progress input[type=range]::-ms-fill-upper{background-color:var(--youtube-red)}#video-container progress{-moz-appearance:none;-webkit-appearance:none;appearance:none;border-radius:2px;height:.5vh;pointer-events:none;position:absolute;top:0;width:100%}#video-container .buttons .video-control{align-items:center;background:none;border:2px solid #fff;border-radius:16px;color:#fff;display:flex;height:32px;justify-content:center;width:32px}#video-container .buttons .video-control i{color:#fff;line-height:16px}#video-container .buttons .video-control-paused{bottom:8px;left:1vw;position:absolute;z-index:1000}#video-container .buttons .video-control-muted{bottom:8px;position:absolute;right:5vw;z-index:1000}#video-container .buttons .video-control-maximized{bottom:8px;position:absolute;right:1vw;z-index:1000}#video-container progress::-webkit-progress-bar{background-color:var(--youtube-red);border-radius:2px}#video-container progress::-webkit-progress-value{background:#fff;border-radius:2px}#video-container progress::-moz-progress-bar{background:#fff;border:1px solid #fff}#video-container .seek{cursor:pointer;height:.5vh;margin:0;position:absolute;top:0;width:100%}#video-container .seek-tooltip{background-color:var(--youtube-red);color:#fff;content:attr(data-title);display:block;font-size:12px;font-weight:700;margin-left:5vw;padding:3px;position:absolute;top:10px}.playlist-item li{color:#fff}.kt-content.kt-grid__item.kt-grid__item--fluid.kt-grid.kt-grid--hor{background-color:#272c34}#kt_header_menu_wrapper{display:none}.kt-header__bottom{display:none!important}.player-wrapper{margin:auto;max-width:500px}.player-wrapper video{width:100%}ul{padding:0}ul li.playlist-item{background:#673ab7;cursor:pointer;list-style:none;margin-bottom:2px;padding:10px}ul li.playlist-item.selected{background-color:#ccc}body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}']}]}],c.ctorParameters=function(){return[{type:u}]},c.propDecorators={vgDash:[{type:t.ViewChild,args:[o.VgDASH,{static:!1}]}],media:[{type:t.ViewChild,args:["media",{static:!1}]}],videoImage:[{type:t.Input}],imageOffline:[{type:t.Input}],premium:[{type:t.Input}],srcImageOffline:[{type:t.Input}],currentStream:[{type:t.Input}],isDebug:[{type:t.Input}],paused:[{type:t.Input}],streams:[{type:t.Input}],playlist:[{type:t.Input}],play:[{type:t.Input}],isHidden:[{type:t.Input}],isShow:[{type:t.Input}],currentIndex:[{type:t.Input}],video:[{type:t.Input}],appBaseUrl:[{type:t.Input}]};var m=function(){};m.decorators=[{type:t.NgModule,args:[{schemas:[t.CUSTOM_ELEMENTS_SCHEMA],imports:[i.CommonModule,a.VgCoreModule,r.VgControlsModule,s.VgStreamingModule,d.VgBufferingModule,l.VgOverlayPlayModule],exports:[c],providers:[u],declarations:[c]}]}];var g=600,y=100,f="IDLE",h="BUFFERING",v="LOADED",b="PLAYING",x="PAUSED",_="ERROR",E=function(){this.playerHandler=new I(this),this.playerState=f,this.playerStateBeforeSwitch=null,this.remotePlayer=null,this.remotePlayerController=null,this.currentMediaTime=0,this.mediaDuration=-1,this.timer=null,this.incrementMediaTimeHandler=this.incrementMediaTime.bind(this),this.seekMediaListener=this.seekMedia.bind(this),this.currentMediaIndex=0,this.mediaContents=null,this.fullscreen=!1,this.mediaInfo=null,this.whenSkippable=null,this.liveSeekableRange=null,this.isLiveContent=!1,this.mediaJSON={categories:[]}};E.prototype.initializeCastPlayer=function(){var e={receiverApplicationId:"4F8B3483"};e.autoJoinPolicy=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,cast.framework.CastContext.getInstance().setOptions(e),k.remotePlayer=new cast.framework.RemotePlayer,k.remotePlayerController=new cast.framework.RemotePlayerController(k.remotePlayer),k.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,k.switchPlayer.bind(k))},E.prototype.switchPlayer=function(){k.stopProgressTimer(),k.resetVolumeSlider(),k.playerHandler.stop(),k.playerState=f,cast&&cast.framework&&k.remotePlayer.isConnected?k.setupRemotePlayer():k.setupLocalPlayer()};var I=function(e){this.target={},this.setTarget=function(e){this.target=e},this.play=function(){e.playerState===b||e.playerState===x||e.playerState===v?(this.target.play(),e.playerState=b,document.getElementById("play").style.display="none",document.getElementById("pause").style.display="block",this.updateDisplayMessage()):this.load(e.currentMediaIndex)},this.updateDisplayMessage=function(){this.target.updateDisplayMessage()},this.pause=function(){this.target.pause(),e.playerState=x,document.getElementById("play").style.display="block",document.getElementById("pause").style.display="none"},this.stop=function(){e.playerState=f,this.target.stop()},this.load=function(t){void 0===t&&(t=null),t||(t=e.currentMediaIndex),e.playerState=h,this.target.load(t)},this.isMediaLoaded=function(e){return this.target.isMediaLoaded(e)},this.prepareToPlay=function(){e.mediaDuration=this.getMediaDuration(),e.playerHandler.updateDurationDisplay(),e.playerState=v,this.play(),e.startProgressTimer(),this.updateDisplay()},this.loaded=function(){e.currentMediaDuration=this.getMediaDuration(),e.updateMediaDuration(),e.playerState=v,e.currentMediaTime>0&&this.seekTo(e.currentMediaTime),this.play(),e.startProgressTimer(),this.updateDisplayMessage()},this.getCurrentMediaTime=function(){return this.target.getCurrentMediaTime()},this.getMediaDuration=function(){return this.target.getMediaDuration()},this.updateDisplay=function(){this.currentMediaTime=this.target.getCurrentMediaTime(),this.mediaDuration=this.target.getMediaDuration(),this.target.updateDisplay()},this.updateCurrentTimeDisplay=function(){this.target.updateCurrentTimeDisplay()},this.setTimeString=function(e,t){this.target.setTimeString(e,t)},this.setVolume=function(e){this.target.setVolume(e)},this.mute=function(){this.target.mute(),document.getElementById("audio_on").style.display="none",document.getElementById("audio_off").style.display="block"},this.unMute=function(){this.target.unMute(),document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},this.isMuted=function(){return this.target.isMuted()},this.seekTo=function(e){this.target.seekTo(e)}};E.prototype.setupLocalPlayer=function(){var e=document.getElementById("video_element");e.addEventListener("loadeddata",k.onMediaLoadedLocally.bind(k));var t={play:function(){e.play(),document.getElementById("video_image").style.display="none",e.style.display="block"},pause:function(){e.pause()},stop:function(){"function"==typeof e.stop&&e.stop()}};t.load=function(t){e.src=k.mediaContents[t].sources[0],e.load()}.bind(k),t.getCurrentMediaTime=function(){return e.currentTime},t.getMediaDuration=function(){return e.duration},t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none"},t.setVolume=function(t){e.volume=t0&&k.playerHandler.play()},E.prototype.setupRemotePlayer=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();k.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,function(){k.remotePlayer.isPaused?k.playerHandler.pause():k.playerHandler.play()}.bind(k)),k.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,function(){k.remotePlayer.isMuted?k.playerHandler.mute():k.playerHandler.unMute()}.bind(k)),k.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,function(){var e=k.remotePlayer.volumeLevel*y,t=document.getElementById("audio_bg_level");t.style.height=e+"px",t.style.marginTop=-e+"px"}.bind(k));var t={};t.play=function(){k.remotePlayer.isPaused&&k.remotePlayerController.playOrPause(),document.getElementById("video_image").style.display="block",document.getElementById("video_element").style.display="none"}.bind(k),t.pause=function(){k.remotePlayer.isPaused||k.remotePlayerController.playOrPause()}.bind(k),t.stop=function(){k.remotePlayerController.stop()}.bind(k),t.load=function(t){console.log("Loading..."+k.mediaContents[t].title);var i=new chrome.cast.media.MediaInfo(k.mediaContents[t].sources[0],"video/mp4");i.metadata=new chrome.cast.media.GenericMediaMetadata,i.metadata.metadataType=chrome.cast.media.MetadataType.GENERIC,i.metadata.title=k.mediaContents[t].title,i.metadata.images=[{url:""+k.mediaContents[t].thumb}];var n=new chrome.cast.media.LoadRequest(i);e.loadMedia(n).then(k.playerHandler.loaded.bind(k.playerHandler),function(e){k.playerState=_,console.log("Remote media load error: "+E.getErrorMessage(e))}.bind(k))}.bind(k),t.getCurrentMediaTime=function(){return k.remotePlayer.currentTime}.bind(k),t.getMediaDuration=function(){return k.remotePlayer.duration}.bind(k),t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="block",document.getElementById("playerstatebg").style.display="block",document.getElementById("video_image_overlay").style.display="block",document.getElementById("playerstate").innerHTML=k.mediaContents[k.currentMediaIndex].title+" "+k.playerState+" on "+e.getCastDevice().friendlyName}.bind(k),t.setVolume=function(e){var t=k.remotePlayer.volumeLevel,i=document.getElementById("audio_bg_level");if(en&&(e=n+(pos-n)/2),i.style.height=e+"px",i.style.marginTop=-e+"px",t=e/y}else t=1;k.remotePlayer.volumeLevel=t,k.remotePlayerController.setVolumeLevel()}.bind(k),t.mute=function(){k.remotePlayer.isMuted||k.remotePlayerController.muteOrUnmute()}.bind(k),t.unMute=function(){k.remotePlayer.isMuted&&k.remotePlayerController.muteOrUnmute()}.bind(k),t.isMuted=function(){return k.remotePlayer.isMuted}.bind(k),t.seekTo=function(e){k.remotePlayer.currentTime=e,k.remotePlayerController.seek()}.bind(k),k.playerHandler.setTarget(t),k.remotePlayer.isMuted&&k.playerHandler.mute();var i=k.remotePlayer.volumeLevel*y,n=document.getElementById("audio_bg_level");n.style.height=i+"px",n.style.marginTop=-i+"px",k.hideFullscreenButton(),k.playerHandler.play()},E.prototype.onMediaLoadedLocally=function(){document.getElementById("video_element").currentTime=k.currentMediaTime,k.playerHandler.loaded()},E.prototype.selectMedia=function(e){console.log("Media index selected: "+e),k.currentMediaIndex=e,k.playerHandler.currentMediaInfo=void 0,document.getElementById("video_image").src=""+k.mediaContents[e].thumb,document.getElementById("progress_indicator").style.marginLeft="0px",document.getElementById("progress").style.width="0px";var t=document.getElementById("seekable_window"),i=document.getElementById("unseekable_overlay");t.style.width=g,i.style.width="0px",k.stopProgressTimer(),k.currentMediaTime=0,k.playerHandler.setTimeString(document.getElementById("currentTime"),0),k.playerHandler.setTimeString(document.getElementById("duration"),0),k.playerState=f,k.playerHandler.play()},E.prototype.seekMedia=function(e){if(null==k.mediaDuration||cast.framework.CastContext.getInstance().getCurrentSession()&&!k.remotePlayer.canSeek)console.log("Error - Not seekable");else if(!k.isLiveContent||k.liveSeekableRange){var t=parseInt(e.offsetX,10),i=document.getElementById("progress_indicator"),n=document.getElementById("progress"),o=0,a=0,r=0;"progress_indicator"==e.currentTarget.id?(o=parseInt(k.currentMediaTime+k.mediaDuration*t/g,10),a=parseInt(i.style.marginLeft,10)+t,r=parseInt(n.style.width,10)+t):(o=parseInt(t*k.mediaDuration/g,10),a=t,r=t),k.playerState!==b&&k.playerState!==x||(k.currentMediaTime=o,n.style.width=r+"px",i.style.marginLeft=a+"px"),k.isLiveContent&&(o+=k.mediaInfo.metadata.sectionStartTimeInMedia),k.playerHandler.seekTo(o)}else console.log("Live content has no seekable range.")},E.prototype.setVolume=function(e){var t=document.getElementById("audio_bg_level"),i=0;i="audio_bg_track"===e.currentTarget.id?y-parseInt(e.offsetY,10):parseInt(t.clientHeight,10)-parseInt(e.offsetY,10),k.playerHandler.setVolume(i)},E.prototype.startProgressTimer=function(){k.stopProgressTimer(),k.timer=setInterval(k.incrementMediaTimeHandler,1e3)},E.prototype.stopProgressTimer=function(){k.timer&&(clearInterval(k.timer),k.timer=null)},E.prototype.incrementMediaTime=function(){k.currentMediaTime=k.playerHandler.getCurrentMediaTime(),k.currentMediaDuration=k.playerHandler.getMediaDuration(),k.playerState===b&&(k.currentMediaTime0)var t=Math.floor(g*k.currentMediaTime/k.currentMediaDuration);e.style.width=t+"px",document.getElementById("progress_indicator").style.marginLeft=-621+t+"px",t>=g&&k.endPlayback()},E.prototype.endPlayback=function(){k.currentMediaTime=0,k.stopProgressTimer(),k.playerState=f,k.playerHandler.updateDisplay();var e=document.getElementById("play");e&&e.style&&e.display&&(e.style.display="block");var t=document.getElementById("pause");t&&t.style&&t.style.display&&(t.style.display="none")},E.prototype.getMediaTimeString=function(e){if(null==e||null==e)return null;var t=!1;e<0&&(t=!0,e*=-1);var i=Math.floor(e/3600),n=Math.floor((e-3600*i)/60),o=Math.floor(e-3600*i-60*n);return i<10&&(i="0"+i),n<10&&(n="0"+n),o<10&&(o="0"+o),(t?"-":"")+i+":"+n+":"+o},E.prototype.getClockTimeString=function(e){if(!e)return"0:00:00";var t=new Date(1e3*e),i=t.getHours(),n=t.getMinutes(),o=t.getSeconds(),a=i>=12?"PM":"AM";return(i=(i%=12)||12)+":"+(n=("0"+n).slice(-2))+":"+(o=("0"+o).slice(-2))+" "+a},E.prototype.updateAdMarkers=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e){var t=e.getMediaSession();if(t){var i=t.media;if(i){var n=i.breaks,o=i.duration;if(n)for(var a=0;ao&&r.isEmbedded))if(!document.getElementById("ad"+r.position))document.getElementById("progress").innerHTML+='
'}}}}},E.prototype.removeAdMarkers=function(){document.querySelectorAll(".adMarker").forEach((function(e){e.remove()}))},E.prototype.adPositionToMargin=function(e,t){return-1==e||e>t?g:g*e/t},E.prototype.onBreakClipIdChanged=function(){var e=document.getElementById("skip");e&&e.style&&e.style.display&&(e.style.display="none")},E.prototype.isPlayingBreak=function(e){k.enableProgressBar(!e)},E.prototype.onWhenSkippableChanged=function(e){k.whenSkippable=e},E.prototype.onCurrentBreakClipTimeChanged=function(e){var t=document.getElementById("skip");null==k.whenSkippable||k.whenSkippable<0?t&&t.style&&t.style.display&&(t.style.display="none"):void 0!==k.whenSkippable||e>=k.whenSkippable?t&&t.style&&t.style.display&&(t.style.display="block"):t&&t.style&&t.style.display&&(t.style.display="none")},E.prototype.skipAd=function(){k.remotePlayerController.skipAd()},E.prototype.enableProgressBar=function(e){var t=document.getElementById("progress"),i=document.getElementById("progress_indicator"),n=document.getElementById("seekable_window");e?(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_progress.png')",t.style.cursor="pointer",n.style.cursor="pointer",i.style.cursor="pointer",i.draggable=!0,t.addEventListener("click",k.seekMediaListener),n.addEventListener("click",k.seekMediaListener),i.addEventListener("dragend",k.seekMediaListener)):(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_buffer.png')",t.style.cursor="default",n.style.cursor="default",i.style.cursor="default",i.draggable=!1,t.removeEventListener("click",k.seekMediaListener),n.removeEventListener("click",k.seekMediaListener),i.removeEventListener("dragend",k.seekMediaListener))},E.prototype.updateMediaDuration=function(){document.getElementById("duration").innerHTML=E.getDurationString(k.currentMediaDuration)},E.getDurationString=function(e){var t=""+Math.floor(e%60),i=Math.floor(e/60);if(0===i)return t;t=i%60+":"+t;var n=Math.floor(i/60);return 0===n?t:n+":"+t},E.prototype.requestFullScreen=function(){var e=document.getElementById("video_element"),t=e.requestFullScreen||e.webkitRequestFullScreen;t&&(t.call(e),console.log("Requested fullscreen"))},E.prototype.cancelFullScreen=function(){var e=document.cancelFullScreen||document.webkitCancelFullScreen;e&&e.call(document)},E.prototype.fullscreenChangeHandler=function(){k.fullscreen=!k.fullscreen},E.prototype.showFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");k.fullscreen?(e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="block")):(e&&e.style&&e.style.display&&(e.style.display="block"),t&&t.style&&t.style.display&&(t.style.display="none"))},E.prototype.hideFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="none")},E.prototype.showMediaControl=function(){var e=document.getElementById("media_control");e&&e.style&&e.style.opacity&&(e.style.opacity=.7)},E.prototype.hideMediaControl=function(){if("undefined"!=typeof cast){var e=cast.framework.CastContext.getInstance();e&&e.getCurrentSession()?document.getElementById("media_control").style.opacity=.7:document.getElementById("media_control").style.opacity=0}},E.prototype.showVolumeSlider=function(){k.playerHandler.isMuted()||(document.getElementById("audio_bg").style.opacity=1,document.getElementById("audio_bg_track").style.opacity=1,document.getElementById("audio_bg_level").style.opacity=1,document.getElementById("audio_indicator").style.opacity=1)},E.prototype.hideVolumeSlider=function(){document.getElementById("audio_bg").style.opacity=0,document.getElementById("audio_bg_track").style.opacity=0,document.getElementById("audio_bg_level").style.opacity=0,document.getElementById("audio_indicator").style.opacity=0},E.prototype.resetVolumeSlider=function(){var e=.5*document.getElementById("audio_bg_track").clientHeight;document.getElementById("audio_bg_level").style.height=e+"px",document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},E.prototype.initializeUI=function(){document.getElementById("media_title").innerHTML=k.mediaContents[0].title,document.getElementById("media_subtitle").innerHTML=k.mediaContents[k.currentMediaIndex].subtitle,document.getElementById("media_desc").innerHTML=k.mediaContents[k.currentMediaIndex].description,document.getElementById("progress_bg").addEventListener("click",k.seekMedia.bind(k)),document.getElementById("progress").addEventListener("click",k.seekMedia.bind(k)),document.getElementById("progress_indicator").addEventListener("dragend",k.seekMedia.bind(k)),document.getElementById("audio_on").addEventListener("click",k.playerHandler.mute.bind(k.playerHandler)),document.getElementById("audio_off").addEventListener("click",k.playerHandler.unMute.bind(k.playerHandler)),document.getElementById("audio_bg").addEventListener("mouseover",k.showVolumeSlider.bind(k)),document.getElementById("audio_on").addEventListener("mouseover",k.showVolumeSlider.bind(k)),document.getElementById("audio_bg_level").addEventListener("mouseover",k.showVolumeSlider.bind(k)),document.getElementById("audio_bg_track").addEventListener("mouseover",k.showVolumeSlider.bind(k)),document.getElementById("audio_bg_level").addEventListener("click",k.setVolume.bind(k)),document.getElementById("audio_bg_track").addEventListener("click",k.setVolume.bind(k)),document.getElementById("audio_bg").addEventListener("mouseout",k.hideVolumeSlider.bind(k)),document.getElementById("audio_on").addEventListener("mouseout",k.hideVolumeSlider.bind(k)),document.getElementById("main_video").addEventListener("mouseover",k.showMediaControl.bind(k)),document.getElementById("main_video").addEventListener("mouseout",k.hideMediaControl.bind(k)),document.getElementById("media_control").addEventListener("mouseover",k.showMediaControl.bind(k)),document.getElementById("media_control").addEventListener("mouseout",k.hideMediaControl.bind(k)),document.getElementById("fullscreen_expand").addEventListener("click",k.requestFullScreen.bind(k)),document.getElementById("fullscreen_collapse").addEventListener("click",k.cancelFullScreen.bind(k)),document.addEventListener("fullscreenchange",k.fullscreenChangeHandler.bind(k),!1),document.addEventListener("webkitfullscreenchange",k.fullscreenChangeHandler.bind(k),!1),document.getElementById("play").addEventListener("click",k.playerHandler.play.bind(k.playerHandler)),document.getElementById("pause").addEventListener("click",k.playerHandler.pause.bind(k.playerHandler)),document.getElementById("progress_indicator").draggable=!0},E.prototype.addVideoThumbs=function(){if(void 0!==k.mediaJSON&&k.mediaJSON.categories&&k.mediaJSON.categories.length>0){k.mediaContents=k.mediaJSON.categories[0].videos;for(var e=document.getElementById("carousel"),t=null,i=null,n=0;n',t.addEventListener("click",k.selectMedia.bind(k,n)),e.appendChild(t)}},E.prototype.addMediaContents=function(){return void 0!==k.mediaJSON&&k.mediaJSON.categories&&k.mediaJSON.categories.length>0?(k.mediaContents=k.mediaJSON.categories[0].videos,k.mediaContents):null},E.getErrorMessage=function(e){switch(e.code){case chrome.cast.ErrorCode.API_NOT_INITIALIZED:return"The API is not initialized."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CANCEL:return"The operation was canceled by the user"+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CHANNEL_ERROR:return"A channel to the receiver is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.EXTENSION_MISSING:return"The Cast extension is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.INVALID_PARAMETER:return"The parameters to the operation were not valid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:return"No receiver was compatible with the session request."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.SESSION_ERROR:return"A session could not be created, or a session was invalid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.TIMEOUT:return"The operation timed out."+(e.description?" :"+e.description:"");default:return e}};var k=new E;window.__onGCastApiAvailable=function(e){e&&k.initializeCastPlayer()},window.CastPlayer=k,e.NgCastModule=m,e.NgCastService=u,e.ɵa=c,Object.defineProperty(e,"__esModule",{value:!0})})); //# sourceMappingURL=thinkam.net-ng-cast.umd.min.js.map \ No newline at end of file diff --git a/dist/bundles/thinkam.net-ng-cast.umd.min.js.map b/dist/bundles/thinkam.net-ng-cast.umd.min.js.map index 0c22c0e..428e7b6 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.min.js.map +++ b/dist/bundles/thinkam.net-ng-cast.umd.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js"],"names":["__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","NgCastComponent","ngCastService","this","videoImage","imageOffline","srcImageOffline","prototype","ngOnInit","window","isAvailable","initializeCastApi","castingStatus","getStatus","openSession","discoverDevices","closeSession","tslib_1.__decorate","Input","Component","selector","template","NgCastService","_this","status","casting","onInitSuccess","console","log","onError","err","self","subj","Subject","cast","requestSession","s","session","setCasting","next","code","undefined","error","onMediaDiscovered","categories","script","createElement","setAttribute","body","appendChild","globalThis","CastPlayer","mediaJSON","addMediaContents","play","currentMedia","pause","stop","onMediaError","sessionRequest","SessionRequest","apiConfig","ApiConfig","ReceiverAvailability","AVAILABLE","initialize","mediaContents","initializeUI","setupLocalPlayer","initializeCastPlayer","value","setupRemotePlayer","Injectable","NgCastModule","NgModule","schemas","CUSTOM_ELEMENTS_SCHEMA","imports","CommonModule","exports","providers","declarations","PROGRESS_BAR_WIDTH","FULL_VOLUME_HEIGHT","PLAYER_STATE","playerHandler","PlayerHandler","playerState","playerStateBeforeSwitch","remotePlayer","remotePlayerController","currentMediaTime","mediaDuration","timer","incrementMediaTimeHandler","incrementMediaTime","bind","seekMediaListener","seekMedia","currentMediaIndex","fullscreen","mediaInfo","whenSkippable","liveSeekableRange","isLiveContent","options","receiverApplicationId","autoJoinPolicy","chrome","AutoJoinPolicy","ORIGIN_SCOPED","framework","CastContext","getInstance","setOptions","castPlayer","RemotePlayer","RemotePlayerController","addEventListener","RemotePlayerEventType","IS_CONNECTED_CHANGED","switchPlayer","stopProgressTimer","resetVolumeSlider","isConnected","setTarget","document","getElementById","style","display","updateDisplayMessage","load","mediaIndex","isMediaLoaded","prepareToPlay","getMediaDuration","updateDurationDisplay","startProgressTimer","updateDisplay","loaded","currentMediaDuration","updateMediaDuration","seekTo","getCurrentMediaTime","updateCurrentTimeDisplay","setTimeString","element","time","setVolume","volumeSliderPosition","mute","unMute","isMuted","localPlayer","onMediaLoadedLocally","playerTarget","src","currentTime","duration","volume","p","height","marginTop","muted","DEFAULT_VOLUME","showFullscreenButton","castSession","getCurrentSession","IS_PAUSED_CHANGED","isPaused","IS_MUTED_CHANGED","VOLUME_LEVEL_CHANGED","newVolume","volumeLevel","playOrPause","media","MediaInfo","metadata","GenericMediaMetadata","metadataType","MetadataType","GENERIC","title","images","url","request","LoadRequest","loadMedia","then","errorCode","getErrorMessage","innerHTML","getCastDevice","friendlyName","currentVolume","vScale","pos","setVolumeLevel","muteOrUnmute","seek","hideFullscreenButton","selectMedia","currentMediaInfo","marginLeft","width","seekable_window","unseekable_overlay","event","canSeek","position","parseInt","offsetX","pi","progress","seekTime","pp","pw","currentTarget","id","sectionStartTimeInMedia","mouseEvent","offsetY","clientHeight","setInterval","clearInterval","updateProgressBarByTimer","endPlayback","isNaN","Math","floor","getMediaTimeString","timestamp","isNegative","hours","minutes","seconds","getClockTimeString","date","Date","getHours","getMinutes","getSeconds","ampm","slice","updateAdMarkers","getMediaSession","breaks","contentDuration","adBreak","isEmbedded","adPositionToMargin","removeAdMarkers","querySelectorAll","forEach","adMarker","remove","onBreakClipIdChanged","skip","isPlayingBreak","enableProgressBar","onWhenSkippableChanged","onCurrentBreakClipTimeChanged","currentBreakClipTime","skipAd","enable","progress_indicator","backgroundImage","cursor","draggable","removeEventListener","getDurationString","durationInSec","durationString","durationInMin","durationInHour","requestFullScreen","requestMethod","call","cancelFullScreen","fullscreenChangeHandler","fullscreen_expand","fullscreen_collapse","showMediaControl","media_control","opacity","hideMediaControl","context","showVolumeSlider","hideVolumeSlider","defaultVolumeSliderHeight","addVideoThumbs","ni","newdiv","divIdName","ErrorCode","API_NOT_INITIALIZED","description","CANCEL","CHANNEL_ERROR","EXTENSION_MISSING","INVALID_PARAMETER","RECEIVER_UNAVAILABLE","SESSION_ERROR","TIMEOUT"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeCastPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n globalThis.CastPlayer.setupRemotePlayer();\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = () => {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n if (typeof localPlayer.stop === \"function\")\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n"]} \ No newline at end of file +{"version":3,"sources":["../../shared/ng-cast.service.ts","../../dto/schedule-dto.ts","../../ng-cast.component.ts","../../ng.cast.module.ts","../../cast-videos.js"],"names":["NgCastService","_this","this","window","status","casting","onInitSuccess","console","log","onError","err","discoverDevices","self","subj","Subject","cast","requestSession","s","session","setCasting","next","code","undefined","error","onMediaDiscovered","categories","script","createElement","setAttribute","body","appendChild","globalThis","CastPlayer","mediaJSON","addMediaContents","play","currentMedia","pause","stop","onMediaError","prototype","initializeCastApi","sessionRequest","SessionRequest","apiConfig","ApiConfig","ReceiverAvailability","AVAILABLE","initialize","mediaContents","initializeUI","setupLocalPlayer","initializeCastPlayer","value","setupRemotePlayer","getStatus","Injectable","ScheduleDto","data","property","hasOwnProperty","fromJS","result","init","id","tenant","name","description","url","duration","actualStart","realEnd","isActive","toJSON","NgCastComponent","ngCastService","videoImage","imageOffline","premium","srcImageOffline","currentStream","type","label","source","api","VgAPI","isDebug","paused","streams","playlist","isHidden","isShow","currentIndex","video","appBaseUrl","ngOnInit","isAvailable","castingStatus","onPlayerReady","getDefaultMedia","subscriptions","ended","subscribe","nextVideo","bind","setBitrate","option","vgDash","length","getPaused","media","nativeElement","setTimeout","openSession","closeSession","tryAgain","getVideos","getPosition","vid","document","getElementById","load","now","Date","currentTime","Math","abs","getTime","promise","then","_","catch","getMuted","muted","getMaximized","fsAPI","isFullscreen","toggleSound","toggleMaximize","toggleFullscreen","showVideoControls","hideVideoControls","Component","args","selector","template","ViewChild","VgDASH","static","Input","NgModule","schemas","CUSTOM_ELEMENTS_SCHEMA","imports","CommonModule","VgCoreModule","VgControlsModule","VgStreamingModule","VgBufferingModule","VgOverlayPlayModule","exports","providers","declarations","PROGRESS_BAR_WIDTH","FULL_VOLUME_HEIGHT","PLAYER_STATE","playerHandler","PlayerHandler","playerState","playerStateBeforeSwitch","remotePlayer","remotePlayerController","currentMediaTime","mediaDuration","timer","incrementMediaTimeHandler","incrementMediaTime","seekMediaListener","seekMedia","currentMediaIndex","fullscreen","mediaInfo","whenSkippable","liveSeekableRange","isLiveContent","options","receiverApplicationId","autoJoinPolicy","chrome","AutoJoinPolicy","ORIGIN_SCOPED","framework","CastContext","getInstance","setOptions","castPlayer","RemotePlayer","RemotePlayerController","addEventListener","RemotePlayerEventType","IS_CONNECTED_CHANGED","switchPlayer","stopProgressTimer","resetVolumeSlider","isConnected","target","setTarget","style","display","updateDisplayMessage","mediaIndex","isMediaLoaded","prepareToPlay","getMediaDuration","updateDurationDisplay","startProgressTimer","updateDisplay","loaded","currentMediaDuration","updateMediaDuration","seekTo","getCurrentMediaTime","updateCurrentTimeDisplay","setTimeString","element","time","setVolume","volumeSliderPosition","mute","unMute","isMuted","localPlayer","onMediaLoadedLocally","playerTarget","src","volume","p","height","marginTop","DEFAULT_VOLUME","showFullscreenButton","castSession","getCurrentSession","IS_PAUSED_CHANGED","isPaused","IS_MUTED_CHANGED","VOLUME_LEVEL_CHANGED","newVolume","volumeLevel","playOrPause","MediaInfo","metadata","GenericMediaMetadata","metadataType","MetadataType","GENERIC","title","images","request","LoadRequest","loadMedia","errorCode","getErrorMessage","innerHTML","getCastDevice","friendlyName","currentVolume","vScale","pos","setVolumeLevel","muteOrUnmute","seek","hideFullscreenButton","selectMedia","currentMediaInfo","marginLeft","width","seekable_window","unseekable_overlay","event","canSeek","position","parseInt","offsetX","pi","progress","seekTime","pp","pw","currentTarget","sectionStartTimeInMedia","mouseEvent","offsetY","clientHeight","setInterval","clearInterval","updateProgressBarByTimer","endPlayback","isNaN","floor","getMediaTimeString","timestamp","isNegative","hours","minutes","seconds","getClockTimeString","date","getHours","getMinutes","getSeconds","ampm","slice","updateAdMarkers","getMediaSession","breaks","contentDuration","i","adBreak","isEmbedded","adPositionToMargin","removeAdMarkers","querySelectorAll","forEach","adMarker","remove","onBreakClipIdChanged","skip","isPlayingBreak","enableProgressBar","onWhenSkippableChanged","onCurrentBreakClipTimeChanged","currentBreakClipTime","skipAd","enable","progress_indicator","backgroundImage","cursor","draggable","removeEventListener","getDurationString","durationInSec","durationString","durationInMin","durationInHour","requestFullScreen","requestMethod","call","cancelFullScreen","fullscreenChangeHandler","fullscreen_expand","fullscreen_collapse","showMediaControl","media_control","opacity","hideMediaControl","context","showVolumeSlider","hideVolumeSlider","defaultVolumeSliderHeight","addVideoThumbs","ni","newdiv","divIdName","ErrorCode","API_NOT_INITIALIZED","CANCEL","CHANNEL_ERROR","EXTENSION_MISSING","INVALID_PARAMETER","RECEIVER_UNAVAILABLE","SESSION_ERROR","TIMEOUT"],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeCastPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n globalThis.CastPlayer.setupRemotePlayer();\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { TenantDto } from './tenant-dto';\n\nexport interface IScheduleDto {\n id: string | undefined;\n tenant: TenantDto | undefined;\n name: string | undefined;\n description: string | undefined;\n url: string | undefined;\n duration: number | undefined;\n actualStart: Date;\n realEnd?: Date | undefined;\n isActive: boolean | undefined;\n}\n\nexport class ScheduleDto implements IScheduleDto {\n id: string | undefined;\n tenant: TenantDto | undefined;\n name: string | undefined;\n description: string | undefined;\n url: string | undefined;\n duration: number | undefined;\n actualStart!: Date;\n realEnd?: Date | undefined;\n isActive: boolean | undefined;\n\n constructor(data?: IScheduleDto) {\n if (data) {\n for (let property in data) {\n if (data.hasOwnProperty(property)) {\n (this)[property] = (data)[property];\n }\n }\n }\n }\n\n static fromJS(data: any): ScheduleDto {\n data = typeof data === 'object' ? data : {};\n let result = new ScheduleDto();\n result.init(data);\n return result;\n }\n\n init(data?: any) {\n if (data) {\n this.id = data['id'];\n this.tenant = data['tenant'];\n this.name = data['name'];\n this.description = data['description'];\n this.url = data['url'];\n this.duration = data['duration'];\n this.actualStart = data['actualStart'];\n this.realEnd = data['realEnd'];\n this.isActive = data['isActive'];\n }\n }\n\n toJSON(data?: any) {\n data = typeof data === 'object' ? data : {};\n data['id'] = this.id;\n data['tenant'] = this.tenant;\n data['name'] = this.name;\n data['description'] = this.description;\n data['url'] = this.url;\n data['duration'] = this.duration;\n data['actualStart'] = this.actualStart;\n data['realEnd'] = this.realEnd;\n data['isActive'] = this.isActive;\n return data;\n }\n}\n","import { Component, Input, OnInit, ViewChild, ElementRef } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\nimport { VgDASH } from 'videogular2/compiled/src/streaming/vg-dash/vg-dash';\nimport { IDRMLicenseServer } from 'videogular2/compiled/src/streaming/streaming';\nimport { VgAPI, BitrateOption } from 'videogular2/compiled/core';\n\nimport { ScheduleDto } from './dto/schedule-dto';\n\nexport interface IMediaStream {\n type: 'vod' | 'dash';\n source: string;\n label: string;\n token?: string;\n licenseServers?: IDRMLicenseServer;\n}\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n @ViewChild(VgDASH, { static: false }) vgDash!: VgDASH;\n @ViewChild('media', { static: false }) media!: ElementRef;\n\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() premium = false;\n @Input() srcImageOffline = '';\n\n @Input() currentStream: IMediaStream = {\n type: 'dash',\n label: 'DASH: Media Stream test',\n source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd'\n };\n\n api: VgAPI = new VgAPI();\n\n @Input() isDebug = false;\n\n @Input() paused = false;\n\n @Input() streams: IMediaStream[] = [\n {\n type: 'dash',\n label: 'DASH: Media Stream test',\n source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd'\n }\n ];\n\n @Input() playlist: Array = [];\n\n @Input() play = false;\n @Input() isHidden = false;\n @Input() isShow = true;\n\n @Input() currentIndex = 0;\n @Input() video: ScheduleDto = new ScheduleDto();\n @Input() appBaseUrl: String = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n this.currentStream = this.streams[0];\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n onPlayerReady(api: VgAPI) {\n this.api = api;\n\n this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this));\n }\n\n setBitrate(option: BitrateOption) {\n switch (this.currentStream.type) {\n case 'dash':\n this.vgDash.setBitrate(option);\n break;\n }\n }\n\n nextVideo() {\n this.currentIndex++;\n\n if (this.currentIndex === this.playlist.length) {\n this.currentIndex = 0;\n }\n\n this.video = this.playlist[this.currentIndex];\n }\n\n getPaused() {\n if (this.media && this.media.nativeElement) {\n this.paused = this.media.nativeElement.paused;\n return this.media.nativeElement.paused;\n } else {\n setTimeout(() => {\n return this.getPaused();\n }, 2000);\n }\n }\n\n pause(): void {\n this.media.nativeElement.pause();\n this.getPaused();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n tryAgain() {\n this.imageOffline = true;\n this.isHidden = true;\n console.log('loading...');\n\n setTimeout(() => {\n this.getVideos();\n }, 500);\n }\n\n getVideos(): void {\n if (this.playlist && this.playlist.length > 0) {\n this.imageOffline = false;\n this.video = this.playlist[this.currentIndex];\n\n this.getPosition(this.video);\n } else {\n this.video = new ScheduleDto();\n this.tryAgain();\n }\n }\n\n getPosition(result: ScheduleDto) {\n setTimeout(() => {\n let vid: any = document.getElementById('video_element');\n vid.load();\n\n const now = new Date();\n const currentTime = Math.abs(now.getTime() - new Date(this.video.actualStart).getTime());\n\n console.log('Temos no player: ' + result.url);\n console.log('Início em: ' + currentTime);\n\n this.video.url = result.url;\n vid['currentTime'] = currentTime / 1000;\n\n let promise = vid.play();\n if (promise !== undefined) {\n promise.then((_: any) => {\n // Autoplay started!\n console.log('Estamos ao vivo!');\n }).catch(() => {\n // Autoplay was prevented.\n // Show a \"Play\" button so that user can start playback.\n this.play = true;\n });\n }\n }, 1000);\n }\n\n getMuted(): boolean {\n return this.media && this.media.nativeElement && this.media.nativeElement.muted || false;\n }\n\n getMaximized(): boolean {\n return this.api && this.api.fsAPI && this.api.fsAPI.isFullscreen && this.api.fsAPI.isFullscreen || false;\n }\n\n toggleSound(): void {\n this.media.nativeElement.muted = !this.media.nativeElement.muted;\n }\n\n toggleMaximize(): void {\n this.api.fsAPI.toggleFullscreen(this.media);\n }\n\n showVideoControls(): void {\n this.isHidden = false;\n this.isShow = true;\n }\n\n hideVideoControls(): void {\n this.isHidden = true;\n this.isShow = false;\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\nimport { VgCoreModule } from 'videogular2/compiled/core';\nimport { VgControlsModule } from 'videogular2/compiled/controls';\nimport { VgStreamingModule } from 'videogular2/compiled/streaming';\nimport { VgBufferingModule } from 'videogular2/compiled/buffering';\nimport { VgOverlayPlayModule } from 'videogular2/compiled/overlay-play';\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule,\n VgCoreModule,\n VgControlsModule,\n VgStreamingModule,\n VgBufferingModule,\n VgOverlayPlayModule,\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = () => {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n if (typeof localPlayer.stop === \"function\")\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n"]} \ No newline at end of file diff --git a/dist/dto/schedule-dto.d.ts b/dist/dto/schedule-dto.d.ts new file mode 100644 index 0000000..b46a249 --- /dev/null +++ b/dist/dto/schedule-dto.d.ts @@ -0,0 +1,27 @@ +import { TenantDto } from './tenant-dto'; +export interface IScheduleDto { + id: string | undefined; + tenant: TenantDto | undefined; + name: string | undefined; + description: string | undefined; + url: string | undefined; + duration: number | undefined; + actualStart: Date; + realEnd?: Date | undefined; + isActive: boolean | undefined; +} +export declare class ScheduleDto implements IScheduleDto { + id: string | undefined; + tenant: TenantDto | undefined; + name: string | undefined; + description: string | undefined; + url: string | undefined; + duration: number | undefined; + actualStart: Date; + realEnd?: Date | undefined; + isActive: boolean | undefined; + constructor(data?: IScheduleDto); + static fromJS(data: any): ScheduleDto; + init(data?: any): void; + toJSON(data?: any): any; +} diff --git a/dist/dto/tenant-dto.d.ts b/dist/dto/tenant-dto.d.ts new file mode 100644 index 0000000..631fc88 --- /dev/null +++ b/dist/dto/tenant-dto.d.ts @@ -0,0 +1,25 @@ +import * as moment from 'moment'; +export declare class TenantDto implements ITenantDto { + tenancyName: string | undefined; + name: string | undefined; + connectionString: string | undefined; + editionId: number | undefined; + isActive: boolean; + subscriptionEndDateUtc: moment.Moment | undefined; + isInTrialPeriod: boolean; + id: number; + constructor(data?: ITenantDto); + init(data?: any): void; + static fromJS(data: any): TenantDto; + toJSON(data?: any): any; +} +export interface ITenantDto { + tenancyName: string | undefined; + name: string | undefined; + connectionString: string | undefined; + editionId: number | undefined; + isActive: boolean; + subscriptionEndDateUtc: moment.Moment | undefined; + isInTrialPeriod: boolean; + id: number; +} diff --git a/dist/esm2015/dto/schedule-dto.js b/dist/esm2015/dto/schedule-dto.js new file mode 100644 index 0000000..2670230 --- /dev/null +++ b/dist/esm2015/dto/schedule-dto.js @@ -0,0 +1,44 @@ +export class ScheduleDto { + constructor(data) { + if (data) { + for (let property in data) { + if (data.hasOwnProperty(property)) { + this[property] = data[property]; + } + } + } + } + static fromJS(data) { + data = typeof data === 'object' ? data : {}; + let result = new ScheduleDto(); + result.init(data); + return result; + } + init(data) { + if (data) { + this.id = data['id']; + this.tenant = data['tenant']; + this.name = data['name']; + this.description = data['description']; + this.url = data['url']; + this.duration = data['duration']; + this.actualStart = data['actualStart']; + this.realEnd = data['realEnd']; + this.isActive = data['isActive']; + } + } + toJSON(data) { + data = typeof data === 'object' ? data : {}; + data['id'] = this.id; + data['tenant'] = this.tenant; + data['name'] = this.name; + data['description'] = this.description; + data['url'] = this.url; + data['duration'] = this.duration; + data['actualStart'] = this.actualStart; + data['realEnd'] = this.realEnd; + data['isActive'] = this.isActive; + return data; + } +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGUtZHRvLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3RoaW5rZXIvZGV2L3RoaW5rYW0vbmdDYXN0LyIsInNvdXJjZXMiOlsiZHRvL3NjaGVkdWxlLWR0by50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFjQSxNQUFNLE9BQU8sV0FBVztJQVdwQixZQUFZLElBQW1CO1FBQzNCLElBQUksSUFBSSxFQUFFO1lBQ04sS0FBSyxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7Z0JBQ3ZCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDekIsSUFBSyxDQUFDLFFBQVEsQ0FBQyxHQUFTLElBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDakQ7YUFDSjtTQUNKO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBUztRQUNuQixJQUFJLEdBQUcsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1QyxJQUFJLE1BQU0sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksQ0FBQyxJQUFVO1FBQ1gsSUFBSSxJQUFJLEVBQUU7WUFDTixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNwQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBVTtRQUNiLElBQUksR0FBRyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlbmFudER0byB9IGZyb20gJy4vdGVuYW50LWR0byc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNjaGVkdWxlRHRvIHtcbiAgICBpZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHRlbmFudDogVGVuYW50RHRvIHwgdW5kZWZpbmVkO1xuICAgIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHVybDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGR1cmF0aW9uOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgYWN0dWFsU3RhcnQ6IERhdGU7XG4gICAgcmVhbEVuZD86IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgaXNBY3RpdmU6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBTY2hlZHVsZUR0byBpbXBsZW1lbnRzIElTY2hlZHVsZUR0byB7XG4gICAgaWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB0ZW5hbnQ6IFRlbmFudER0byB8IHVuZGVmaW5lZDtcbiAgICBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB1cmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBkdXJhdGlvbjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGFjdHVhbFN0YXJ0ITogRGF0ZTtcbiAgICByZWFsRW5kPzogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBpc0FjdGl2ZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJU2NoZWR1bGVEdG8pIHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHByb3BlcnR5IGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSlMoZGF0YTogYW55KTogU2NoZWR1bGVEdG8ge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFNjaGVkdWxlRHRvKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGRhdGEpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGluaXQoZGF0YT86IGFueSkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5pZCA9IGRhdGFbJ2lkJ107XG4gICAgICAgICAgICB0aGlzLnRlbmFudCA9IGRhdGFbJ3RlbmFudCddO1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gZGF0YVsnbmFtZSddO1xuICAgICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGFbJ2Rlc2NyaXB0aW9uJ107XG4gICAgICAgICAgICB0aGlzLnVybCA9IGRhdGFbJ3VybCddO1xuICAgICAgICAgICAgdGhpcy5kdXJhdGlvbiA9IGRhdGFbJ2R1cmF0aW9uJ107XG4gICAgICAgICAgICB0aGlzLmFjdHVhbFN0YXJ0ID0gZGF0YVsnYWN0dWFsU3RhcnQnXTtcbiAgICAgICAgICAgIHRoaXMucmVhbEVuZCA9IGRhdGFbJ3JlYWxFbmQnXTtcbiAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSBkYXRhWydpc0FjdGl2ZSddO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG9KU09OKGRhdGE/OiBhbnkpIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgZGF0YVsnaWQnXSA9IHRoaXMuaWQ7XG4gICAgICAgIGRhdGFbJ3RlbmFudCddID0gdGhpcy50ZW5hbnQ7XG4gICAgICAgIGRhdGFbJ25hbWUnXSA9IHRoaXMubmFtZTtcbiAgICAgICAgZGF0YVsnZGVzY3JpcHRpb24nXSA9IHRoaXMuZGVzY3JpcHRpb247XG4gICAgICAgIGRhdGFbJ3VybCddID0gdGhpcy51cmw7XG4gICAgICAgIGRhdGFbJ2R1cmF0aW9uJ10gPSB0aGlzLmR1cmF0aW9uO1xuICAgICAgICBkYXRhWydhY3R1YWxTdGFydCddID0gdGhpcy5hY3R1YWxTdGFydDtcbiAgICAgICAgZGF0YVsncmVhbEVuZCddID0gdGhpcy5yZWFsRW5kO1xuICAgICAgICBkYXRhWydpc0FjdGl2ZSddID0gdGhpcy5pc0FjdGl2ZTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/esm2015/dto/tenant-dto.js b/dist/esm2015/dto/tenant-dto.js new file mode 100644 index 0000000..a1afe07 --- /dev/null +++ b/dist/esm2015/dto/tenant-dto.js @@ -0,0 +1,42 @@ +import * as moment from 'moment'; +export class TenantDto { + constructor(data) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + this[property] = data[property]; + } + } + } + init(data) { + if (data) { + this.tenancyName = data["tenancyName"]; + this.name = data["name"]; + this.connectionString = data["connectionString"]; + this.editionId = data["editionId"]; + this.isActive = data["isActive"]; + this.subscriptionEndDateUtc = data["subscriptionEndDateUtc"] ? moment(data["subscriptionEndDateUtc"].toString()) : undefined; + this.isInTrialPeriod = data["isInTrialPeriod"]; + this.id = data["id"]; + } + } + static fromJS(data) { + data = typeof data === 'object' ? data : {}; + let result = new TenantDto(); + result.init(data); + return result; + } + toJSON(data) { + data = typeof data === 'object' ? data : {}; + data["tenancyName"] = this.tenancyName; + data["name"] = this.name; + data["connectionString"] = this.connectionString; + data["editionId"] = this.editionId; + data["isActive"] = this.isActive; + data["subscriptionEndDateUtc"] = this.subscriptionEndDateUtc ? this.subscriptionEndDateUtc.toISOString() : undefined; + data["isInTrialPeriod"] = this.isInTrialPeriod; + data["id"] = this.id; + return data; + } +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuYW50LWR0by5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS90aGlua2VyL2Rldi90aGlua2FtL25nQ2FzdC8iLCJzb3VyY2VzIjpbImR0by90ZW5hbnQtZHRvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRWpDLE1BQU0sT0FBTyxTQUFTO0lBVXBCLFlBQVksSUFBaUI7UUFDekIsSUFBSSxJQUFJLEVBQUU7WUFDTixLQUFLLElBQUksUUFBUSxJQUFJLElBQUksRUFBRTtnQkFDdkIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztvQkFDdkIsSUFBSyxDQUFDLFFBQVEsQ0FBQyxHQUFTLElBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNyRDtTQUNKO0lBQ0wsQ0FBQztJQUVELElBQUksQ0FBQyxJQUFVO1FBQ1gsSUFBSSxJQUFJLEVBQUU7WUFDTixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQU0sU0FBUyxDQUFDO1lBQ2xJLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDeEI7SUFDTCxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFTO1FBQ25CLElBQUksR0FBRyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVDLElBQUksTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7UUFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxDQUFDLElBQVU7UUFDYixJQUFJLEdBQUcsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDakMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFNLFNBQVMsQ0FBQztRQUMxSCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5leHBvcnQgY2xhc3MgVGVuYW50RHRvIGltcGxlbWVudHMgSVRlbmFudER0byB7XG4gIHRlbmFuY3lOYW1lITogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBuYW1lITogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25uZWN0aW9uU3RyaW5nITogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBlZGl0aW9uSWQhOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGlzQWN0aXZlITogYm9vbGVhbjtcbiAgc3Vic2NyaXB0aW9uRW5kRGF0ZVV0YyE6IG1vbWVudC5Nb21lbnQgfCB1bmRlZmluZWQ7XG4gIGlzSW5UcmlhbFBlcmlvZCE6IGJvb2xlYW47XG4gIGlkITogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE/OiBJVGVuYW50RHRvKSB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKVxuICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgfVxuXG4gIGluaXQoZGF0YT86IGFueSkge1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLnRlbmFuY3lOYW1lID0gZGF0YVtcInRlbmFuY3lOYW1lXCJdO1xuICAgICAgICAgIHRoaXMubmFtZSA9IGRhdGFbXCJuYW1lXCJdO1xuICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN0cmluZyA9IGRhdGFbXCJjb25uZWN0aW9uU3RyaW5nXCJdO1xuICAgICAgICAgIHRoaXMuZWRpdGlvbklkID0gZGF0YVtcImVkaXRpb25JZFwiXTtcbiAgICAgICAgICB0aGlzLmlzQWN0aXZlID0gZGF0YVtcImlzQWN0aXZlXCJdO1xuICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uRW5kRGF0ZVV0YyA9IGRhdGFbXCJzdWJzY3JpcHRpb25FbmREYXRlVXRjXCJdID8gbW9tZW50KGRhdGFbXCJzdWJzY3JpcHRpb25FbmREYXRlVXRjXCJdLnRvU3RyaW5nKCkpIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgICAgdGhpcy5pc0luVHJpYWxQZXJpb2QgPSBkYXRhW1wiaXNJblRyaWFsUGVyaW9kXCJdO1xuICAgICAgICAgIHRoaXMuaWQgPSBkYXRhW1wiaWRcIl07XG4gICAgICB9XG4gIH1cblxuICBzdGF0aWMgZnJvbUpTKGRhdGE6IGFueSk6IFRlbmFudER0byB7XG4gICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgbGV0IHJlc3VsdCA9IG5ldyBUZW5hbnREdG8oKTtcbiAgICAgIHJlc3VsdC5pbml0KGRhdGEpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHRvSlNPTihkYXRhPzogYW55KSB7XG4gICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgZGF0YVtcInRlbmFuY3lOYW1lXCJdID0gdGhpcy50ZW5hbmN5TmFtZTtcbiAgICAgIGRhdGFbXCJuYW1lXCJdID0gdGhpcy5uYW1lO1xuICAgICAgZGF0YVtcImNvbm5lY3Rpb25TdHJpbmdcIl0gPSB0aGlzLmNvbm5lY3Rpb25TdHJpbmc7XG4gICAgICBkYXRhW1wiZWRpdGlvbklkXCJdID0gdGhpcy5lZGl0aW9uSWQ7XG4gICAgICBkYXRhW1wiaXNBY3RpdmVcIl0gPSB0aGlzLmlzQWN0aXZlO1xuICAgICAgZGF0YVtcInN1YnNjcmlwdGlvbkVuZERhdGVVdGNcIl0gPSB0aGlzLnN1YnNjcmlwdGlvbkVuZERhdGVVdGMgPyB0aGlzLnN1YnNjcmlwdGlvbkVuZERhdGVVdGMudG9JU09TdHJpbmcoKSA6IDxhbnk+dW5kZWZpbmVkO1xuICAgICAgZGF0YVtcImlzSW5UcmlhbFBlcmlvZFwiXSA9IHRoaXMuaXNJblRyaWFsUGVyaW9kO1xuICAgICAgZGF0YVtcImlkXCJdID0gdGhpcy5pZDtcbiAgICAgIHJldHVybiBkYXRhO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRlbmFudER0byB7XG4gIHRlbmFuY3lOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29ubmVjdGlvblN0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBlZGl0aW9uSWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgaXNBY3RpdmU6IGJvb2xlYW47XG4gIHN1YnNjcmlwdGlvbkVuZERhdGVVdGM6IG1vbWVudC5Nb21lbnQgfCB1bmRlZmluZWQ7XG4gIGlzSW5UcmlhbFBlcmlvZDogYm9vbGVhbjtcbiAgaWQ6IG51bWJlcjtcbn1cbiJdfQ== \ No newline at end of file diff --git a/dist/esm2015/ng-cast.component.js b/dist/esm2015/ng-cast.component.js index b6d2ac0..718c274 100644 --- a/dist/esm2015/ng-cast.component.js +++ b/dist/esm2015/ng-cast.component.js @@ -1,14 +1,41 @@ -import * as tslib_1 from "tslib"; -import { Component, Input } from '@angular/core'; -let NgCastComponent = class NgCastComponent { +import { Component, Input, ViewChild } from '@angular/core'; +import { NgCastService } from './shared/ng-cast.service'; +import { VgDASH } from 'videogular2/compiled/src/streaming/vg-dash/vg-dash'; +import { VgAPI } from 'videogular2/compiled/core'; +import { ScheduleDto } from './dto/schedule-dto'; +export class NgCastComponent { constructor(ngCastService) { this.ngCastService = ngCastService; this.videoImage = ''; this.imageOffline = false; + this.premium = false; this.srcImageOffline = ''; + this.currentStream = { + type: 'dash', + label: 'DASH: Media Stream test', + source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd' + }; + this.api = new VgAPI(); + this.isDebug = false; + this.paused = false; + this.streams = [ + { + type: 'dash', + label: 'DASH: Media Stream test', + source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd' + } + ]; + this.playlist = []; + this.play = false; + this.isHidden = false; + this.isShow = true; + this.currentIndex = 0; + this.video = new ScheduleDto(); + this.appBaseUrl = ''; } ngOnInit() { this.window = window; + this.currentStream = this.streams[0]; let ngCastService = this.ngCastService; this.window['__onGCastApiAvailable'] = function (isAvailable) { if (isAvailable) { @@ -17,28 +44,135 @@ let NgCastComponent = class NgCastComponent { }; this.castingStatus = this.ngCastService.getStatus(); } + onPlayerReady(api) { + this.api = api; + this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this)); + } + setBitrate(option) { + switch (this.currentStream.type) { + case 'dash': + this.vgDash.setBitrate(option); + break; + } + } + nextVideo() { + this.currentIndex++; + if (this.currentIndex === this.playlist.length) { + this.currentIndex = 0; + } + this.video = this.playlist[this.currentIndex]; + } + getPaused() { + if (this.media && this.media.nativeElement) { + this.paused = this.media.nativeElement.paused; + return this.media.nativeElement.paused; + } + else { + setTimeout(() => { + return this.getPaused(); + }, 2000); + } + } + pause() { + this.media.nativeElement.pause(); + this.getPaused(); + } openSession() { this.ngCastService.discoverDevices(); } closeSession() { this.ngCastService.discoverDevices(); } + tryAgain() { + this.imageOffline = true; + this.isHidden = true; + console.log('loading...'); + setTimeout(() => { + this.getVideos(); + }, 500); + } + getVideos() { + if (this.playlist && this.playlist.length > 0) { + this.imageOffline = false; + this.video = this.playlist[this.currentIndex]; + this.getPosition(this.video); + } + else { + this.video = new ScheduleDto(); + this.tryAgain(); + } + } + getPosition(result) { + setTimeout(() => { + let vid = document.getElementById('video_element'); + vid.load(); + const now = new Date(); + const currentTime = Math.abs(now.getTime() - new Date(this.video.actualStart).getTime()); + console.log('Temos no player: ' + result.url); + console.log('Início em: ' + currentTime); + this.video.url = result.url; + vid['currentTime'] = currentTime / 1000; + let promise = vid.play(); + if (promise !== undefined) { + promise.then((_) => { + // Autoplay started! + console.log('Estamos ao vivo!'); + }).catch(() => { + // Autoplay was prevented. + // Show a "Play" button so that user can start playback. + this.play = true; + }); + } + }, 1000); + } + getMuted() { + return this.media && this.media.nativeElement && this.media.nativeElement.muted || false; + } + getMaximized() { + return this.api && this.api.fsAPI && this.api.fsAPI.isFullscreen && this.api.fsAPI.isFullscreen || false; + } + toggleSound() { + this.media.nativeElement.muted = !this.media.nativeElement.muted; + } + toggleMaximize() { + this.api.fsAPI.toggleFullscreen(this.media); + } + showVideoControls() { + this.isHidden = false; + this.isShow = true; + } + hideVideoControls() { + this.isHidden = true; + this.isShow = false; + } +} +NgCastComponent.decorators = [ + { type: Component, args: [{ + selector: 'ng-cast', + template: "
\n \n \n \n \n \n
\n \n \n
AGORA
\n
\n
\n \n \n \n \n
\n
\n \n \"TV\n \n\n\n
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", + styles: ["#video-container{background-color:#272c34;margin:0 auto;z-index:-1}#video-container vg-scrub-bar-current-time .background{background-color:red}#video-container .hidden{display:none}#video-container .show{display:block}#video-container .video-controls{background:rgba(0,0,0,.5);bottom:0;height:45px;left:0;position:absolute;right:0;transition:all .2s ease}#video-container .video-controls.hide{opacity:0;pointer-events:none}#video-container .video-progress{align-items:right;height:8.4px;position:relative}#video-container .video-progress #seek-tooltip{position:absolute}@media screen and (-webkit-min-device-pixel-ratio:0){#video-container .video-progress input[type=range]{-webkit-appearance:none;background-color:var(--youtube-red);overflow:hidden}#video-container .video-progress input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;color:var(--youtube-red);height:10px;margin-top:-1px}#video-container .video-progress input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--youtube-red);cursor:ew-resize;height:10px;width:10px}}#video-container .video-progress input[type=range]{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-moz-range-progress,#video-container .video-progress input[type=range]::-moz-range-track{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-ms-fill-lower,#video-container .video-progress input[type=range]::-ms-fill-upper{background-color:var(--youtube-red)}#video-container progress{-moz-appearance:none;-webkit-appearance:none;appearance:none;border-radius:2px;height:.5vh;pointer-events:none;position:absolute;top:0;width:100%}#video-container .buttons .video-control{align-items:center;background:none;border:2px solid #fff;border-radius:16px;color:#fff;display:flex;height:32px;justify-content:center;width:32px}#video-container .buttons .video-control i{color:#fff;line-height:16px}#video-container .buttons .video-control-paused{bottom:8px;left:1vw;position:absolute;z-index:1000}#video-container .buttons .video-control-muted{bottom:8px;position:absolute;right:5vw;z-index:1000}#video-container .buttons .video-control-maximized{bottom:8px;position:absolute;right:1vw;z-index:1000}#video-container progress::-webkit-progress-bar{background-color:var(--youtube-red);border-radius:2px}#video-container progress::-webkit-progress-value{background:#fff;border-radius:2px}#video-container progress::-moz-progress-bar{background:#fff;border:1px solid #fff}#video-container .seek{cursor:pointer;height:.5vh;margin:0;position:absolute;top:0;width:100%}#video-container .seek-tooltip{background-color:var(--youtube-red);color:#fff;content:attr(data-title);display:block;font-size:12px;font-weight:700;margin-left:5vw;padding:3px;position:absolute;top:10px}.playlist-item li{color:#fff}.kt-content.kt-grid__item.kt-grid__item--fluid.kt-grid.kt-grid--hor{background-color:#272c34}#kt_header_menu_wrapper{display:none}.kt-header__bottom{display:none!important}.player-wrapper{margin:auto;max-width:500px}.player-wrapper video{width:100%}ul{padding:0}ul li.playlist-item{background:#673ab7;cursor:pointer;list-style:none;margin-bottom:2px;padding:10px}ul li.playlist-item.selected{background-color:#ccc}body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] + },] } +]; +NgCastComponent.ctorParameters = () => [ + { type: NgCastService } +]; +NgCastComponent.propDecorators = { + vgDash: [{ type: ViewChild, args: [VgDASH, { static: false },] }], + media: [{ type: ViewChild, args: ['media', { static: false },] }], + videoImage: [{ type: Input }], + imageOffline: [{ type: Input }], + premium: [{ type: Input }], + srcImageOffline: [{ type: Input }], + currentStream: [{ type: Input }], + isDebug: [{ type: Input }], + paused: [{ type: Input }], + streams: [{ type: Input }], + playlist: [{ type: Input }], + play: [{ type: Input }], + isHidden: [{ type: Input }], + isShow: [{ type: Input }], + currentIndex: [{ type: Input }], + video: [{ type: Input }], + appBaseUrl: [{ type: Input }] }; -tslib_1.__decorate([ - Input() -], NgCastComponent.prototype, "videoImage", void 0); -tslib_1.__decorate([ - Input() -], NgCastComponent.prototype, "imageOffline", void 0); -tslib_1.__decorate([ - Input() -], NgCastComponent.prototype, "srcImageOffline", void 0); -NgCastComponent = tslib_1.__decorate([ - Component({ - selector: 'ng-cast', - template: "
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", - styles: ["body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] - }) -], NgCastComponent); -export { NgCastComponent }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJuZy1jYXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFXekQsSUFBYSxlQUFlLEdBQTVCLE1BQWEsZUFBZTtJQVExQixZQUNVLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBTDdCLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsb0JBQWUsR0FBRyxFQUFFLENBQUM7SUFJMUIsQ0FBQztJQUVMLFFBQVE7UUFDTixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsR0FBRyxVQUFVLFdBQW9CO1lBQ25FLElBQUksV0FBVyxFQUFFO2dCQUNmLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ25DO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkMsQ0FBQztDQUNGLENBQUE7QUE1QlU7SUFBUixLQUFLLEVBQUU7bURBQWlCO0FBQ2hCO0lBQVIsS0FBSyxFQUFFO3FEQUFzQjtBQUNyQjtJQUFSLEtBQUssRUFBRTt3REFBc0I7QUFObkIsZUFBZTtJQVAzQixTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsU0FBUztRQUNuQixvMkNBQXVDOztLQUl4QyxDQUFDO0dBQ1csZUFBZSxDQWdDM0I7U0FoQ1ksZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBOZ0Nhc3RTZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvbmctY2FzdC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctY2FzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZy1jYXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXG4gICAgJy4vbmctY2FzdC5jb21wb25lbnQuc2NzcydcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ0Nhc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBjYXN0aW5nU3RhdHVzOiBhbnk7XG4gIHdpbmRvdzogYW55O1xuXG4gIEBJbnB1dCgpIHZpZGVvSW1hZ2UgPSAnJztcbiAgQElucHV0KCkgaW1hZ2VPZmZsaW5lID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNyY0ltYWdlT2ZmbGluZSA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbmdDYXN0U2VydmljZTogTmdDYXN0U2VydmljZVxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMud2luZG93ID0gd2luZG93O1xuXG4gICAgbGV0IG5nQ2FzdFNlcnZpY2UgPSB0aGlzLm5nQ2FzdFNlcnZpY2U7XG4gICAgdGhpcy53aW5kb3dbJ19fb25HQ2FzdEFwaUF2YWlsYWJsZSddID0gZnVuY3Rpb24gKGlzQXZhaWxhYmxlOiBib29sZWFuKSB7XG4gICAgICBpZiAoaXNBdmFpbGFibGUpIHtcbiAgICAgICAgbmdDYXN0U2VydmljZS5pbml0aWFsaXplQ2FzdEFwaSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmNhc3RpbmdTdGF0dXMgPSB0aGlzLm5nQ2FzdFNlcnZpY2UuZ2V0U3RhdHVzKCk7XG4gIH1cblxuICBvcGVuU2Vzc2lvbigpIHtcbiAgICB0aGlzLm5nQ2FzdFNlcnZpY2UuZGlzY292ZXJEZXZpY2VzKCk7XG4gIH1cblxuICBjbG9zZVNlc3Npb24oKSB7XG4gICAgdGhpcy5uZ0Nhc3RTZXJ2aWNlLmRpc2NvdmVyRGV2aWNlcygpO1xuICB9XG59XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJuZy1jYXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFFaEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXpELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUU1RSxPQUFPLEVBQUUsS0FBSyxFQUFpQixNQUFNLDJCQUEyQixDQUFDO0FBRWpFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQWlCakQsTUFBTSxPQUFPLGVBQWU7SUEwQzFCLFlBQ1UsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFwQzdCLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUVyQixrQkFBYSxHQUFpQjtZQUNyQyxJQUFJLEVBQUUsTUFBTTtZQUNaLEtBQUssRUFBRSx5QkFBeUI7WUFDaEMsTUFBTSxFQUFFLDJEQUEyRDtTQUNwRSxDQUFDO1FBRUYsUUFBRyxHQUFVLElBQUksS0FBSyxFQUFFLENBQUM7UUFFaEIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVoQixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRWYsWUFBTyxHQUFtQjtZQUNqQztnQkFDRSxJQUFJLEVBQUUsTUFBTTtnQkFDWixLQUFLLEVBQUUseUJBQXlCO2dCQUNoQyxNQUFNLEVBQUUsMkRBQTJEO2FBQ3BFO1NBQ0YsQ0FBQztRQUVPLGFBQVEsR0FBdUIsRUFBRSxDQUFDO1FBRWxDLFNBQUksR0FBRyxLQUFLLENBQUM7UUFD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Q0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDOzs7WUE3TEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxTQUFTO2dCQUNuQiw0d0hBQXVDOzthQUl4Qzs7O1lBdEJRLGFBQWE7OztxQkF3Qm5CLFNBQVMsU0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO29CQUNuQyxTQUFTLFNBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTt5QkFLcEMsS0FBSzsyQkFDTCxLQUFLO3NCQUNMLEtBQUs7OEJBQ0wsS0FBSzs0QkFFTCxLQUFLO3NCQVFMLEtBQUs7cUJBRUwsS0FBSztzQkFFTCxLQUFLO3VCQVFMLEtBQUs7bUJBRUwsS0FBSzt1QkFDTCxLQUFLO3FCQUNMLEtBQUs7MkJBRUwsS0FBSztvQkFDTCxLQUFLO3lCQUNMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBOZ0Nhc3RTZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvbmctY2FzdC5zZXJ2aWNlJztcblxuaW1wb3J0IHsgVmdEQVNIIH0gZnJvbSAndmlkZW9ndWxhcjIvY29tcGlsZWQvc3JjL3N0cmVhbWluZy92Zy1kYXNoL3ZnLWRhc2gnO1xuaW1wb3J0IHsgSURSTUxpY2Vuc2VTZXJ2ZXIgfSBmcm9tICd2aWRlb2d1bGFyMi9jb21waWxlZC9zcmMvc3RyZWFtaW5nL3N0cmVhbWluZyc7XG5pbXBvcnQgeyBWZ0FQSSwgQml0cmF0ZU9wdGlvbiB9IGZyb20gJ3ZpZGVvZ3VsYXIyL2NvbXBpbGVkL2NvcmUnO1xuXG5pbXBvcnQgeyBTY2hlZHVsZUR0byB9IGZyb20gJy4vZHRvL3NjaGVkdWxlLWR0byc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lZGlhU3RyZWFtIHtcbiAgdHlwZTogJ3ZvZCcgfCAnZGFzaCc7XG4gIHNvdXJjZTogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICB0b2tlbj86IHN0cmluZztcbiAgbGljZW5zZVNlcnZlcnM/OiBJRFJNTGljZW5zZVNlcnZlcjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctY2FzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZy1jYXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXG4gICAgJy4vbmctY2FzdC5jb21wb25lbnQuc2NzcydcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ0Nhc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBAVmlld0NoaWxkKFZnREFTSCwgeyBzdGF0aWM6IGZhbHNlIH0pIHZnRGFzaCE6IFZnREFTSDtcbiAgQFZpZXdDaGlsZCgnbWVkaWEnLCB7IHN0YXRpYzogZmFsc2UgfSkgbWVkaWEhOiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+O1xuXG4gIGNhc3RpbmdTdGF0dXM6IGFueTtcbiAgd2luZG93OiBhbnk7XG5cbiAgQElucHV0KCkgdmlkZW9JbWFnZSA9ICcnO1xuICBASW5wdXQoKSBpbWFnZU9mZmxpbmUgPSBmYWxzZTtcbiAgQElucHV0KCkgcHJlbWl1bSA9IGZhbHNlO1xuICBASW5wdXQoKSBzcmNJbWFnZU9mZmxpbmUgPSAnJztcblxuICBASW5wdXQoKSBjdXJyZW50U3RyZWFtOiBJTWVkaWFTdHJlYW0gPSB7XG4gICAgdHlwZTogJ2Rhc2gnLFxuICAgIGxhYmVsOiAnREFTSDogTWVkaWEgU3RyZWFtIHRlc3QnLFxuICAgIHNvdXJjZTogJ2h0dHA6Ly9saXZlc2ltLmRhc2hpZi5vcmcvbGl2ZXNpbS90ZXN0cGljXzJzL01hbmlmZXN0Lm1wZCdcbiAgfTtcblxuICBhcGk6IFZnQVBJID0gbmV3IFZnQVBJKCk7XG5cbiAgQElucHV0KCkgaXNEZWJ1ZyA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHBhdXNlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHN0cmVhbXM6IElNZWRpYVN0cmVhbVtdID0gW1xuICAgIHtcbiAgICAgIHR5cGU6ICdkYXNoJyxcbiAgICAgIGxhYmVsOiAnREFTSDogTWVkaWEgU3RyZWFtIHRlc3QnLFxuICAgICAgc291cmNlOiAnaHR0cDovL2xpdmVzaW0uZGFzaGlmLm9yZy9saXZlc2ltL3Rlc3RwaWNfMnMvTWFuaWZlc3QubXBkJ1xuICAgIH1cbiAgXTtcblxuICBASW5wdXQoKSBwbGF5bGlzdDogQXJyYXk8U2NoZWR1bGVEdG8+ID0gW107XG5cbiAgQElucHV0KCkgcGxheSA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0hpZGRlbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc1Nob3cgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIGN1cnJlbnRJbmRleCA9IDA7XG4gIEBJbnB1dCgpIHZpZGVvOiBTY2hlZHVsZUR0byA9IG5ldyBTY2hlZHVsZUR0bygpO1xuICBASW5wdXQoKSBhcHBCYXNlVXJsOiBTdHJpbmcgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nQ2FzdFNlcnZpY2U6IE5nQ2FzdFNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLndpbmRvdyA9IHdpbmRvdztcbiAgICB0aGlzLmN1cnJlbnRTdHJlYW0gPSB0aGlzLnN0cmVhbXNbMF07XG5cbiAgICBsZXQgbmdDYXN0U2VydmljZSA9IHRoaXMubmdDYXN0U2VydmljZTtcbiAgICB0aGlzLndpbmRvd1snX19vbkdDYXN0QXBpQXZhaWxhYmxlJ10gPSBmdW5jdGlvbiAoaXNBdmFpbGFibGU6IGJvb2xlYW4pIHtcbiAgICAgIGlmIChpc0F2YWlsYWJsZSkge1xuICAgICAgICBuZ0Nhc3RTZXJ2aWNlLmluaXRpYWxpemVDYXN0QXBpKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuY2FzdGluZ1N0YXR1cyA9IHRoaXMubmdDYXN0U2VydmljZS5nZXRTdGF0dXMoKTtcbiAgfVxuXG4gIG9uUGxheWVyUmVhZHkoYXBpOiBWZ0FQSSkge1xuICAgIHRoaXMuYXBpID0gYXBpO1xuXG4gICAgdGhpcy5hcGkuZ2V0RGVmYXVsdE1lZGlhKCkuc3Vic2NyaXB0aW9ucy5lbmRlZC5zdWJzY3JpYmUodGhpcy5uZXh0VmlkZW8uYmluZCh0aGlzKSk7XG4gIH1cblxuICBzZXRCaXRyYXRlKG9wdGlvbjogQml0cmF0ZU9wdGlvbikge1xuICAgIHN3aXRjaCAodGhpcy5jdXJyZW50U3RyZWFtLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2Rhc2gnOlxuICAgICAgICB0aGlzLnZnRGFzaC5zZXRCaXRyYXRlKG9wdGlvbik7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG5leHRWaWRlbygpIHtcbiAgICB0aGlzLmN1cnJlbnRJbmRleCsrO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudEluZGV4ID09PSB0aGlzLnBsYXlsaXN0Lmxlbmd0aCkge1xuICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSAwO1xuICAgIH1cblxuICAgIHRoaXMudmlkZW8gPSB0aGlzLnBsYXlsaXN0W3RoaXMuY3VycmVudEluZGV4XTtcbiAgfVxuXG4gIGdldFBhdXNlZCgpIHtcbiAgICBpZiAodGhpcy5tZWRpYSAmJiB0aGlzLm1lZGlhLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMucGF1c2VkID0gdGhpcy5tZWRpYS5uYXRpdmVFbGVtZW50LnBhdXNlZDtcbiAgICAgIHJldHVybiB0aGlzLm1lZGlhLm5hdGl2ZUVsZW1lbnQucGF1c2VkO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGF1c2VkKCk7XG4gICAgICB9LCAyMDAwKTtcbiAgICB9XG4gIH1cblxuICBwYXVzZSgpOiB2b2lkIHtcbiAgICB0aGlzLm1lZGlhLm5hdGl2ZUVsZW1lbnQucGF1c2UoKTtcbiAgICB0aGlzLmdldFBhdXNlZCgpO1xuICB9XG5cbiAgb3BlblNlc3Npb24oKSB7XG4gICAgdGhpcy5uZ0Nhc3RTZXJ2aWNlLmRpc2NvdmVyRGV2aWNlcygpO1xuICB9XG5cbiAgY2xvc2VTZXNzaW9uKCkge1xuICAgIHRoaXMubmdDYXN0U2VydmljZS5kaXNjb3ZlckRldmljZXMoKTtcbiAgfVxuXG4gIHRyeUFnYWluKCkge1xuICAgIHRoaXMuaW1hZ2VPZmZsaW5lID0gdHJ1ZTtcbiAgICB0aGlzLmlzSGlkZGVuID0gdHJ1ZTtcbiAgICBjb25zb2xlLmxvZygnbG9hZGluZy4uLicpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmdldFZpZGVvcygpO1xuICAgIH0sIDUwMCk7XG4gIH1cblxuICBnZXRWaWRlb3MoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGxheWxpc3QgJiYgdGhpcy5wbGF5bGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmltYWdlT2ZmbGluZSA9IGZhbHNlO1xuICAgICAgdGhpcy52aWRlbyA9IHRoaXMucGxheWxpc3RbdGhpcy5jdXJyZW50SW5kZXhdO1xuXG4gICAgICB0aGlzLmdldFBvc2l0aW9uKHRoaXMudmlkZW8pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZpZGVvID0gbmV3IFNjaGVkdWxlRHRvKCk7XG4gICAgICB0aGlzLnRyeUFnYWluKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UG9zaXRpb24ocmVzdWx0OiBTY2hlZHVsZUR0bykge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgbGV0IHZpZDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZpZGVvX2VsZW1lbnQnKTtcbiAgICAgIHZpZC5sb2FkKCk7XG5cbiAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCBjdXJyZW50VGltZSA9IE1hdGguYWJzKG5vdy5nZXRUaW1lKCkgLSBuZXcgRGF0ZSh0aGlzLnZpZGVvLmFjdHVhbFN0YXJ0KS5nZXRUaW1lKCkpO1xuXG4gICAgICBjb25zb2xlLmxvZygnVGVtb3Mgbm8gcGxheWVyOiAnICsgcmVzdWx0LnVybCk7XG4gICAgICBjb25zb2xlLmxvZygnSW7DrWNpbyBlbTogJyArIGN1cnJlbnRUaW1lKTtcblxuICAgICAgdGhpcy52aWRlby51cmwgPSByZXN1bHQudXJsO1xuICAgICAgdmlkWydjdXJyZW50VGltZSddID0gY3VycmVudFRpbWUgLyAxMDAwO1xuXG4gICAgICBsZXQgcHJvbWlzZSA9IHZpZC5wbGF5KCk7XG4gICAgICBpZiAocHJvbWlzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb21pc2UudGhlbigoXzogYW55KSA9PiB7XG4gICAgICAgICAgLy8gQXV0b3BsYXkgc3RhcnRlZCFcbiAgICAgICAgICBjb25zb2xlLmxvZygnRXN0YW1vcyBhbyB2aXZvIScpO1xuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gQXV0b3BsYXkgd2FzIHByZXZlbnRlZC5cbiAgICAgICAgICAvLyBTaG93IGEgXCJQbGF5XCIgYnV0dG9uIHNvIHRoYXQgdXNlciBjYW4gc3RhcnQgcGxheWJhY2suXG4gICAgICAgICAgdGhpcy5wbGF5ID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICBnZXRNdXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tZWRpYSAmJiB0aGlzLm1lZGlhLm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5tZWRpYS5uYXRpdmVFbGVtZW50Lm11dGVkIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0TWF4aW1pemVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFwaSAmJiB0aGlzLmFwaS5mc0FQSSAmJiB0aGlzLmFwaS5mc0FQSS5pc0Z1bGxzY3JlZW4gJiYgdGhpcy5hcGkuZnNBUEkuaXNGdWxsc2NyZWVuIHx8IGZhbHNlO1xuICB9XG5cbiAgdG9nZ2xlU291bmQoKTogdm9pZCB7XG4gICAgdGhpcy5tZWRpYS5uYXRpdmVFbGVtZW50Lm11dGVkID0gIXRoaXMubWVkaWEubmF0aXZlRWxlbWVudC5tdXRlZDtcbiAgfVxuXG4gIHRvZ2dsZU1heGltaXplKCk6IHZvaWQge1xuICAgIHRoaXMuYXBpLmZzQVBJLnRvZ2dsZUZ1bGxzY3JlZW4odGhpcy5tZWRpYSk7XG4gIH1cblxuICBzaG93VmlkZW9Db250cm9scygpOiB2b2lkIHtcbiAgICB0aGlzLmlzSGlkZGVuID0gZmFsc2U7XG4gICAgdGhpcy5pc1Nob3cgPSB0cnVlO1xuICB9XG5cbiAgaGlkZVZpZGVvQ29udHJvbHMoKTogdm9pZCB7XG4gICAgdGhpcy5pc0hpZGRlbiA9IHRydWU7XG4gICAgdGhpcy5pc1Nob3cgPSBmYWxzZTtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/dist/esm2015/ng.cast.module.js b/dist/esm2015/ng.cast.module.js index 6861006..a81df8e 100644 --- a/dist/esm2015/ng.cast.module.js +++ b/dist/esm2015/ng.cast.module.js @@ -1,20 +1,28 @@ -import * as tslib_1 from "tslib"; import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { NgCastComponent } from './ng-cast.component'; import { NgCastService } from './shared/ng-cast.service'; -let NgCastModule = class NgCastModule { -}; -NgCastModule = tslib_1.__decorate([ - NgModule({ - schemas: [CUSTOM_ELEMENTS_SCHEMA], - imports: [ - CommonModule - ], - exports: [NgCastComponent], - providers: [NgCastService], - declarations: [NgCastComponent] - }) -], NgCastModule); -export { NgCastModule }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmcuY2FzdC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJuZy5jYXN0Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQVl6RCxJQUFhLFlBQVksR0FBekIsTUFBYSxZQUFZO0NBQUksQ0FBQTtBQUFoQixZQUFZO0lBVHhCLFFBQVEsQ0FBQztRQUNSLE9BQU8sRUFBRSxDQUFFLHNCQUFzQixDQUFFO1FBQ25DLE9BQU8sRUFBRTtZQUNQLFlBQVk7U0FDYjtRQUNELE9BQU8sRUFBRSxDQUFDLGVBQWUsQ0FBQztRQUMxQixTQUFTLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDMUIsWUFBWSxFQUFFLENBQUMsZUFBZSxDQUFDO0tBQ2hDLENBQUM7R0FDVyxZQUFZLENBQUk7U0FBaEIsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdDYXN0Q29tcG9uZW50IH0gZnJvbSAnLi9uZy1jYXN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ0Nhc3RTZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvbmctY2FzdC5zZXJ2aWNlJztcblxuXG5ATmdNb2R1bGUoe1xuICBzY2hlbWFzOiBbIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEgXSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZVxuICBdLFxuICBleHBvcnRzOiBbTmdDYXN0Q29tcG9uZW50XSxcbiAgcHJvdmlkZXJzOiBbTmdDYXN0U2VydmljZV0sXG4gIGRlY2xhcmF0aW9uczogW05nQ2FzdENvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgTmdDYXN0TW9kdWxlIHsgfVxuIl19 \ No newline at end of file +import { VgCoreModule } from 'videogular2/compiled/core'; +import { VgControlsModule } from 'videogular2/compiled/controls'; +import { VgStreamingModule } from 'videogular2/compiled/streaming'; +import { VgBufferingModule } from 'videogular2/compiled/buffering'; +import { VgOverlayPlayModule } from 'videogular2/compiled/overlay-play'; +export class NgCastModule { +} +NgCastModule.decorators = [ + { type: NgModule, args: [{ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [ + CommonModule, + VgCoreModule, + VgControlsModule, + VgStreamingModule, + VgBufferingModule, + VgOverlayPlayModule, + ], + exports: [NgCastComponent], + providers: [NgCastService], + declarations: [NgCastComponent] + },] } +]; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmcuY2FzdC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJuZy5jYXN0Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXpELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQWdCeEUsTUFBTSxPQUFPLFlBQVk7OztZQWR4QixRQUFRLFNBQUM7Z0JBQ1IsT0FBTyxFQUFFLENBQUUsc0JBQXNCLENBQUU7Z0JBQ25DLE9BQU8sRUFBRTtvQkFDUCxZQUFZO29CQUNaLFlBQVk7b0JBQ1osZ0JBQWdCO29CQUNoQixpQkFBaUI7b0JBQ2pCLGlCQUFpQjtvQkFDakIsbUJBQW1CO2lCQUNwQjtnQkFDRCxPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUM7Z0JBQzFCLFNBQVMsRUFBRSxDQUFDLGFBQWEsQ0FBQztnQkFDMUIsWUFBWSxFQUFFLENBQUMsZUFBZSxDQUFDO2FBQ2hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSwgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ0Nhc3RDb21wb25lbnQgfSBmcm9tICcuL25nLWNhc3QuY29tcG9uZW50JztcbmltcG9ydCB7IE5nQ2FzdFNlcnZpY2UgfSBmcm9tICcuL3NoYXJlZC9uZy1jYXN0LnNlcnZpY2UnO1xuXG5pbXBvcnQgeyBWZ0NvcmVNb2R1bGUgfSBmcm9tICd2aWRlb2d1bGFyMi9jb21waWxlZC9jb3JlJztcbmltcG9ydCB7IFZnQ29udHJvbHNNb2R1bGUgfSBmcm9tICd2aWRlb2d1bGFyMi9jb21waWxlZC9jb250cm9scyc7XG5pbXBvcnQgeyBWZ1N0cmVhbWluZ01vZHVsZSB9IGZyb20gJ3ZpZGVvZ3VsYXIyL2NvbXBpbGVkL3N0cmVhbWluZyc7XG5pbXBvcnQgeyBWZ0J1ZmZlcmluZ01vZHVsZSB9IGZyb20gJ3ZpZGVvZ3VsYXIyL2NvbXBpbGVkL2J1ZmZlcmluZyc7XG5pbXBvcnQgeyBWZ092ZXJsYXlQbGF5TW9kdWxlIH0gZnJvbSAndmlkZW9ndWxhcjIvY29tcGlsZWQvb3ZlcmxheS1wbGF5JztcblxuQE5nTW9kdWxlKHtcbiAgc2NoZW1hczogWyBDVVNUT01fRUxFTUVOVFNfU0NIRU1BIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgVmdDb3JlTW9kdWxlLFxuICAgIFZnQ29udHJvbHNNb2R1bGUsXG4gICAgVmdTdHJlYW1pbmdNb2R1bGUsXG4gICAgVmdCdWZmZXJpbmdNb2R1bGUsXG4gICAgVmdPdmVybGF5UGxheU1vZHVsZSxcbiAgXSxcbiAgZXhwb3J0czogW05nQ2FzdENvbXBvbmVudF0sXG4gIHByb3ZpZGVyczogW05nQ2FzdFNlcnZpY2VdLFxuICBkZWNsYXJhdGlvbnM6IFtOZ0Nhc3RDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIE5nQ2FzdE1vZHVsZSB7IH1cbiJdfQ== \ No newline at end of file diff --git a/dist/esm2015/shared/ng-cast.service.js b/dist/esm2015/shared/ng-cast.service.js index 4d7b209..4d47346 100644 --- a/dist/esm2015/shared/ng-cast.service.js +++ b/dist/esm2015/shared/ng-cast.service.js @@ -1,7 +1,6 @@ -import * as tslib_1 from "tslib"; import { Injectable } from '@angular/core'; import { Subject } from 'rxjs'; -let NgCastService = class NgCastService { +export class NgCastService { constructor() { this.window = window; this.status = { @@ -77,9 +76,9 @@ let NgCastService = class NgCastService { getStatus() { return this.status; } -}; -NgCastService = tslib_1.__decorate([ - Injectable() -], NgCastService); -export { NgCastService }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3RoaW5rZXIvZGV2L3RoaW5rYW0vbmdDYXN0LyIsInNvdXJjZXMiOlsic2hhcmVkL25nLWNhc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBTy9CLElBQWEsYUFBYSxHQUExQixNQUFhLGFBQWE7SUFTeEI7UUFOUSxXQUFNLEdBQVEsTUFBTSxDQUFDO1FBRXRCLFdBQU0sR0FBRztZQUNkLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztRQWtCRixrQkFBYSxHQUFHO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQztRQUVGLFlBQU8sR0FBRyxVQUFVLEdBQVE7WUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUM7UUFFRixvQkFBZSxHQUFHLEdBQUcsRUFBRTtZQUNyQixJQUFJLElBQUksR0FBUSxJQUFJLENBQUM7WUFDckIsSUFBSSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QixDQUFDLEVBQUUsVUFBVSxHQUFRO2dCQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO29CQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztvQkFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDckI7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsRUFBRSxHQUFHLENBQUMsQ0FBQztpQkFDckQ7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO1FBRUYsc0JBQWlCLEdBQUcsQ0FBQyxVQUFpQixFQUFFLEVBQUU7WUFDeEMsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4RCxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLDRFQUE0RSxDQUFDLENBQUM7WUFDekcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFNUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztZQUV4RCxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNsRCxDQUFDLENBQUM7UUFVRixTQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ1YsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDO1FBRUYsVUFBSyxHQUFHLEdBQUcsRUFBRTtZQUNYLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQztRQUVGLFNBQUksR0FBRyxHQUFHLEVBQUU7WUFDVixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUM7UUFFRixpQkFBWSxHQUFHLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUM7UUEzRUEsVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUc7WUFDaEMsVUFBVSxFQUFFLEVBQUU7U0FDZixDQUFDO0lBQ0osQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdkMsSUFBSSxjQUFjLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM5RCxJQUFJLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFDcEQsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUNULENBQUMsTUFBVyxFQUFFLEVBQUUsR0FBRyxJQUFJLE1BQU0sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUNsRixDQUFDO1FBQ0YsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFBQSxDQUFDO0lBd0NGLFVBQVUsQ0FBQyxhQUFrQjtRQUMzQixJQUFJLGFBQWEsRUFBRTtZQUNqQixVQUFVLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3JDLFVBQVUsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN6QyxVQUFVLENBQUMsVUFBVSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDOUM7SUFDSCxDQUFDO0lBa0JELFVBQVUsQ0FBQyxLQUFVO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUM1QixVQUFVLENBQUMsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUE7SUFDcEIsQ0FBQztDQUNGLENBQUE7QUEvRlksYUFBYTtJQUR6QixVQUFVLEVBQUU7R0FDQSxhQUFhLENBK0Z6QjtTQS9GWSxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgdmFyIENhc3RQbGF5ZXI6IGFueTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5nQ2FzdFNlcnZpY2Uge1xuICBwcml2YXRlIGNhc3Q6IGFueTtcbiAgcHJpdmF0ZSBjdXJyZW50TWVkaWE6IGFueTtcbiAgcHJpdmF0ZSB3aW5kb3c6IGFueSA9IHdpbmRvdztcblxuICBwdWJsaWMgc3RhdHVzID0ge1xuICAgIGNhc3Rpbmc6IGZhbHNlXG4gIH07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLm1lZGlhSlNPTiA9IHtcbiAgICAgIGNhdGVnb3JpZXM6IFtdXG4gICAgfTtcbiAgfVxuXG4gIGluaXRpYWxpemVDYXN0QXBpKCkge1xuICAgIHRoaXMuY2FzdCA9IHRoaXMud2luZG93WydjaHJvbWUnXS5jYXN0O1xuICAgIGxldCBzZXNzaW9uUmVxdWVzdCA9IG5ldyB0aGlzLmNhc3QuU2Vzc2lvblJlcXVlc3QoJzRGOEIzNDgzJyk7XG4gICAgbGV0IGFwaUNvbmZpZyA9IG5ldyB0aGlzLmNhc3QuQXBpQ29uZmlnKHNlc3Npb25SZXF1ZXN0LFxuICAgICAgKCkgPT4geyB9LFxuICAgICAgKHN0YXR1czogYW55KSA9PiB7IGlmIChzdGF0dXMgPT09IHRoaXMuY2FzdC5SZWNlaXZlckF2YWlsYWJpbGl0eS5BVkFJTEFCTEUpIHsgfSB9XG4gICAgKTtcbiAgICBsZXQgeCA9IHRoaXMuY2FzdC5pbml0aWFsaXplKGFwaUNvbmZpZywgdGhpcy5vbkluaXRTdWNjZXNzLCB0aGlzLm9uRXJyb3IpO1xuICB9O1xuXG4gIG9uSW5pdFN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc29sZS5sb2coJ0dDYXN0IGluaXRpYWxpemF0aW9uIHN1Y2Nlc3MnKTtcbiAgfTtcblxuICBvbkVycm9yID0gZnVuY3Rpb24gKGVycjogYW55KSB7XG4gICAgY29uc29sZS5sb2coJ0dDYXN0IGluaXRpYWxpemF0aW9uIGZhaWxlZCcsIGVycik7XG4gIH07XG5cbiAgZGlzY292ZXJEZXZpY2VzID0gKCkgPT4ge1xuICAgIGxldCBzZWxmOiBhbnkgPSB0aGlzO1xuICAgIGxldCBzdWJqID0gbmV3IFN1YmplY3QoKTtcbiAgICB0aGlzLmNhc3QucmVxdWVzdFNlc3Npb24oKHM6IGFueSkgPT4ge1xuICAgICAgc2VsZi5zZXNzaW9uID0gcztcbiAgICAgIHNlbGYuc2V0Q2FzdGluZyh0cnVlKTtcbiAgICAgIHN1YmoubmV4dCgnQ09OTkVDVEVEJyk7XG4gICAgfSwgZnVuY3Rpb24gKGVycjogYW55KSB7XG4gICAgICBzZWxmLnNldENhc3RpbmcoZmFsc2UpO1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnY2FuY2VsJykge1xuICAgICAgICBzZWxmLnNlc3Npb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHN1YmoubmV4dCgnQ0FOQ0VMJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzZWxlY3RpbmcgYSBjYXN0IGRldmljZScsIGVycik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHN1Ymo7XG4gIH07XG5cbiAgb25NZWRpYURpc2NvdmVyZWQgPSAoY2F0ZWdvcmllczogYW55W10pID0+IHtcbiAgICBsZXQgc2NyaXB0ID0gd2luZG93Wydkb2N1bWVudCddLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9qYXZhc2NyaXB0Jyk7XG4gICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgnc3JjJywgJ2h0dHBzOi8vd3d3LmdzdGF0aWMuY29tL2N2L2pzL3NlbmRlci92MS9jYXN0X3NlbmRlci5qcz9sb2FkQ2FzdEZyYW1ld29yaz0xJyk7XG4gICAgd2luZG93Wydkb2N1bWVudCddLmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcblxuICAgIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5tZWRpYUpTT04uY2F0ZWdvcmllcyA9IGNhdGVnb3JpZXM7XG5cbiAgICByZXR1cm4gZ2xvYmFsVGhpcy5DYXN0UGxheWVyLmFkZE1lZGlhQ29udGVudHMoKTtcbiAgfTtcblxuICBpbml0aWFsaXplKG1lZGlhQ29udGVudHM6IGFueSk6IHZvaWQge1xuICAgIGlmIChtZWRpYUNvbnRlbnRzKSB7XG4gICAgICBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIuaW5pdGlhbGl6ZVVJKCk7XG4gICAgICBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIuc2V0dXBMb2NhbFBsYXllcigpO1xuICAgICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLmluaXRpYWxpemVDYXN0UGxheWVyKCk7XG4gICAgfVxuICB9XG5cbiAgcGxheSA9ICgpID0+IHtcbiAgICB0aGlzLmN1cnJlbnRNZWRpYS5wbGF5KG51bGwpO1xuICB9O1xuXG4gIHBhdXNlID0gKCkgPT4ge1xuICAgIHRoaXMuY3VycmVudE1lZGlhLnBhdXNlKG51bGwpO1xuICB9O1xuXG4gIHN0b3AgPSAoKSA9PiB7XG4gICAgdGhpcy5jdXJyZW50TWVkaWEuc3RvcChudWxsKTtcbiAgfTtcblxuICBvbk1lZGlhRXJyb3IgPSAoZXJyOiBhbnkpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsYXVuY2hpbmcgbWVkaWEnLCBlcnIpO1xuICB9O1xuXG4gIHNldENhc3RpbmcodmFsdWU6IGFueSkge1xuICAgIHRoaXMuc3RhdHVzLmNhc3RpbmcgPSB2YWx1ZTtcbiAgICBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIuc2V0dXBSZW1vdGVQbGF5ZXIoKTtcbiAgfVxuXG4gIGdldFN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0dXNcbiAgfVxufVxuIl19 \ No newline at end of file +} +NgCastService.decorators = [ + { type: Injectable } +]; +NgCastService.ctorParameters = () => []; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Ii9ob21lL3RoaW5rZXIvZGV2L3RoaW5rYW0vbmdDYXN0LyIsInNvdXJjZXMiOlsic2hhcmVkL25nLWNhc3Quc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFPL0IsTUFBTSxPQUFPLGFBQWE7SUFTeEI7UUFOUSxXQUFNLEdBQVEsTUFBTSxDQUFDO1FBRXRCLFdBQU0sR0FBRztZQUNkLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztRQWtCRixrQkFBYSxHQUFHO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQztRQUVGLFlBQU8sR0FBRyxVQUFVLEdBQVE7WUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUM7UUFFRixvQkFBZSxHQUFHLEdBQUcsRUFBRTtZQUNyQixJQUFJLElBQUksR0FBUSxJQUFJLENBQUM7WUFDckIsSUFBSSxJQUFJLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN6QixDQUFDLEVBQUUsVUFBVSxHQUFRO2dCQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO29CQUN6QixJQUFJLENB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VSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUE7SUFDcEIsQ0FBQzs7O1lBL0ZGLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICB2YXIgQ2FzdFBsYXllcjogYW55O1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTmdDYXN0U2VydmljZSB7XG4gIHByaXZhdGUgY2FzdDogYW55O1xuICBwcml2YXRlIGN1cnJlbnRNZWRpYTogYW55O1xuICBwcml2YXRlIHdpbmRvdzogYW55ID0gd2luZG93O1xuXG4gIHB1YmxpYyBzdGF0dXMgPSB7XG4gICAgY2FzdGluZzogZmFsc2VcbiAgfTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIubWVkaWFKU09OID0ge1xuICAgICAgY2F0ZWdvcmllczogW11cbiAgICB9O1xuICB9XG5cbiAgaW5pdGlhbGl6ZUNhc3RBcGkoKSB7XG4gICAgdGhpcy5jYXN0ID0gdGhpcy53aW5kb3dbJ2Nocm9tZSddLmNhc3Q7XG4gICAgbGV0IHNlc3Npb25SZXF1ZXN0ID0gbmV3IHRoaXMuY2FzdC5TZXNzaW9uUmVxdWVzdCgnNEY4QjM0ODMnKTtcbiAgICBsZXQgYXBpQ29uZmlnID0gbmV3IHRoaXMuY2FzdC5BcGlDb25maWcoc2Vzc2lvblJlcXVlc3QsXG4gICAgICAoKSA9PiB7IH0sXG4gICAgICAoc3RhdHVzOiBhbnkpID0+IHsgaWYgKHN0YXR1cyA9PT0gdGhpcy5jYXN0LlJlY2VpdmVyQXZhaWxhYmlsaXR5LkFWQUlMQUJMRSkgeyB9IH1cbiAgICApO1xuICAgIGxldCB4ID0gdGhpcy5jYXN0LmluaXRpYWxpemUoYXBpQ29uZmlnLCB0aGlzLm9uSW5pdFN1Y2Nlc3MsIHRoaXMub25FcnJvcik7XG4gIH07XG5cbiAgb25Jbml0U3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zb2xlLmxvZygnR0Nhc3QgaW5pdGlhbGl6YXRpb24gc3VjY2VzcycpO1xuICB9O1xuXG4gIG9uRXJyb3IgPSBmdW5jdGlvbiAoZXJyOiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZygnR0Nhc3QgaW5pdGlhbGl6YXRpb24gZmFpbGVkJywgZXJyKTtcbiAgfTtcblxuICBkaXNjb3ZlckRldmljZXMgPSAoKSA9PiB7XG4gICAgbGV0IHNlbGY6IGFueSA9IHRoaXM7XG4gICAgbGV0IHN1YmogPSBuZXcgU3ViamVjdCgpO1xuICAgIHRoaXMuY2FzdC5yZXF1ZXN0U2Vzc2lvbigoczogYW55KSA9PiB7XG4gICAgICBzZWxmLnNlc3Npb24gPSBzO1xuICAgICAgc2VsZi5zZXRDYXN0aW5nKHRydWUpO1xuICAgICAgc3Viai5uZXh0KCdDT05ORUNURUQnKTtcbiAgICB9LCBmdW5jdGlvbiAoZXJyOiBhbnkpIHtcbiAgICAgIHNlbGYuc2V0Q2FzdGluZyhmYWxzZSk7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdjYW5jZWwnKSB7XG4gICAgICAgIHNlbGYuc2Vzc2lvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgc3Viai5uZXh0KCdDQU5DRUwnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHNlbGVjdGluZyBhIGNhc3QgZGV2aWNlJywgZXJyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3ViajtcbiAgfTtcblxuICBvbk1lZGlhRGlzY292ZXJlZCA9IChjYXRlZ29yaWVzOiBhbnlbXSkgPT4ge1xuICAgIGxldCBzY3JpcHQgPSB3aW5kb3dbJ2RvY3VtZW50J10uY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgc2NyaXB0LnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2phdmFzY3JpcHQnKTtcbiAgICBzY3JpcHQuc2V0QXR0cmlidXRlKCdzcmMnLCAnaHR0cHM6Ly93d3cuZ3N0YXRpYy5jb20vY3YvanMvc2VuZGVyL3YxL2Nhc3Rfc2VuZGVyLmpzP2xvYWRDYXN0RnJhbWV3b3JrPTEnKTtcbiAgICB3aW5kb3dbJ2RvY3VtZW50J10uYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuXG4gICAgZ2xvYmFsVGhpcy5DYXN0UGxheWVyLm1lZGlhSlNPTi5jYXRlZ29yaWVzID0gY2F0ZWdvcmllcztcblxuICAgIHJldHVybiBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIuYWRkTWVkaWFDb250ZW50cygpO1xuICB9O1xuXG4gIGluaXRpYWxpemUobWVkaWFDb250ZW50czogYW55KTogdm9pZCB7XG4gICAgaWYgKG1lZGlhQ29udGVudHMpIHtcbiAgICAgIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5pbml0aWFsaXplVUkoKTtcbiAgICAgIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5zZXR1cExvY2FsUGxheWVyKCk7XG4gICAgICBnbG9iYWxUaGlzLkNhc3RQbGF5ZXIuaW5pdGlhbGl6ZUNhc3RQbGF5ZXIoKTtcbiAgICB9XG4gIH1cblxuICBwbGF5ID0gKCkgPT4ge1xuICAgIHRoaXMuY3VycmVudE1lZGlhLnBsYXkobnVsbCk7XG4gIH07XG5cbiAgcGF1c2UgPSAoKSA9PiB7XG4gICAgdGhpcy5jdXJyZW50TWVkaWEucGF1c2UobnVsbCk7XG4gIH07XG5cbiAgc3RvcCA9ICgpID0+IHtcbiAgICB0aGlzLmN1cnJlbnRNZWRpYS5zdG9wKG51bGwpO1xuICB9O1xuXG4gIG9uTWVkaWFFcnJvciA9IChlcnI6IGFueSkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxhdW5jaGluZyBtZWRpYScsIGVycik7XG4gIH07XG5cbiAgc2V0Q2FzdGluZyh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5zdGF0dXMuY2FzdGluZyA9IHZhbHVlO1xuICAgIGdsb2JhbFRoaXMuQ2FzdFBsYXllci5zZXR1cFJlbW90ZVBsYXllcigpO1xuICB9XG5cbiAgZ2V0U3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXR1c1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/dist/fesm2015/thinkam.net-ng-cast.js b/dist/fesm2015/thinkam.net-ng-cast.js index df39ca5..fbc7590 100644 --- a/dist/fesm2015/thinkam.net-ng-cast.js +++ b/dist/fesm2015/thinkam.net-ng-cast.js @@ -1,50 +1,14 @@ -import { __decorate } from 'tslib'; -import { Input, Component, Injectable, NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { Injectable, Component, ViewChild, Input, NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { CommonModule } from '@angular/common'; import { Subject } from 'rxjs'; - -let NgCastComponent = class NgCastComponent { - constructor(ngCastService) { - this.ngCastService = ngCastService; - this.videoImage = ''; - this.imageOffline = false; - this.srcImageOffline = ''; - } - ngOnInit() { - this.window = window; - let ngCastService = this.ngCastService; - this.window['__onGCastApiAvailable'] = function (isAvailable) { - if (isAvailable) { - ngCastService.initializeCastApi(); - } - }; - this.castingStatus = this.ngCastService.getStatus(); - } - openSession() { - this.ngCastService.discoverDevices(); - } - closeSession() { - this.ngCastService.discoverDevices(); - } -}; -__decorate([ - Input() -], NgCastComponent.prototype, "videoImage", void 0); -__decorate([ - Input() -], NgCastComponent.prototype, "imageOffline", void 0); -__decorate([ - Input() -], NgCastComponent.prototype, "srcImageOffline", void 0); -NgCastComponent = __decorate([ - Component({ - selector: 'ng-cast', - template: "
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", - styles: ["body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] - }) -], NgCastComponent); - -let NgCastService = class NgCastService { +import { VgDASH } from 'videogular2/compiled/src/streaming/vg-dash/vg-dash'; +import { VgAPI, VgCoreModule } from 'videogular2/compiled/core'; +import { VgControlsModule } from 'videogular2/compiled/controls'; +import { VgStreamingModule } from 'videogular2/compiled/streaming'; +import { VgBufferingModule } from 'videogular2/compiled/buffering'; +import { VgOverlayPlayModule } from 'videogular2/compiled/overlay-play'; + +class NgCastService { constructor() { this.window = window; this.status = { @@ -120,24 +84,247 @@ let NgCastService = class NgCastService { getStatus() { return this.status; } -}; -NgCastService = __decorate([ - Injectable() -], NgCastService); +} +NgCastService.decorators = [ + { type: Injectable } +]; +NgCastService.ctorParameters = () => []; + +class ScheduleDto { + constructor(data) { + if (data) { + for (let property in data) { + if (data.hasOwnProperty(property)) { + this[property] = data[property]; + } + } + } + } + static fromJS(data) { + data = typeof data === 'object' ? data : {}; + let result = new ScheduleDto(); + result.init(data); + return result; + } + init(data) { + if (data) { + this.id = data['id']; + this.tenant = data['tenant']; + this.name = data['name']; + this.description = data['description']; + this.url = data['url']; + this.duration = data['duration']; + this.actualStart = data['actualStart']; + this.realEnd = data['realEnd']; + this.isActive = data['isActive']; + } + } + toJSON(data) { + data = typeof data === 'object' ? data : {}; + data['id'] = this.id; + data['tenant'] = this.tenant; + data['name'] = this.name; + data['description'] = this.description; + data['url'] = this.url; + data['duration'] = this.duration; + data['actualStart'] = this.actualStart; + data['realEnd'] = this.realEnd; + data['isActive'] = this.isActive; + return data; + } +} -let NgCastModule = class NgCastModule { +class NgCastComponent { + constructor(ngCastService) { + this.ngCastService = ngCastService; + this.videoImage = ''; + this.imageOffline = false; + this.premium = false; + this.srcImageOffline = ''; + this.currentStream = { + type: 'dash', + label: 'DASH: Media Stream test', + source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd' + }; + this.api = new VgAPI(); + this.isDebug = false; + this.paused = false; + this.streams = [ + { + type: 'dash', + label: 'DASH: Media Stream test', + source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd' + } + ]; + this.playlist = []; + this.play = false; + this.isHidden = false; + this.isShow = true; + this.currentIndex = 0; + this.video = new ScheduleDto(); + this.appBaseUrl = ''; + } + ngOnInit() { + this.window = window; + this.currentStream = this.streams[0]; + let ngCastService = this.ngCastService; + this.window['__onGCastApiAvailable'] = function (isAvailable) { + if (isAvailable) { + ngCastService.initializeCastApi(); + } + }; + this.castingStatus = this.ngCastService.getStatus(); + } + onPlayerReady(api) { + this.api = api; + this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this)); + } + setBitrate(option) { + switch (this.currentStream.type) { + case 'dash': + this.vgDash.setBitrate(option); + break; + } + } + nextVideo() { + this.currentIndex++; + if (this.currentIndex === this.playlist.length) { + this.currentIndex = 0; + } + this.video = this.playlist[this.currentIndex]; + } + getPaused() { + if (this.media && this.media.nativeElement) { + this.paused = this.media.nativeElement.paused; + return this.media.nativeElement.paused; + } + else { + setTimeout(() => { + return this.getPaused(); + }, 2000); + } + } + pause() { + this.media.nativeElement.pause(); + this.getPaused(); + } + openSession() { + this.ngCastService.discoverDevices(); + } + closeSession() { + this.ngCastService.discoverDevices(); + } + tryAgain() { + this.imageOffline = true; + this.isHidden = true; + console.log('loading...'); + setTimeout(() => { + this.getVideos(); + }, 500); + } + getVideos() { + if (this.playlist && this.playlist.length > 0) { + this.imageOffline = false; + this.video = this.playlist[this.currentIndex]; + this.getPosition(this.video); + } + else { + this.video = new ScheduleDto(); + this.tryAgain(); + } + } + getPosition(result) { + setTimeout(() => { + let vid = document.getElementById('video_element'); + vid.load(); + const now = new Date(); + const currentTime = Math.abs(now.getTime() - new Date(this.video.actualStart).getTime()); + console.log('Temos no player: ' + result.url); + console.log('Início em: ' + currentTime); + this.video.url = result.url; + vid['currentTime'] = currentTime / 1000; + let promise = vid.play(); + if (promise !== undefined) { + promise.then((_) => { + // Autoplay started! + console.log('Estamos ao vivo!'); + }).catch(() => { + // Autoplay was prevented. + // Show a "Play" button so that user can start playback. + this.play = true; + }); + } + }, 1000); + } + getMuted() { + return this.media && this.media.nativeElement && this.media.nativeElement.muted || false; + } + getMaximized() { + return this.api && this.api.fsAPI && this.api.fsAPI.isFullscreen && this.api.fsAPI.isFullscreen || false; + } + toggleSound() { + this.media.nativeElement.muted = !this.media.nativeElement.muted; + } + toggleMaximize() { + this.api.fsAPI.toggleFullscreen(this.media); + } + showVideoControls() { + this.isHidden = false; + this.isShow = true; + } + hideVideoControls() { + this.isHidden = true; + this.isShow = false; + } +} +NgCastComponent.decorators = [ + { type: Component, args: [{ + selector: 'ng-cast', + template: "
\n \n \n \n \n \n
\n \n \n
AGORA
\n
\n
\n \n \n \n \n
\n
\n \n \"TV\n \n\n\n
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", + styles: ["#video-container{background-color:#272c34;margin:0 auto;z-index:-1}#video-container vg-scrub-bar-current-time .background{background-color:red}#video-container .hidden{display:none}#video-container .show{display:block}#video-container .video-controls{background:rgba(0,0,0,.5);bottom:0;height:45px;left:0;position:absolute;right:0;transition:all .2s ease}#video-container .video-controls.hide{opacity:0;pointer-events:none}#video-container .video-progress{align-items:right;height:8.4px;position:relative}#video-container .video-progress #seek-tooltip{position:absolute}@media screen and (-webkit-min-device-pixel-ratio:0){#video-container .video-progress input[type=range]{-webkit-appearance:none;background-color:var(--youtube-red);overflow:hidden}#video-container .video-progress input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;color:var(--youtube-red);height:10px;margin-top:-1px}#video-container .video-progress input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--youtube-red);cursor:ew-resize;height:10px;width:10px}}#video-container .video-progress input[type=range]{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-moz-range-progress,#video-container .video-progress input[type=range]::-moz-range-track{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-ms-fill-lower,#video-container .video-progress input[type=range]::-ms-fill-upper{background-color:var(--youtube-red)}#video-container progress{-moz-appearance:none;-webkit-appearance:none;appearance:none;border-radius:2px;height:.5vh;pointer-events:none;position:absolute;top:0;width:100%}#video-container .buttons .video-control{align-items:center;background:none;border:2px solid #fff;border-radius:16px;color:#fff;display:flex;height:32px;justify-content:center;width:32px}#video-container .buttons .video-control i{color:#fff;line-height:16px}#video-container .buttons .video-control-paused{bottom:8px;left:1vw;position:absolute;z-index:1000}#video-container .buttons .video-control-muted{bottom:8px;position:absolute;right:5vw;z-index:1000}#video-container .buttons .video-control-maximized{bottom:8px;position:absolute;right:1vw;z-index:1000}#video-container progress::-webkit-progress-bar{background-color:var(--youtube-red);border-radius:2px}#video-container progress::-webkit-progress-value{background:#fff;border-radius:2px}#video-container progress::-moz-progress-bar{background:#fff;border:1px solid #fff}#video-container .seek{cursor:pointer;height:.5vh;margin:0;position:absolute;top:0;width:100%}#video-container .seek-tooltip{background-color:var(--youtube-red);color:#fff;content:attr(data-title);display:block;font-size:12px;font-weight:700;margin-left:5vw;padding:3px;position:absolute;top:10px}.playlist-item li{color:#fff}.kt-content.kt-grid__item.kt-grid__item--fluid.kt-grid.kt-grid--hor{background-color:#272c34}#kt_header_menu_wrapper{display:none}.kt-header__bottom{display:none!important}.player-wrapper{margin:auto;max-width:500px}.player-wrapper video{width:100%}ul{padding:0}ul li.playlist-item{background:#673ab7;cursor:pointer;list-style:none;margin-bottom:2px;padding:10px}ul li.playlist-item.selected{background-color:#ccc}body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] + },] } +]; +NgCastComponent.ctorParameters = () => [ + { type: NgCastService } +]; +NgCastComponent.propDecorators = { + vgDash: [{ type: ViewChild, args: [VgDASH, { static: false },] }], + media: [{ type: ViewChild, args: ['media', { static: false },] }], + videoImage: [{ type: Input }], + imageOffline: [{ type: Input }], + premium: [{ type: Input }], + srcImageOffline: [{ type: Input }], + currentStream: [{ type: Input }], + isDebug: [{ type: Input }], + paused: [{ type: Input }], + streams: [{ type: Input }], + playlist: [{ type: Input }], + play: [{ type: Input }], + isHidden: [{ type: Input }], + isShow: [{ type: Input }], + currentIndex: [{ type: Input }], + video: [{ type: Input }], + appBaseUrl: [{ type: Input }] }; -NgCastModule = __decorate([ - NgModule({ - schemas: [CUSTOM_ELEMENTS_SCHEMA], - imports: [ - CommonModule - ], - exports: [NgCastComponent], - providers: [NgCastService], - declarations: [NgCastComponent] - }) -], NgCastModule); + +class NgCastModule { +} +NgCastModule.decorators = [ + { type: NgModule, args: [{ + schemas: [CUSTOM_ELEMENTS_SCHEMA], + imports: [ + CommonModule, + VgCoreModule, + VgControlsModule, + VgStreamingModule, + VgBufferingModule, + VgOverlayPlayModule, + ], + exports: [NgCastComponent], + providers: [NgCastService], + declarations: [NgCastComponent] + },] } +]; "use strict"; diff --git a/dist/fesm2015/thinkam.net-ng-cast.js.map b/dist/fesm2015/thinkam.net-ng-cast.js.map index cc7eda4..a494e6f 100644 --- a/dist/fesm2015/thinkam.net-ng-cast.js.map +++ b/dist/fesm2015/thinkam.net-ng-cast.js.map @@ -1 +1 @@ -{"version":3,"file":"thinkam.net-ng-cast.js","sources":["../../ng-cast.component.ts","../../shared/ng-cast.service.ts","../../ng.cast.module.ts","../../cast-videos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["import { Component, Input, OnInit } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() srcImageOffline = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeCastPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n globalThis.CastPlayer.setupRemotePlayer();\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = () => {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n if (typeof localPlayer.stop === \"function\")\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["tslib_1.__decorate"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"thinkam.net-ng-cast.js","sources":["../../shared/ng-cast.service.ts","../../dto/schedule-dto.ts","../../ng-cast.component.ts","../../ng.cast.module.ts","../../cast-videos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeCastPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n globalThis.CastPlayer.setupRemotePlayer();\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { TenantDto } from './tenant-dto';\n\nexport interface IScheduleDto {\n id: string | undefined;\n tenant: TenantDto | undefined;\n name: string | undefined;\n description: string | undefined;\n url: string | undefined;\n duration: number | undefined;\n actualStart: Date;\n realEnd?: Date | undefined;\n isActive: boolean | undefined;\n}\n\nexport class ScheduleDto implements IScheduleDto {\n id: string | undefined;\n tenant: TenantDto | undefined;\n name: string | undefined;\n description: string | undefined;\n url: string | undefined;\n duration: number | undefined;\n actualStart!: Date;\n realEnd?: Date | undefined;\n isActive: boolean | undefined;\n\n constructor(data?: IScheduleDto) {\n if (data) {\n for (let property in data) {\n if (data.hasOwnProperty(property)) {\n (this)[property] = (data)[property];\n }\n }\n }\n }\n\n static fromJS(data: any): ScheduleDto {\n data = typeof data === 'object' ? data : {};\n let result = new ScheduleDto();\n result.init(data);\n return result;\n }\n\n init(data?: any) {\n if (data) {\n this.id = data['id'];\n this.tenant = data['tenant'];\n this.name = data['name'];\n this.description = data['description'];\n this.url = data['url'];\n this.duration = data['duration'];\n this.actualStart = data['actualStart'];\n this.realEnd = data['realEnd'];\n this.isActive = data['isActive'];\n }\n }\n\n toJSON(data?: any) {\n data = typeof data === 'object' ? data : {};\n data['id'] = this.id;\n data['tenant'] = this.tenant;\n data['name'] = this.name;\n data['description'] = this.description;\n data['url'] = this.url;\n data['duration'] = this.duration;\n data['actualStart'] = this.actualStart;\n data['realEnd'] = this.realEnd;\n data['isActive'] = this.isActive;\n return data;\n }\n}\n","import { Component, Input, OnInit, ViewChild, ElementRef } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\nimport { VgDASH } from 'videogular2/compiled/src/streaming/vg-dash/vg-dash';\nimport { IDRMLicenseServer } from 'videogular2/compiled/src/streaming/streaming';\nimport { VgAPI, BitrateOption } from 'videogular2/compiled/core';\n\nimport { ScheduleDto } from './dto/schedule-dto';\n\nexport interface IMediaStream {\n type: 'vod' | 'dash';\n source: string;\n label: string;\n token?: string;\n licenseServers?: IDRMLicenseServer;\n}\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n @ViewChild(VgDASH, { static: false }) vgDash!: VgDASH;\n @ViewChild('media', { static: false }) media!: ElementRef;\n\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() premium = false;\n @Input() srcImageOffline = '';\n\n @Input() currentStream: IMediaStream = {\n type: 'dash',\n label: 'DASH: Media Stream test',\n source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd'\n };\n\n api: VgAPI = new VgAPI();\n\n @Input() isDebug = false;\n\n @Input() paused = false;\n\n @Input() streams: IMediaStream[] = [\n {\n type: 'dash',\n label: 'DASH: Media Stream test',\n source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd'\n }\n ];\n\n @Input() playlist: Array = [];\n\n @Input() play = false;\n @Input() isHidden = false;\n @Input() isShow = true;\n\n @Input() currentIndex = 0;\n @Input() video: ScheduleDto = new ScheduleDto();\n @Input() appBaseUrl: String = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n this.currentStream = this.streams[0];\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n onPlayerReady(api: VgAPI) {\n this.api = api;\n\n this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this));\n }\n\n setBitrate(option: BitrateOption) {\n switch (this.currentStream.type) {\n case 'dash':\n this.vgDash.setBitrate(option);\n break;\n }\n }\n\n nextVideo() {\n this.currentIndex++;\n\n if (this.currentIndex === this.playlist.length) {\n this.currentIndex = 0;\n }\n\n this.video = this.playlist[this.currentIndex];\n }\n\n getPaused() {\n if (this.media && this.media.nativeElement) {\n this.paused = this.media.nativeElement.paused;\n return this.media.nativeElement.paused;\n } else {\n setTimeout(() => {\n return this.getPaused();\n }, 2000);\n }\n }\n\n pause(): void {\n this.media.nativeElement.pause();\n this.getPaused();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n tryAgain() {\n this.imageOffline = true;\n this.isHidden = true;\n console.log('loading...');\n\n setTimeout(() => {\n this.getVideos();\n }, 500);\n }\n\n getVideos(): void {\n if (this.playlist && this.playlist.length > 0) {\n this.imageOffline = false;\n this.video = this.playlist[this.currentIndex];\n\n this.getPosition(this.video);\n } else {\n this.video = new ScheduleDto();\n this.tryAgain();\n }\n }\n\n getPosition(result: ScheduleDto) {\n setTimeout(() => {\n let vid: any = document.getElementById('video_element');\n vid.load();\n\n const now = new Date();\n const currentTime = Math.abs(now.getTime() - new Date(this.video.actualStart).getTime());\n\n console.log('Temos no player: ' + result.url);\n console.log('Início em: ' + currentTime);\n\n this.video.url = result.url;\n vid['currentTime'] = currentTime / 1000;\n\n let promise = vid.play();\n if (promise !== undefined) {\n promise.then((_: any) => {\n // Autoplay started!\n console.log('Estamos ao vivo!');\n }).catch(() => {\n // Autoplay was prevented.\n // Show a \"Play\" button so that user can start playback.\n this.play = true;\n });\n }\n }, 1000);\n }\n\n getMuted(): boolean {\n return this.media && this.media.nativeElement && this.media.nativeElement.muted || false;\n }\n\n getMaximized(): boolean {\n return this.api && this.api.fsAPI && this.api.fsAPI.isFullscreen && this.api.fsAPI.isFullscreen || false;\n }\n\n toggleSound(): void {\n this.media.nativeElement.muted = !this.media.nativeElement.muted;\n }\n\n toggleMaximize(): void {\n this.api.fsAPI.toggleFullscreen(this.media);\n }\n\n showVideoControls(): void {\n this.isHidden = false;\n this.isShow = true;\n }\n\n hideVideoControls(): void {\n this.isHidden = true;\n this.isShow = false;\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\nimport { VgCoreModule } from 'videogular2/compiled/core';\nimport { VgControlsModule } from 'videogular2/compiled/controls';\nimport { VgStreamingModule } from 'videogular2/compiled/streaming';\nimport { VgBufferingModule } from 'videogular2/compiled/buffering';\nimport { VgOverlayPlayModule } from 'videogular2/compiled/overlay-play';\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule,\n VgCoreModule,\n VgControlsModule,\n VgStreamingModule,\n VgBufferingModule,\n VgOverlayPlayModule,\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = () => {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n if (typeof localPlayer.stop === \"function\")\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":[],"mappings":";;;;;;;;;;MASa,aAAa;IASxB;QANQ,WAAM,GAAQ,MAAM,CAAC;QAEtB,WAAM,GAAG;YACd,OAAO,EAAE,KAAK;SACf,CAAC;QAkBF,kBAAa,GAAG;YACd,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;SAC7C,CAAC;QAEF,YAAO,GAAG,UAAU,GAAQ;YAC1B,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;SACjD,CAAC;QAEF,oBAAe,GAAG;YAChB,IAAI,IAAI,GAAQ,IAAI,CAAC;YACrB,IAAI,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAM;gBAC9B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;gBACjB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aACxB,EAAE,UAAU,GAAQ;gBACnB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACvB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;oBACzB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;oBACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;iBACrB;qBAAM;oBACL,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;iBACrD;aACF,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;SACb,CAAC;QAEF,sBAAiB,GAAG,CAAC,UAAiB;YACpC,IAAI,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxD,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YAC/C,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,4EAA4E,CAAC,CAAC;YACzG,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAE5C,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,UAAU,CAAC;YAExD,OAAO,UAAU,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;SACjD,CAAC;QAUF,SAAI,GAAG;YACL,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC9B,CAAC;QAEF,UAAK,GAAG;YACN,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC/B,CAAC;QAEF,SAAI,GAAG;YACL,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC9B,CAAC;QAEF,iBAAY,GAAG,CAAC,GAAQ;YACtB,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;SAC7C,CAAC;QA3EA,UAAU,CAAC,UAAU,CAAC,SAAS,GAAG;YAChC,UAAU,EAAE,EAAE;SACf,CAAC;KACH;IAED,iBAAiB;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;QACvC,IAAI,cAAc,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAC9D,IAAI,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EACpD,SAAS,EACT,CAAC,MAAW,OAAO,IAAI,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,CAClF,CAAC;QACF,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;KAC3E;;IAwCD,UAAU,CAAC,aAAkB;QAC3B,IAAI,aAAa,EAAE;YACjB,UAAU,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;YACrC,UAAU,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;YACzC,UAAU,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC;SAC9C;KACF;IAkBD,UAAU,CAAC,KAAU;QACnB,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;QAC5B,UAAU,CAAC,UAAU,CAAC,iBAAiB,EAAE,CAAC;KAC3C;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAA;KACnB;;;YA/FF,UAAU;;;;MCME,WAAW;IAWpB,YAAY,IAAmB;QAC3B,IAAI,IAAI,EAAE;YACN,KAAK,IAAI,QAAQ,IAAI,IAAI,EAAE;gBACvB,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE;oBACzB,IAAK,CAAC,QAAQ,CAAC,GAAS,IAAK,CAAC,QAAQ,CAAC,CAAC;iBACjD;aACJ;SACJ;KACJ;IAED,OAAO,MAAM,CAAC,IAAS;QACnB,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;QAC5C,IAAI,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,MAAM,CAAC;KACjB;IAED,IAAI,CAAC,IAAU;QACX,IAAI,IAAI,EAAE;YACN,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;YACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;YACvC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;YACjC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;YACvC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;SACpC;KACJ;IAED,MAAM,CAAC,IAAU;QACb,IAAI,GAAG,OAAO,IAAI,KAAK,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QACjC,OAAO,IAAI,CAAC;KACf;;;MC3CQ,eAAe;IA0C1B,YACU,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;QApC7B,eAAU,GAAG,EAAE,CAAC;QAChB,iBAAY,GAAG,KAAK,CAAC;QACrB,YAAO,GAAG,KAAK,CAAC;QAChB,oBAAe,GAAG,EAAE,CAAC;QAErB,kBAAa,GAAiB;YACrC,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,yBAAyB;YAChC,MAAM,EAAE,2DAA2D;SACpE,CAAC;QAEF,QAAG,GAAU,IAAI,KAAK,EAAE,CAAC;QAEhB,YAAO,GAAG,KAAK,CAAC;QAEhB,WAAM,GAAG,KAAK,CAAC;QAEf,YAAO,GAAmB;YACjC;gBACE,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,yBAAyB;gBAChC,MAAM,EAAE,2DAA2D;aACpE;SACF,CAAC;QAEO,aAAQ,GAAuB,EAAE,CAAC;QAElC,SAAI,GAAG,KAAK,CAAC;QACb,aAAQ,GAAG,KAAK,CAAC;QACjB,WAAM,GAAG,IAAI,CAAC;QAEd,iBAAY,GAAG,CAAC,CAAC;QACjB,UAAK,GAAgB,IAAI,WAAW,EAAE,CAAC;QACvC,eAAU,GAAW,EAAE,CAAC;KAI5B;IAEL,QAAQ;QACN,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAErC,IAAI,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,GAAG,UAAU,WAAoB;YACnE,IAAI,WAAW,EAAE;gBACf,aAAa,CAAC,iBAAiB,EAAE,CAAC;aACnC;SACF,CAAC;QAEF,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;KACrD;IAED,aAAa,CAAC,GAAU;QACtB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;KACrF;IAED,UAAU,CAAC,MAAqB;QAC9B,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI;YAC7B,KAAK,MAAM;gBACT,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC/B,MAAM;SACT;KACF;IAED,SAAS;QACP,IAAI,CAAC,YAAY,EAAE,CAAC;QAEpB,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YAC9C,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;SACvB;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;KAC/C;IAED,SAAS;QACP,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;YAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC;YAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC;SACxC;aAAM;YACL,UAAU,CAAC;gBACT,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;aACzB,EAAE,IAAI,CAAC,CAAC;SACV;KACF;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,SAAS,EAAE,CAAC;KAClB;IAED,WAAW;QACT,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;KACtC;IAED,YAAY;QACV,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAC;KACtC;IAED,QAAQ;QACN,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAE1B,UAAU,CAAC;YACT,IAAI,CAAC,SAAS,EAAE,CAAC;SAClB,EAAE,GAAG,CAAC,CAAC;KACT;IAED,SAAS;QACP,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7C,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAE9C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC9B;aAAM;YACL,IAAI,CAAC,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;SACjB;KACF;IAED,WAAW,CAAC,MAAmB;QAC7B,UAAU,CAAC;YACT,IAAI,GAAG,GAAQ,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;YACxD,GAAG,CAAC,IAAI,EAAE,CAAC;YAEX,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAEzF,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,WAAW,CAAC,CAAC;YAEzC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;YAC5B,GAAG,CAAC,aAAa,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC;YAExC,IAAI,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;YACzB,IAAI,OAAO,KAAK,SAAS,EAAE;gBACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM;;oBAElB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;iBACjC,CAAC,CAAC,KAAK,CAAC;;;oBAGP,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;iBAClB,CAAC,CAAC;aACJ;SACF,EAAE,IAAI,CAAC,CAAC;KACV;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,IAAI,KAAK,CAAC;KAC1F;IAED,YAAY;QACV,OAAO,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC;KAC1G;IAED,WAAW;QACT,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;KAClE;IAED,cAAc;QACZ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC7C;IAED,iBAAiB;QACf,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;KACpB;IAED,iBAAiB;QACf,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;KACrB;;;YA7LF,SAAS,SAAC;gBACT,QAAQ,EAAE,SAAS;gBACnB,4wHAAuC;;aAIxC;;;YAtBQ,aAAa;;;qBAwBnB,SAAS,SAAC,MAAM,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;oBACnC,SAAS,SAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;yBAKpC,KAAK;2BACL,KAAK;sBACL,KAAK;8BACL,KAAK;4BAEL,KAAK;sBAQL,KAAK;qBAEL,KAAK;sBAEL,KAAK;uBAQL,KAAK;mBAEL,KAAK;uBACL,KAAK;qBACL,KAAK;2BAEL,KAAK;oBACL,KAAK;yBACL,KAAK;;;MCxCK,YAAY;;;YAdxB,QAAQ,SAAC;gBACR,OAAO,EAAE,CAAE,sBAAsB,CAAE;gBACnC,OAAO,EAAE;oBACP,YAAY;oBACZ,YAAY;oBACZ,gBAAgB;oBAChB,iBAAiB;oBACjB,iBAAiB;oBACjB,mBAAmB;iBACpB;gBACD,OAAO,EAAE,CAAC,eAAe,CAAC;gBAC1B,SAAS,EAAE,CAAC,aAAa,CAAC;gBAC1B,YAAY,EAAE,CAAC,eAAe,CAAC;aAChC;;;ACxBD,YAAY,CAAC;AACb;AACA;AACA,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B;AACA;AACA;AACA;AACA;AACA,IAAI,kBAAkB,GAAG,GAAG,CAAC;AAC7B;AACA;AACA,IAAI,UAAU,GAAG,IAAI,CAAC;AACtB;AACA;AACA,IAAI,cAAc,GAAG,GAAG,CAAC;AACzB;AACA;AACA,IAAI,kBAAkB,GAAG,GAAG,CAAC;AAC7B;AACA;AACA,MAAM,YAAY,GAAG;AACrB;AACA;AACA,EAAE,IAAI,EAAE,MAAM;AACd,EAAE,OAAO,EAAE,SAAS;AACpB;AACA;AACA,EAAE,SAAS,EAAE,WAAW;AACxB;AACA,EAAE,MAAM,EAAE,QAAQ;AAClB;AACA,EAAE,OAAO,EAAE,SAAS;AACpB;AACA,EAAE,MAAM,EAAE,QAAQ;AAClB,EAAE,OAAO,EAAE,SAAS;AACpB,EAAE,KAAK,EAAE,OAAO;AAChB,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,UAAU,GAAG,YAAY;AAC7B;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;AAC/C;AACA;AACA,EAAE,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AACvC;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;AACtC;AACA;AACA;AACA,EAAE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AAC3B;AACA,EAAE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;AACrC;AACA;AACA;AACA,EAAE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;AAC5B;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;AAC1B;AACA;AACA,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;AACpB;AACA,EAAE,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtE;AACA,EAAE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrD;AACA;AACA;AACA,EAAE,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;AAC7B;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC5B;AACA,EAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;AAC1B;AACA;AACA;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACxB;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC5B;AACA;AACA;AACA,EAAE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;AAChC;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;AAC7B;AACA,EAAE,IAAI,CAAC,SAAS,GAAG;AACnB,IAAI,YAAY,EAAE,EAAE;AACpB,GAAG,CAAC;AACJ,CAAC,CAAC;AACF;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,MAAM;AAClD,EAAE,IAAI,OAAO,GAAG,EAAE,CAAC;AACnB;AACA;AACA;AACA;AACA,EAAE,OAAO,CAAC,qBAAqB,GAAG,UAAU,CAAC;AAC7C;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,CAAC,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;AACpE;AACA,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAC/D;AACA,EAAE,UAAU,CAAC,YAAY,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;AAC9D,EAAE,UAAU,CAAC,sBAAsB,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACzG,EAAE,UAAU,CAAC,sBAAsB,CAAC,gBAAgB;AACpD,MAAM,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,oBAAoB;AAC/D,MAAM,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;AAC9C,GAAG,CAAC;AACJ,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,YAAY,GAAG,MAAM;AAC1C,EAAE,UAAU,CAAC,iBAAiB,EAAE,CAAC;AACjC,EAAE,UAAU,CAAC,iBAAiB,EAAE,CAAC;AACjC,EAAE,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAClC,EAAE,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AAC7C,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE;AAC9B,MAAM,IAAI,UAAU,CAAC,YAAY,CAAC,WAAW,EAAE;AAC/C,QAAQ,UAAU,CAAC,iBAAiB,EAAE,CAAC;AACvC,UAAU,OAAO;AACjB,OAAO;AACP,GAAG;AACH,EAAE,UAAU,CAAC,gBAAgB,EAAE,CAAC;AAChC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,aAAa,GAAG,UAAU,UAAU,EAAE;AAC1C,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;AACnB;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,UAAU,MAAM,EAAE;AACrC,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACzB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,YAAY;AAC1B,IAAI,IAAI,UAAU,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO;AACvD,MAAM,UAAU,CAAC,WAAW,KAAK,YAAY,CAAC,MAAM;AACpD,MAAM,UAAU,CAAC,WAAW,KAAK,YAAY,CAAC,MAAM,EAAE;AACtD,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AAC9C,MAAM,OAAO;AACb,KAAK;AACL;AACA,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC;AAClD,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC3D,IAAI,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC7D,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAChC,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,oBAAoB,GAAG,YAAY;AAC1C,IAAI,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;AACvC,IAAG;AACH;AACA,EAAE,IAAI,CAAC,KAAK,GAAG,YAAY;AAC3B,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;AACxB,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;AACjD,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC5D,IAAI,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC5D,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,YAAY;AAC1B,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AAC/C,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,UAAU,UAAU,GAAG,IAAI,EAAE;AAC3C,IAAI,IAAI,CAAC,UAAU,EAAE;AACrB,MAAM,UAAU,GAAG,UAAU,CAAC,iBAAiB,CAAC;AAChD,KAAK;AACL,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,SAAS,CAAC;AACpD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACjC,GAAG,CAAC;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,UAAU,UAAU,EAAE;AAC7C,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;AACjD,GAAG,CAAC;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,YAAY;AACnC,IAAI,UAAU,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACvD,IAAI,UAAU,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;AACrD,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;AACjD;AACA,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AAChB,IAAI,UAAU,CAAC,kBAAkB,EAAE,CAAC;AACpC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;AACzB,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,WAAW;AAC3B,IAAI,UAAU,CAAC,oBAAoB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;AAC9D,IAAI,UAAU,CAAC,mBAAmB,EAAE,CAAC;AACrC,IAAI,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC;AACjD,IAAI,IAAI,UAAU,CAAC,gBAAgB,GAAG,CAAC,EAAE;AACzC,QAAQ,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;AACjD,KAAK;AACL,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;AAChB,IAAI,UAAU,CAAC,kBAAkB,EAAE,CAAC;AACpC,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;AAChC,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,mBAAmB,GAAG,YAAY;AACzC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;AAC7C,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,gBAAgB,GAAG,YAAY;AACtC,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;AAC1C,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,YAAY;AACnC;AACA,IAAI,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;AAC9D,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;AACxD;AACA,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;AAChC,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,wBAAwB,GAAG,YAAY;AAC9C,IAAI,IAAI,CAAC,MAAM,CAAC,wBAAwB,EAAE,CAAC;AAC3C,GAAG,CAAC;AACJ;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC,aAAa,GAAG,UAAU,OAAO,EAAE,IAAI,EAAE;AAChD,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC7C,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,SAAS,GAAG,UAAU,oBAAoB,EAAE;AACnD,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;AAChD,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,IAAI,GAAG,YAAY;AAC1B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,IAAI,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC/D,IAAI,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACjE,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,YAAY;AAC5B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;AACzB,IAAI,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAChE,IAAI,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAChE,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,OAAO,GAAG,YAAY;AAC7B,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;AACjC,GAAG,CAAC;AACJ;AACA,EAAE,IAAI,CAAC,MAAM,GAAG,UAAU,IAAI,EAAE;AAChC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,GAAG,CAAC;AACJ,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,MAAM;AAC9C,EAAE,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AAC7D,EAAE,WAAW,CAAC,gBAAgB;AAC9B,IAAI,YAAY,EAAE,UAAU,CAAC,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACpE;AACA;AACA,EAAE,IAAI,YAAY,GAAG,EAAE,CAAC;AACxB;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,MAAM;AAC5B,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;AACvB;AACA,IAAI,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AACpD,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC9B,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACxC,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,KAAK,GAAG,YAAY;AACnC,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;AACxB,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,IAAI,OAAO,WAAW,CAAC,IAAI,KAAK,UAAU;AAC9C,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;AACzB,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,UAAU,UAAU,EAAE;AAC5C,IAAI,WAAW,CAAC,GAAG;AACnB,MAAM,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;AACvB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,mBAAmB,GAAG,YAAY;AACjD,IAAI,OAAO,WAAW,CAAC,WAAW,CAAC;AACnC,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,gBAAgB,GAAG,YAAY;AAC9C,IAAI,OAAO,WAAW,CAAC,QAAQ,CAAC;AAChC,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,oBAAoB,GAAG,YAAY;AAClD,IAAI,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAClE,IAAI,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACpE,IAAI,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC1E,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,SAAS,GAAG,UAAU,oBAAoB,EAAE;AAC3D,IAAI,WAAW,CAAC,MAAM,GAAG,oBAAoB,GAAG,kBAAkB;AAClE,MAAM,oBAAoB,GAAG,kBAAkB,GAAG,CAAC,CAAC;AACpD,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACtD,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAC;AACjD,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,oBAAoB,GAAG,IAAI,CAAC;AACrD,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,IAAI,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;AAC7B,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,MAAM,GAAG,YAAY;AACpC,IAAI,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC;AAC9B,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,OAAO,GAAG,YAAY;AACrC,IAAI,OAAO,WAAW,CAAC,KAAK,CAAC;AAC7B,GAAG,CAAC;AACJ;AACA,EAAE,YAAY,CAAC,MAAM,GAAG,UAAU,IAAI,EAAE;AACxC,IAAI,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC;AACnC,GAAG,CAAC;AACJ;AACA,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;AACnD;AACA,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,cAAc,GAAG,kBAAkB,CAAC,CAAC;AAC1E;AACA,EAAE,UAAU,CAAC,oBAAoB,EAAE,CAAC;AACpC;AACA,EAAE,IAAI,UAAU,CAAC,gBAAgB,GAAG,CAAC,EAAE;AACvC,IAAI,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AACpC,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACrD,EAAE,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;AACjF;AACA;AACA,EAAE,UAAU,CAAC,sBAAsB,CAAC,gBAAgB;AACpD,MAAM,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,iBAAiB;AAC5D,MAAM,WAAW;AACjB,UAAU,IAAI,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE;AAChD,cAAc,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;AAC/C,WAAW,MAAM;AACjB,cAAc,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAC9C,WAAW;AACX,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;AACxB,GAAG,CAAC;AACJ;AACA,EAAE,UAAU,CAAC,sBAAsB,CAAC,gBAAgB;AACpD,MAAM,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,gBAAgB;AAC3D,MAAM,WAAW;AACjB,UAAU,IAAI,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE;AAC/C,cAAc,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAC9C,WAAW,MAAM;AACjB,cAAc,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;AAChD,WAAW;AACX,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;AACxB,GAAG,CAAC;AACJ;AACA,EAAE,UAAU,CAAC,sBAAsB,CAAC,gBAAgB;AACpD,MAAM,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,oBAAoB;AAC/D,MAAM,WAAW;AACjB,UAAU,IAAI,SAAS,GAAG,UAAU,CAAC,YAAY,CAAC,WAAW,GAAG,kBAAkB,CAAC;AACnF,UAAU,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AAC5D,UAAU,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;AAC5C,UAAU,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;AAChD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;AACxB,GAAG,CAAC;AACJ;AACA;AACA;AACA;AACA,EAAE,IAAI,YAAY,GAAG,EAAE,CAAC;AACxB;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,MAAM,IAAI,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE;AAC5C,UAAU,UAAU,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC;AAC1D,OAAO;AACP;AACA,MAAM,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AACtD,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACjC,MAAM,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AACjE,MAAM,WAAW,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACzC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,KAAK,GAAG,YAAY;AACnC,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,EAAE;AAC7C,UAAU,UAAU,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC;AAC1D,OAAO;AACP,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,OAAO,UAAU,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;AAChD,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,UAAU,UAAU,EAAE;AAC5C,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAChF,MAAM,IAAI,SAAS,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS;AACrD,UAAU,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AAC3E;AACA,MAAM,SAAS,CAAC,QAAQ,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC;AACxE,MAAM,SAAS,CAAC,QAAQ,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC;AAC/E,MAAM,SAAS,CAAC,QAAQ,CAAC,KAAK,GAAG,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;AAC/E,MAAM,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG;AAClC,UAAU,CAAC,KAAK,EAAE,iBAAiB,GAAG,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACtF;AACA,MAAM,IAAI,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AACjE,MAAM,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI;AACzC,UAAU,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AACxE,UAAU,UAAU,SAAS,EAAE;AAC/B,cAAc,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC;AAC1D,cAAc,OAAO,CAAC,GAAG,CAAC,2BAA2B;AACrD,kBAAkB,UAAU,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;AACzD,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9B,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,mBAAmB,GAAG,WAAW;AAChD,MAAM,OAAO,UAAU,CAAC,YAAY,CAAC,WAAW,CAAC;AACjD,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,gBAAgB,GAAG,WAAW;AAC7C,MAAM,OAAO,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC;AAC9C,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,oBAAoB,GAAG,YAAY;AAClD,MAAM,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACrE,MAAM,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACvE,MAAM,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC7E,MAAM,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;AACtD,UAAU,UAAU,CAAC,aAAa,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,GAAG,GAAG;AAChF,UAAU,UAAU,CAAC,WAAW,GAAG,MAAM,GAAG,WAAW,CAAC,aAAa,EAAE,CAAC,YAAY,CAAC;AACrF,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,SAAS,GAAG,UAAU,oBAAoB,EAAE;AAC3D;AACA,MAAM,IAAI,aAAa,GAAG,UAAU,CAAC,YAAY,CAAC,WAAW,CAAC;AAC9D,MAAM,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACxD,MAAM,IAAI,oBAAoB,GAAG,kBAAkB,EAAE;AACrD,UAAU,IAAI,MAAM,IAAI,UAAU,CAAC,aAAa,GAAG,kBAAkB,CAAC;AACtE,UAAU,IAAI,oBAAoB,GAAG,MAAM,EAAE;AAC7C,cAAc,oBAAoB,GAAG,MAAM,GAAG,CAAC,GAAG,GAAG,MAAM,IAAI,CAAC,CAAC;AACjE,WAAW;AACX,UAAU,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAC;AACvD,UAAU,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,oBAAoB,GAAG,IAAI,CAAC;AAC3D,UAAU,aAAa,GAAG,oBAAoB,GAAG,kBAAkB,CAAC;AACpE,OAAO,MAAM;AACb,UAAU,aAAa,GAAG,CAAC,CAAC;AAC5B,OAAO;AACP,MAAM,UAAU,CAAC,YAAY,CAAC,WAAW,GAAG,aAAa,CAAC;AAC1D,MAAM,UAAU,CAAC,sBAAsB,CAAC,cAAc,EAAE,CAAC;AACzD,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,IAAI,GAAG,YAAY;AAClC,MAAM,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE;AAC5C,UAAU,UAAU,CAAC,sBAAsB,CAAC,YAAY,EAAE,CAAC;AAC3D,OAAO;AACP,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,MAAM,GAAG,YAAY;AACpC,MAAM,IAAI,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE;AAC3C,UAAU,UAAU,CAAC,sBAAsB,CAAC,YAAY,EAAE,CAAC;AAC3D,OAAO;AACP,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,OAAO,GAAG,WAAW;AACpC,MAAM,OAAO,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC;AAC7C,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,YAAY,CAAC,MAAM,GAAG,UAAU,IAAI,EAAE;AACxC,MAAM,UAAU,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC;AACjD,MAAM,UAAU,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;AAC/C,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACrB;AACA,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;AACnD;AACA;AACA;AACA,EAAE,IAAI,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE;AACvC,MAAM,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AACtC,GAAG;AACH,EAAE,IAAI,aAAa,GAAG,UAAU,CAAC,YAAY,CAAC,WAAW,GAAG,kBAAkB,CAAC;AAC/E,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACpD,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,aAAa,GAAG,IAAI,CAAC;AACxC,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC;AAC5C;AACA,EAAE,UAAU,CAAC,oBAAoB,EAAE,CAAC;AACpC;AACA,EAAE,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAClC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY;AACxD,EAAE,IAAI,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AAC7D,EAAE,WAAW,CAAC,WAAW,GAAG,UAAU,CAAC,gBAAgB,CAAC;AACxD;AACA,EAAE,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;AACpC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,UAAU,EAAE;AACzD,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,UAAU,CAAC,CAAC;AACrD;AACA,EAAE,UAAU,CAAC,iBAAiB,GAAG,UAAU,CAAC;AAC5C;AACA,EAAE,UAAU,CAAC,aAAa,CAAC,gBAAgB,GAAG,SAAS,CAAC;AACxD;AACA;AACA,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;AAClD,EAAE,EAAE,CAAC,GAAG,GAAG,iBAAiB,GAAG,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;AAC7E;AACA;AACA,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzD,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;AAC9B,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACrD,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AAC/B;AACA,EAAE,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACnE,EAAE,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzE,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,GAAG,kBAAkB,CAAC;AACnD,EAAE,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AACzC;AACA;AACA,EAAE,UAAU,CAAC,iBAAiB,EAAE,CAAC;AACjC,EAAE,UAAU,CAAC,gBAAgB,GAAG,CAAC,CAAC;AAClC,EAAE,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;AACpF,EAAE,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AACjF;AACA,EAAE,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AAC7C,EAAE,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;AAClC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,KAAK,EAAE;AAClD,EAAE,IAAI,UAAU,CAAC,aAAa,IAAI,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;AAC9I,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AACxC,IAAI,OAAO;AACX,GAAG;AACH;AACA,EAAE,IAAI,UAAU,CAAC,aAAa,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE;AACjE,IAAI,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAC;AACtD,IAAI,OAAO;AACX,GAAG;AACH;AACA,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC7C,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzD,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACrD,EAAE,IAAI,QAAQ,GAAG,CAAC,CAAC;AACnB,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AACb,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AACb,EAAE,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,IAAI,oBAAoB,EAAE;AACtD,IAAI,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,gBAAgB,GAAG,UAAU,CAAC,aAAa,GAAG,QAAQ;AACzF,MAAM,kBAAkB,EAAE,EAAE,CAAC,CAAC;AAC9B,IAAI,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC;AACtD,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC;AACvD,GAAG,MAAM;AACT,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,GAAG,UAAU,CAAC,aAAa,GAAG,kBAAkB,EAAE,EAAE,CAAC,CAAC;AACtF,IAAI,EAAE,GAAG,QAAQ,CAAC;AAClB,IAAI,EAAE,GAAG,QAAQ,CAAC;AAClB,GAAG;AACH;AACA,EAAE,IAAI,UAAU,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO;AACrD,IAAI,UAAU,CAAC,WAAW,KAAK,YAAY,CAAC,MAAM,EAAE;AACpD,IAAI,UAAU,CAAC,gBAAgB,GAAG,QAAQ,CAAC;AAC3C,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC;AACrC,IAAI,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC;AACpC,GAAG;AACH;AACA,EAAE,IAAI,UAAU,CAAC,aAAa,EAAE;AAChC,IAAI,QAAQ,IAAI,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;AACtE,GAAG;AACH;AACA,EAAE,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC5C,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,UAAU,EAAE;AACvD,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACpD,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AACd,EAAE,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,KAAK,gBAAgB,EAAE;AACxD,IAAI,GAAG,GAAG,kBAAkB,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAChE,GAAG,MAAM;AACT,IAAI,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1E,GAAG;AACH,EAAE,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC1C,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,YAAY;AACtD,EAAE,UAAU,CAAC,iBAAiB,EAAE,CAAC;AACjC;AACA;AACA,EAAE,UAAU,CAAC,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,yBAAyB,EAAE,UAAU,CAAC,CAAC;AACnF,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACrD,EAAE,IAAI,UAAU,CAAC,KAAK,EAAE;AACxB,IAAI,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACpC,IAAI,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC;AAC5B,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,MAAM;AAChD;AACA,IAAI,UAAU,CAAC,gBAAgB,GAAG,UAAU,CAAC,aAAa,CAAC,mBAAmB,EAAE,CAAC;AACjF,IAAI,UAAU,CAAC,oBAAoB,GAAG,UAAU,CAAC,aAAa,CAAC,gBAAgB,EAAE,CAAC;AAClF;AACA,IAAI,IAAI,UAAU,CAAC,WAAW,KAAK,YAAY,CAAC,OAAO,EAAE;AACzD,QAAQ,IAAI,UAAU,CAAC,gBAAgB,GAAG,UAAU,CAAC,oBAAoB,EAAE;AAC3E,UAAU,UAAU,CAAC,gBAAgB,IAAI,CAAC,CAAC;AAC3C,UAAU,UAAU,CAAC,wBAAwB,EAAE,CAAC;AAChD,SAAS,MAAM;AACf,UAAU,UAAU,CAAC,WAAW,EAAE,CAAC;AACnC,SAAS;AACT,KAAK;AACL,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,wBAAwB,GAAG,YAAY;AAC5D,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AAC9C,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE;AAC1C,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;AACxB,GAAG;AACH,EAAE,IAAI,UAAU,CAAC,oBAAoB,GAAG,CAAC,EAAE;AAC3C,MAAM,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK;AACzB,UAAU,kBAAkB,GAAG,UAAU,CAAC,gBAAgB,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;AAC9F,GAAG;AACH;AACA,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5B,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzD,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,GAAG,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC7D;AACA,EAAE,IAAI,EAAE,IAAI,kBAAkB,EAAE;AAChC,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;AAC7B,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,WAAW,GAAG,YAAY;AAC/C,EAAE,UAAU,CAAC,gBAAgB,GAAG,CAAC,CAAC;AAClC,EAAE,UAAU,CAAC,iBAAiB,EAAE,CAAC;AACjC,EAAE,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;AAC7C,EAAE,UAAU,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;AAC3C;AACA,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC7C,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO;AACxC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACjC;AACA,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;AAC/C,EAAE,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO;AACjD,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACjC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,SAAS,EAAE;AAC/D,EAAE,IAAI,SAAS,IAAI,SAAS,IAAI,SAAS,IAAI,IAAI,EAAE;AACnD,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG;AACH;AACA,EAAE,IAAI,UAAU,GAAG,KAAK,CAAC;AACzB,EAAE,IAAI,SAAS,GAAG,CAAC,EAAE;AACrB,IAAI,UAAU,GAAG,IAAI,CAAC;AACtB,IAAI,SAAS,IAAI,CAAC,CAAC,CAAC;AACpB,GAAG;AACH;AACA,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;AAC3C,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9D,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;AACxE;AACA,EAAE,IAAI,KAAK,GAAG,EAAE,EAAE,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC;AACtC,EAAE,IAAI,OAAO,GAAG,EAAE,EAAE,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;AAC5C,EAAE,IAAI,OAAO,GAAG,EAAE,EAAE,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;AAC5C;AACA,EAAE,OAAO,CAAC,UAAU,GAAG,GAAG,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;AACzE,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,SAAS,EAAE;AAC/D,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,SAAS,CAAC;AACnC;AACA,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;AACxC,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC9B,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AAClC,EAAE,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AAClC,EAAE,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AACvC,EAAE,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;AACrB;AACA,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE,CAAC;AAC7B,EAAE,OAAO,GAAG,CAAC,GAAG,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,EAAE,OAAO,GAAG,CAAC,GAAG,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,EAAE,IAAI,SAAS,GAAG,KAAK,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC;AACrE,EAAE,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,eAAe,GAAG,YAAY;AACnD,EAAE,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;AACjF,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO;AAC3B;AACA,EAAE,IAAI,KAAK,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;AAC5C,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO;AACrB;AACA,EAAE,IAAI,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;AAC9B,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO;AACzB;AACA,EAAE,IAAI,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;AAChC,EAAE,IAAI,eAAe,GAAG,SAAS,CAAC,QAAQ,CAAC;AAC3C;AACA,EAAE,IAAI,CAAC,MAAM,EAAE;AACf,IAAI,OAAO;AACX,GAAG;AACH;AACA,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,IAAI,IAAI,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAC5B;AACA;AACA;AACA,IAAI,IAAI,OAAO,CAAC,QAAQ,GAAG,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE;AAClE,MAAM,SAAS;AACf,KAAK;AACL;AACA;AACA,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC3D,MAAM,IAAI,GAAG,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAC;AACnD,MAAM,GAAG,CAAC,SAAS,IAAI,8BAA8B,GAAG,OAAO,CAAC,QAAQ;AACxE,QAAQ,wBAAwB;AAChC,QAAQ,UAAU,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,GAAG,YAAY,CAAC;AACxF,KAAK;AACL,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,eAAe,GAAG,YAAY;AACnD,EAAE,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,UAAU,QAAQ,EAAE;AACrE,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;AACtB,GAAG,CAAC,CAAC;AACL,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,QAAQ,EAAE,eAAe,EAAE;AAC/E;AACA,EAAE,IAAI,QAAQ,IAAI,CAAC,CAAC,EAAE;AACtB,IAAI,OAAO,kBAAkB,CAAC;AAC9B,GAAG;AACH;AACA;AACA;AACA,EAAE,IAAI,QAAQ,GAAG,eAAe,EAAE;AAClC,IAAI,OAAO,kBAAkB,CAAC;AAC9B,GAAG;AACH;AACA;AACA,EAAE,OAAO,CAAC,kBAAkB,GAAG,QAAQ,IAAI,eAAe,CAAC;AAC3D,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY;AACxD;AACA,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC7C,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;AAC9C,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAChC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,cAAc,GAAG,UAAU,cAAc,EAAE;AAChE,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,cAAc,CAAC,CAAC;AAChD,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,sBAAsB,GAAG,UAAU,aAAa,EAAE;AACvE,EAAE,UAAU,CAAC,aAAa,GAAG,aAAa,CAAC;AAC3C,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,6BAA6B,GAAG,UAAU,oBAAoB,EAAE;AACrF,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC7C;AACA;AACA,EAAE,IAAI,UAAU,CAAC,aAAa,IAAI,SAAS,IAAI,UAAU,CAAC,aAAa,GAAG,CAAC,EAAE;AAC7E;AACA,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;AAChD,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAClC,GAAG;AACH;AACA,OAAO,IAAI,UAAU,CAAC,aAAa,KAAK,SAAS,IAAI,oBAAoB,IAAI,UAAU,CAAC,aAAa,EAAE;AACvG;AACA,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;AAChD,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACnC,GAAG;AACH;AACA,OAAO;AACP;AACA,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO;AAChD,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAClC,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,YAAY;AAC1C,EAAE,UAAU,CAAC,sBAAsB,CAAC,MAAM,EAAE,CAAC;AAC7C,EAAC;AACD;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,UAAU,MAAM,EAAE;AAC3D,EAAE,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACrD,EAAE,IAAI,kBAAkB,GAAG,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;AACzE,EAAE,IAAI,eAAe,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;AACnE;AACA,EAAE,IAAI,MAAM,EAAE;AACd;AACA,IAAI,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,qDAAqD,CAAC;AAC3F,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AACtC,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AAC7C,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AAChD,IAAI,kBAAkB,CAAC,SAAS,GAAG,IAAI,CAAC;AACxC;AACA;AACA,IAAI,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACrE,IAAI,eAAe,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;AAC5E,IAAI,kBAAkB,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACjF,GAAG,MAAM;AACT;AACA,IAAI,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,mDAAmD,CAAC;AACzF,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AACtC,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AAC7C,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;AAChD,IAAI,kBAAkB,CAAC,SAAS,GAAG,KAAK,CAAC;AACzC;AACA;AACA,IAAI,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACxE,IAAI,eAAe,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;AAC/E,IAAI,kBAAkB,CAAC,mBAAmB,CAAC,SAAS,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACpF,GAAG;AACH,EAAC;AACD;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,mBAAmB,GAAG,WAAW;AACtD,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,SAAS;AAC/C,MAAM,UAAU,CAAC,iBAAiB,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;AACpE,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,iBAAiB,GAAG,SAAS,aAAa,EAAE;AACvD,EAAE,IAAI,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;AAC3D,EAAE,IAAI,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;AACrD,EAAE,IAAI,aAAa,KAAK,CAAC,EAAE;AAC3B,MAAM,OAAO,cAAc,CAAC;AAC5B,GAAG;AACH,EAAE,cAAc,GAAG,CAAC,aAAa,GAAG,EAAE,IAAI,GAAG,GAAG,cAAc,CAAC;AAC/D,EAAE,IAAI,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;AACtD,EAAE,IAAI,cAAc,KAAK,CAAC,EAAE;AAC5B,MAAM,OAAO,cAAc,CAAC;AAC5B,GAAG;AACH,EAAE,OAAO,cAAc,GAAG,GAAG,GAAG,cAAc,CAAC;AAC/C,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACrD;AACA,EAAE,IAAI,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AACzD,EAAE,IAAI,aAAa;AACnB,IAAI,OAAO,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAAC;AACvE;AACA,EAAE,IAAI,aAAa,EAAE;AACrB;AACA,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAChC,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AACxC,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD;AACA,EAAE,IAAI,aAAa;AACnB,IAAI,QAAQ,CAAC,kBAAkB,CAAC,IAAI,QAAQ,CAAC,wBAAwB,CAAC,CAAC;AACvE;AACA,EAAE,IAAI,aAAa,EAAE;AACrB,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACjC,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,uBAAuB,GAAG,YAAY;AAC3D,EAAE,UAAU,CAAC,UAAU,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;AACjD,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY;AACxD,EAAE,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;AACvE,EAAE,IAAI,mBAAmB,GAAG,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;AAC3E;AACA,EAAE,IAAI,UAAU,CAAC,UAAU,EAAE;AAC7B,IAAI,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO;AACvF,MAAM,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC/C;AACA,IAAI,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO;AAC7F,MAAM,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAClD,GAAG,MAAM;AACT,IAAI,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO;AACvF,MAAM,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAChD;AACA,IAAI,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO;AAC7F,MAAM,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACjD,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,oBAAoB,GAAG,YAAY;AACxD,EAAE,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;AACvE,EAAE,IAAI,mBAAmB,GAAG,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC;AAC3E;AACA,EAAE,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO;AACrF,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC7C;AACA,EAAE,IAAI,mBAAmB,IAAI,mBAAmB,CAAC,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO;AAC3F,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC/C,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD,EAAE,IAAI,aAAa,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;AAC/D,EAAE,IAAI,aAAa,IAAI,aAAa,CAAC,KAAK,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO;AACzE,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;AACtC,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD,EAAE,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE;AACnC,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;AAC3D,IAAI,IAAI,OAAO,IAAI,OAAO,CAAC,iBAAiB,EAAE,EAAE;AAChD;AACA,MAAM,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;AACnE,KAAK,MAAM;AACX,MAAM,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AACjE,KAAK;AACL,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE;AAC3C,IAAI,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAC1D,IAAI,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAChE,IAAI,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAChE,IAAI,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AACjE,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,YAAY;AACpD,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AACxD,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;AAC/D,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,iBAAiB,GAAG,YAAY;AACrD,EAAE,IAAI,iBAAiB,GAAG,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,YAAY,CAAC;AACjF,EAAE,IAAI,yBAAyB,GAAG,cAAc,GAAG,iBAAiB,CAAC;AACrE,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,MAAM;AACxD,IAAI,yBAAyB,GAAG,IAAI,CAAC;AACrC,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC9D,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,YAAY,GAAG,MAAM;AAC1C;AACA,EAAE,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,SAAS;AAClD,IAAI,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACzC,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,SAAS;AACrD,IAAI,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,UAAU,CAAC,CAAC;AACvE,EAAE,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,SAAS;AACjD,IAAI,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,aAAa,CAAC,CAAC;AAC1E;AACA;AACA,EAAE,QAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,gBAAgB;AACzD,IAAI,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACpD,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACpD,EAAE,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,gBAAgB;AAChE,IAAI,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACtD,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;AAC3E,EAAE,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,gBAAgB;AACvD,IAAI,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;AAC7E,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB;AAC5D,IAAI,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB;AAC5D,IAAI,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB;AAC5D,IAAI,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACpD,EAAE,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,gBAAgB;AAC5D,IAAI,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACpD,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,UAAU,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,gBAAgB;AACtD,IAAI,UAAU,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,gBAAgB;AACxD,IAAI,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,EAAE,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,gBAAgB;AACxD,IAAI,UAAU,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,gBAAgB;AAC3D,IAAI,WAAW,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,EAAE,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,gBAAgB;AAC3D,IAAI,UAAU,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9D,EAAE,QAAQ,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC,gBAAgB;AAC/D,IAAI,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC5D,EAAE,QAAQ,CAAC,cAAc,CAAC,qBAAqB,CAAC,CAAC,gBAAgB;AACjE,IAAI,OAAO,EAAE,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC3D,EAAE,QAAQ,CAAC,gBAAgB;AAC3B,IAAI,kBAAkB,EAAE,UAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;AACpF,EAAE,QAAQ,CAAC,gBAAgB;AAC3B,IAAI,wBAAwB,EAAE,UAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;AAC1F;AACA;AACA,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,gBAAgB;AAClD,IAAI,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;AAC3E,EAAE,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,gBAAgB;AACnD,IAAI,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;AAC5E,EAAE,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;AACjE,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA,UAAU,CAAC,SAAS,CAAC,cAAc,GAAG,YAAY;AAClD,EAAE,IAAI,OAAO,UAAU,CAAC,SAAS,KAAK,WAAW,IAAI,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1I,IAAI,UAAU,CAAC,aAAa,GAAG,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC/E,IAAI,IAAI,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;AACjD,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC;AACtB,IAAI,IAAI,SAAS,GAAG,IAAI,CAAC;AACzB,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC9D,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAC7C,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC;AACtC,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAC3C,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5C,MAAM,MAAM,CAAC,SAAS;AACtB,QAAQ,YAAY,GAAG,iBAAiB,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC/E,QAAQ,sBAAsB,CAAC;AAC/B,MAAM,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;AACnF,MAAM,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAC7B,KAAK;AACL,GAAG;AACH,CAAC,CAAC;AACF;AACA,UAAU,CAAC,SAAS,CAAC,gBAAgB,GAAG,MAAM;AAC9C,EAAE,IAAI,OAAO,UAAU,CAAC,SAAS,KAAK,WAAW,IAAI,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1I,IAAI,UAAU,CAAC,aAAa,GAAG,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC/E,IAAI,OAAO,UAAU,CAAC,aAAa,CAAC;AACpC,GAAG,MAAM;AACT,IAAI,OAAO,IAAI,CAAC;AAChB,GAAG;AACH,CAAC,CAAC;AACF;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,CAAC,eAAe,GAAG,UAAU,KAAK,EAAE;AAC9C,EAAE,QAAQ,KAAK,CAAC,IAAI;AACpB,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB;AAClD,MAAM,OAAO,6BAA6B;AAC1C,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM;AACrC,MAAM,OAAO,wCAAwC;AACrD,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa;AAC5C,MAAM,OAAO,6CAA6C;AAC1D,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB;AAChD,MAAM,OAAO,sCAAsC;AACnD,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB;AAChD,MAAM,OAAO,iDAAiD;AAC9D,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB;AACnD,MAAM,OAAO,sDAAsD;AACnE,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa;AAC5C,MAAM,OAAO,2DAA2D;AACxE,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO;AACtC,MAAM,OAAO,0BAA0B;AACvC,SAAS,KAAK,CAAC,WAAW,GAAG,IAAI,GAAG,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;AAC5D,IAAI;AACJ,MAAM,OAAO,KAAK,CAAC;AACnB,GAAG;AACH,CAAC,CAAC;AACF;AACA,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;AAClC,MAAM,CAAC,uBAAuB,CAAC,GAAG,UAAU,WAAW,EAAE;AACzD,EAAE,IAAI,WAAW,EAAE;AACnB,IAAI,UAAU,CAAC,oBAAoB,EAAE,CAAC;AACtC,GAAG;AACH,CAAC,CAAC;AACF;AACA,MAAM,CAAC,UAAU,GAAG,UAAU;;ACpuC9B;;;;;;"} \ No newline at end of file diff --git a/dist/ng-cast.component.d.ts b/dist/ng-cast.component.d.ts index 031d192..8d15d3c 100644 --- a/dist/ng-cast.component.d.ts +++ b/dist/ng-cast.component.d.ts @@ -1,14 +1,54 @@ -import { OnInit } from '@angular/core'; +import { OnInit, ElementRef } from '@angular/core'; import { NgCastService } from './shared/ng-cast.service'; +import { VgDASH } from 'videogular2/compiled/src/streaming/vg-dash/vg-dash'; +import { IDRMLicenseServer } from 'videogular2/compiled/src/streaming/streaming'; +import { VgAPI, BitrateOption } from 'videogular2/compiled/core'; +import { ScheduleDto } from './dto/schedule-dto'; +export interface IMediaStream { + type: 'vod' | 'dash'; + source: string; + label: string; + token?: string; + licenseServers?: IDRMLicenseServer; +} export declare class NgCastComponent implements OnInit { private ngCastService; + vgDash: VgDASH; + media: ElementRef; castingStatus: any; window: any; videoImage: string; imageOffline: boolean; + premium: boolean; srcImageOffline: string; + currentStream: IMediaStream; + api: VgAPI; + isDebug: boolean; + paused: boolean; + streams: IMediaStream[]; + playlist: Array; + play: boolean; + isHidden: boolean; + isShow: boolean; + currentIndex: number; + video: ScheduleDto; + appBaseUrl: String; constructor(ngCastService: NgCastService); ngOnInit(): void; + onPlayerReady(api: VgAPI): void; + setBitrate(option: BitrateOption): void; + nextVideo(): void; + getPaused(): boolean; + pause(): void; openSession(): void; closeSession(): void; + tryAgain(): void; + getVideos(): void; + getPosition(result: ScheduleDto): void; + getMuted(): boolean; + getMaximized(): boolean; + toggleSound(): void; + toggleMaximize(): void; + showVideoControls(): void; + hideVideoControls(): void; } diff --git a/dist/package.json b/dist/package.json index cb5826b..dd225f9 100644 --- a/dist/package.json +++ b/dist/package.json @@ -1,7 +1,7 @@ { "$schema": "./node_modules/ng-packagr/package.schema.json", "name": "@thinkam.net/ng-cast", - "version": "0.3.7", + "version": "0.4.2", "description": "Broadcast media on your TV from your Angular app", "main": "bundles/thinkam.net-ng-cast.umd.js", "repository": { @@ -23,7 +23,7 @@ }, "homepage": "https://github.com/ThinkAM/ngCast#readme", "dependencies": { - "tslib": "^1.9.0" + "tslib": "^2.0.0" }, "module": "fesm2015/thinkam.net-ng-cast.js", "es2015": "fesm2015/thinkam.net-ng-cast.js", diff --git a/dist/shared/ng-cast.service.d.ts b/dist/shared/ng-cast.service.d.ts index 8b0b488..9a51edf 100644 --- a/dist/shared/ng-cast.service.d.ts +++ b/dist/shared/ng-cast.service.d.ts @@ -13,7 +13,7 @@ export declare class NgCastService { initializeCastApi(): void; onInitSuccess: () => void; onError: (err: any) => void; - discoverDevices: () => Subject<{}>; + discoverDevices: () => Subject; onMediaDiscovered: (categories: any[]) => any; initialize(mediaContents: any): void; play: () => void; diff --git a/dist/thinkam.net-ng-cast.metadata.json b/dist/thinkam.net-ng-cast.metadata.json index 5b123ed..b7b4c0a 100644 --- a/dist/thinkam.net-ng-cast.metadata.json +++ b/dist/thinkam.net-ng-cast.metadata.json @@ -1 +1 @@ -{"__symbolic":"module","version":4,"metadata":{"NgCastModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":6,"character":1},"arguments":[{"schemas":[{"__symbolic":"reference","module":"@angular/core","name":"CUSTOM_ELEMENTS_SCHEMA","line":7,"character":13}],"imports":[{"__symbolic":"reference","module":"@angular/common","name":"CommonModule","line":9,"character":4}],"exports":[{"__symbolic":"reference","name":"ɵa"}],"providers":[{"__symbolic":"reference","name":"NgCastService"}],"declarations":[{"__symbolic":"reference","name":"ɵa"}]}]}],"members":{}},"NgCastService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":8,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor"}],"initializeCastApi":[{"__symbolic":"method"}],"initialize":[{"__symbolic":"method"}],"setCasting":[{"__symbolic":"method"}],"getStatus":[{"__symbolic":"method"}]}},"ɵa":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":4,"character":1},"arguments":[{"selector":"ng-cast","template":"
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n","styles":["body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"]}]}],"members":{"videoImage":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":15,"character":3}}]}],"imageOffline":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":16,"character":3}}]}],"srcImageOffline":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":17,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"NgCastService"}]}],"ngOnInit":[{"__symbolic":"method"}],"openSession":[{"__symbolic":"method"}],"closeSession":[{"__symbolic":"method"}]}}},"origins":{"NgCastModule":"./ng.cast.module","NgCastService":"./shared/ng-cast.service","ɵa":"./ng-cast.component"},"importAs":"@thinkam.net/ng-cast"} \ No newline at end of file +{"__symbolic":"module","version":4,"metadata":{"NgCastModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":11,"character":1},"arguments":[{"schemas":[{"__symbolic":"reference","module":"@angular/core","name":"CUSTOM_ELEMENTS_SCHEMA","line":12,"character":13}],"imports":[{"__symbolic":"reference","module":"@angular/common","name":"CommonModule","line":14,"character":4},{"__symbolic":"reference","module":"videogular2/compiled/core","name":"VgCoreModule","line":15,"character":4},{"__symbolic":"reference","module":"videogular2/compiled/controls","name":"VgControlsModule","line":16,"character":4},{"__symbolic":"reference","module":"videogular2/compiled/streaming","name":"VgStreamingModule","line":17,"character":4},{"__symbolic":"reference","module":"videogular2/compiled/buffering","name":"VgBufferingModule","line":18,"character":4},{"__symbolic":"reference","module":"videogular2/compiled/overlay-play","name":"VgOverlayPlayModule","line":19,"character":4}],"exports":[{"__symbolic":"reference","name":"ɵa"}],"providers":[{"__symbolic":"reference","name":"NgCastService"}],"declarations":[{"__symbolic":"reference","name":"ɵa"}]}]}],"members":{}},"NgCastService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":8,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor"}],"initializeCastApi":[{"__symbolic":"method"}],"initialize":[{"__symbolic":"method"}],"setCasting":[{"__symbolic":"method"}],"getStatus":[{"__symbolic":"method"}]}},"ɵa":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":18,"character":1},"arguments":[{"selector":"ng-cast","template":"
\n \n \n \n \n \n
\n \n \n
AGORA
\n
\n
\n \n \n \n \n
\n
\n \n \"TV\n \n\n\n
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n","styles":["#video-container{background-color:#272c34;margin:0 auto;z-index:-1}#video-container vg-scrub-bar-current-time .background{background-color:red}#video-container .hidden{display:none}#video-container .show{display:block}#video-container .video-controls{background:rgba(0,0,0,.5);bottom:0;height:45px;left:0;position:absolute;right:0;transition:all .2s ease}#video-container .video-controls.hide{opacity:0;pointer-events:none}#video-container .video-progress{align-items:right;height:8.4px;position:relative}#video-container .video-progress #seek-tooltip{position:absolute}@media screen and (-webkit-min-device-pixel-ratio:0){#video-container .video-progress input[type=range]{-webkit-appearance:none;background-color:var(--youtube-red);overflow:hidden}#video-container .video-progress input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;color:var(--youtube-red);height:10px;margin-top:-1px}#video-container .video-progress input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--youtube-red);cursor:ew-resize;height:10px;width:10px}}#video-container .video-progress input[type=range]{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-moz-range-progress,#video-container .video-progress input[type=range]::-moz-range-track{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-ms-fill-lower,#video-container .video-progress input[type=range]::-ms-fill-upper{background-color:var(--youtube-red)}#video-container progress{-moz-appearance:none;-webkit-appearance:none;appearance:none;border-radius:2px;height:.5vh;pointer-events:none;position:absolute;top:0;width:100%}#video-container .buttons .video-control{align-items:center;background:none;border:2px solid #fff;border-radius:16px;color:#fff;display:flex;height:32px;justify-content:center;width:32px}#video-container .buttons .video-control i{color:#fff;line-height:16px}#video-container .buttons .video-control-paused{bottom:8px;left:1vw;position:absolute;z-index:1000}#video-container .buttons .video-control-muted{bottom:8px;position:absolute;right:5vw;z-index:1000}#video-container .buttons .video-control-maximized{bottom:8px;position:absolute;right:1vw;z-index:1000}#video-container progress::-webkit-progress-bar{background-color:var(--youtube-red);border-radius:2px}#video-container progress::-webkit-progress-value{background:#fff;border-radius:2px}#video-container progress::-moz-progress-bar{background:#fff;border:1px solid #fff}#video-container .seek{cursor:pointer;height:.5vh;margin:0;position:absolute;top:0;width:100%}#video-container .seek-tooltip{background-color:var(--youtube-red);color:#fff;content:attr(data-title);display:block;font-size:12px;font-weight:700;margin-left:5vw;padding:3px;position:absolute;top:10px}.playlist-item li{color:#fff}.kt-content.kt-grid__item.kt-grid__item--fluid.kt-grid.kt-grid--hor{background-color:#272c34}#kt_header_menu_wrapper{display:none}.kt-header__bottom{display:none!important}.player-wrapper{margin:auto;max-width:500px}.player-wrapper video{width:100%}ul{padding:0}ul li.playlist-item{background:#673ab7;cursor:pointer;list-style:none;margin-bottom:2px;padding:10px}ul li.playlist-item.selected{background-color:#ccc}body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"]}]}],"members":{"vgDash":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":26,"character":3},"arguments":[{"__symbolic":"reference","module":"videogular2/compiled/src/streaming/vg-dash/vg-dash","name":"VgDASH","line":26,"character":13},{"static":false}]}]}],"media":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":27,"character":3},"arguments":["media",{"static":false}]}]}],"videoImage":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":32,"character":3}}]}],"imageOffline":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":33,"character":3}}]}],"premium":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":34,"character":3}}]}],"srcImageOffline":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":35,"character":3}}]}],"currentStream":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":37,"character":3}}]}],"isDebug":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":45,"character":3}}]}],"paused":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":47,"character":3}}]}],"streams":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":49,"character":3}}]}],"playlist":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":57,"character":3}}]}],"play":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":59,"character":3}}]}],"isHidden":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":60,"character":3}}]}],"isShow":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":61,"character":3}}]}],"currentIndex":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":63,"character":3}}]}],"video":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":64,"character":3}}]}],"appBaseUrl":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":65,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"NgCastService"}]}],"ngOnInit":[{"__symbolic":"method"}],"onPlayerReady":[{"__symbolic":"method"}],"setBitrate":[{"__symbolic":"method"}],"nextVideo":[{"__symbolic":"method"}],"getPaused":[{"__symbolic":"method"}],"pause":[{"__symbolic":"method"}],"openSession":[{"__symbolic":"method"}],"closeSession":[{"__symbolic":"method"}],"tryAgain":[{"__symbolic":"method"}],"getVideos":[{"__symbolic":"method"}],"getPosition":[{"__symbolic":"method"}],"getMuted":[{"__symbolic":"method"}],"getMaximized":[{"__symbolic":"method"}],"toggleSound":[{"__symbolic":"method"}],"toggleMaximize":[{"__symbolic":"method"}],"showVideoControls":[{"__symbolic":"method"}],"hideVideoControls":[{"__symbolic":"method"}]}}},"origins":{"NgCastModule":"./ng.cast.module","NgCastService":"./shared/ng-cast.service","ɵa":"./ng-cast.component"},"importAs":"@thinkam.net/ng-cast"} \ No newline at end of file diff --git a/dto/schedule-dto.ts b/dto/schedule-dto.ts new file mode 100644 index 0000000..b95c3b4 --- /dev/null +++ b/dto/schedule-dto.ts @@ -0,0 +1,70 @@ +import { TenantDto } from './tenant-dto'; + +export interface IScheduleDto { + id: string | undefined; + tenant: TenantDto | undefined; + name: string | undefined; + description: string | undefined; + url: string | undefined; + duration: number | undefined; + actualStart: Date; + realEnd?: Date | undefined; + isActive: boolean | undefined; +} + +export class ScheduleDto implements IScheduleDto { + id: string | undefined; + tenant: TenantDto | undefined; + name: string | undefined; + description: string | undefined; + url: string | undefined; + duration: number | undefined; + actualStart!: Date; + realEnd?: Date | undefined; + isActive: boolean | undefined; + + constructor(data?: IScheduleDto) { + if (data) { + for (let property in data) { + if (data.hasOwnProperty(property)) { + (this)[property] = (data)[property]; + } + } + } + } + + static fromJS(data: any): ScheduleDto { + data = typeof data === 'object' ? data : {}; + let result = new ScheduleDto(); + result.init(data); + return result; + } + + init(data?: any) { + if (data) { + this.id = data['id']; + this.tenant = data['tenant']; + this.name = data['name']; + this.description = data['description']; + this.url = data['url']; + this.duration = data['duration']; + this.actualStart = data['actualStart']; + this.realEnd = data['realEnd']; + this.isActive = data['isActive']; + } + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data['id'] = this.id; + data['tenant'] = this.tenant; + data['name'] = this.name; + data['description'] = this.description; + data['url'] = this.url; + data['duration'] = this.duration; + data['actualStart'] = this.actualStart; + data['realEnd'] = this.realEnd; + data['isActive'] = this.isActive; + return data; + } +} diff --git a/dto/tenant-dto.ts b/dto/tenant-dto.ts new file mode 100644 index 0000000..7dc6e2b --- /dev/null +++ b/dto/tenant-dto.ts @@ -0,0 +1,65 @@ +import * as moment from 'moment'; + +export class TenantDto implements ITenantDto { + tenancyName!: string | undefined; + name!: string | undefined; + connectionString!: string | undefined; + editionId!: number | undefined; + isActive!: boolean; + subscriptionEndDateUtc!: moment.Moment | undefined; + isInTrialPeriod!: boolean; + id!: number; + + constructor(data?: ITenantDto) { + if (data) { + for (var property in data) { + if (data.hasOwnProperty(property)) + (this)[property] = (data)[property]; + } + } + } + + init(data?: any) { + if (data) { + this.tenancyName = data["tenancyName"]; + this.name = data["name"]; + this.connectionString = data["connectionString"]; + this.editionId = data["editionId"]; + this.isActive = data["isActive"]; + this.subscriptionEndDateUtc = data["subscriptionEndDateUtc"] ? moment(data["subscriptionEndDateUtc"].toString()) : undefined; + this.isInTrialPeriod = data["isInTrialPeriod"]; + this.id = data["id"]; + } + } + + static fromJS(data: any): TenantDto { + data = typeof data === 'object' ? data : {}; + let result = new TenantDto(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["tenancyName"] = this.tenancyName; + data["name"] = this.name; + data["connectionString"] = this.connectionString; + data["editionId"] = this.editionId; + data["isActive"] = this.isActive; + data["subscriptionEndDateUtc"] = this.subscriptionEndDateUtc ? this.subscriptionEndDateUtc.toISOString() : undefined; + data["isInTrialPeriod"] = this.isInTrialPeriod; + data["id"] = this.id; + return data; + } +} + +export interface ITenantDto { + tenancyName: string | undefined; + name: string | undefined; + connectionString: string | undefined; + editionId: number | undefined; + isActive: boolean; + subscriptionEndDateUtc: moment.Moment | undefined; + isInTrialPeriod: boolean; + id: number; +} diff --git a/ng-cast.component.html b/ng-cast.component.html index e0d335d..846e626 100644 --- a/ng-cast.component.html +++ b/ng-cast.component.html @@ -1,4 +1,53 @@ -
+
+
+ + + +
+
+ + +
AGORA
+
+
+ + + + +
+
+
+ TV Offline +
+
+ +
IDLE
IDLE
diff --git a/ng-cast.component.scss b/ng-cast.component.scss index 135b9e6..a35c31e 100644 --- a/ng-cast.component.scss +++ b/ng-cast.component.scss @@ -1,3 +1,228 @@ + +#video-container { + background-color: #272C34; + margin: 0 auto; + z-index: -1; + + vg-scrub-bar-current-time { + .background { + background-color: red; + } + } + + .hidden { + display: none; + } + + .show { + display: block; + } + + .video-controls { + right: 0; + left: 0; + position: absolute; + bottom: 0; + transition: all 0.2s ease; + background: rgba(0, 0, 0, 0.5); + height: 45px; + } + + .video-controls.hide { + opacity: 0; + pointer-events: none; + } + + .video-progress { + position: relative; + height: 8.4px; + align-items: right; + + #seek-tooltip { + position: absolute; + } + + /*Chrome*/ + @media screen and (-webkit-min-device-pixel-ratio:0) { + input[type='range'] { + overflow: hidden; + -webkit-appearance: none; + background-color: var(--youtube-red); + } + + input[type='range']::-webkit-slider-runnable-track { + height: 10px; + -webkit-appearance: none; + color: var(--youtube-red); + margin-top: -1px; + } + + input[type='range']::-webkit-slider-thumb { + width: 10px; + -webkit-appearance: none; + height: 10px; + cursor: ew-resize; + background: var(--youtube-red); + } + } + + input[type="range"] { + background-color: var(--youtube-red); + } + + /** FF*/ + input[type="range"]::-moz-range-progress { + background-color: var(--youtube-red); + } + + input[type="range"]::-moz-range-track { + background-color: var(--youtube-red); + } + + /* IE*/ + input[type="range"]::-ms-fill-lower { + background-color: var(--youtube-red); + } + + input[type="range"]::-ms-fill-upper { + background-color: var(--youtube-red); + } + } + + progress { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: 2px; + width: 100%; + height: 0.5vh; + pointer-events: none; + position: absolute; + top: 0; + } + + .buttons { + .video-control { + background: none; + border: #fff 2px solid; + border-radius: 16px; + display: flex; + justify-content: center; + align-items: center; + width: 32px; + height: 32px; + color: white; + + i { + line-height: 16px; + color: white; + } + } + + .video-control-paused { + position: absolute; + left: 1vw; + bottom: 8px; + z-index: 1000; + } + + .video-control-muted { + position: absolute; + right: 5vw; + bottom: 8px; + z-index: 1000; + } + + .video-control-maximized { + position: absolute; + right: 1vw; + bottom: 8px; + z-index: 1000; + } + } + + progress::-webkit-progress-bar { + background-color: var(--youtube-red); + border-radius: 2px; + } + + progress::-webkit-progress-value { + background: white; + border-radius: 2px; + } + + progress::-moz-progress-bar { + border: 1px solid white; + background: white; + } + + .seek { + position: absolute; + top: 0; + width: 100%; + height: 0.5vh; + cursor: pointer; + margin: 0; + } + + .seek-tooltip { + display: block; + position: absolute; + top: 10px; + margin-left: 5vw; + font-size: 12px; + padding: 3px; + content: attr(data-title); + font-weight: bold; + color: #fff; + background-color: var(--youtube-red); + } +} + +.playlist-item { + li { + color: white; + } +} + +.kt-content.kt-grid__item.kt-grid__item--fluid.kt-grid.kt-grid--hor { + background-color: #272C34; +} + +#kt_header_menu_wrapper { + display: none; +} + +.kt-header__bottom { + display: none !important; +} + +.player-wrapper { + max-width: 500px; + margin: auto; + + video { + width: 100%; + } +} + +ul { + padding: 0px; + + li.playlist-item { + padding: 10px; + list-style: none; + background: #673AB7; + margin-bottom: 2px; + cursor: pointer; + } + + li.playlist-item.selected { + background-color: #ccc; + } +} + +// Premium body { background-color: #F2F2F2; font-family: 'Roboto', "OpenSans", "Verdana", Georgia, Serif; diff --git a/ng-cast.component.ts b/ng-cast.component.ts index 89aa3f9..0e5cea9 100644 --- a/ng-cast.component.ts +++ b/ng-cast.component.ts @@ -1,7 +1,21 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, ViewChild, ElementRef } from '@angular/core'; import { NgCastService } from './shared/ng-cast.service'; +import { VgDASH } from 'videogular2/compiled/src/streaming/vg-dash/vg-dash'; +import { IDRMLicenseServer } from 'videogular2/compiled/src/streaming/streaming'; +import { VgAPI, BitrateOption } from 'videogular2/compiled/core'; + +import { ScheduleDto } from './dto/schedule-dto'; + +export interface IMediaStream { + type: 'vod' | 'dash'; + source: string; + label: string; + token?: string; + licenseServers?: IDRMLicenseServer; +} + @Component({ selector: 'ng-cast', templateUrl: './ng-cast.component.html', @@ -10,19 +24,54 @@ import { NgCastService } from './shared/ng-cast.service'; ] }) export class NgCastComponent implements OnInit { + @ViewChild(VgDASH, { static: false }) vgDash!: VgDASH; + @ViewChild('media', { static: false }) media!: ElementRef; + castingStatus: any; window: any; @Input() videoImage = ''; @Input() imageOffline = false; + @Input() premium = false; @Input() srcImageOffline = ''; + @Input() currentStream: IMediaStream = { + type: 'dash', + label: 'DASH: Media Stream test', + source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd' + }; + + api: VgAPI = new VgAPI(); + + @Input() isDebug = false; + + @Input() paused = false; + + @Input() streams: IMediaStream[] = [ + { + type: 'dash', + label: 'DASH: Media Stream test', + source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd' + } + ]; + + @Input() playlist: Array = []; + + @Input() play = false; + @Input() isHidden = false; + @Input() isShow = true; + + @Input() currentIndex = 0; + @Input() video: ScheduleDto = new ScheduleDto(); + @Input() appBaseUrl: String = ''; + constructor( private ngCastService: NgCastService ) { } ngOnInit() { this.window = window; + this.currentStream = this.streams[0]; let ngCastService = this.ngCastService; this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) { @@ -34,6 +83,46 @@ export class NgCastComponent implements OnInit { this.castingStatus = this.ngCastService.getStatus(); } + onPlayerReady(api: VgAPI) { + this.api = api; + + this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this)); + } + + setBitrate(option: BitrateOption) { + switch (this.currentStream.type) { + case 'dash': + this.vgDash.setBitrate(option); + break; + } + } + + nextVideo() { + this.currentIndex++; + + if (this.currentIndex === this.playlist.length) { + this.currentIndex = 0; + } + + this.video = this.playlist[this.currentIndex]; + } + + getPaused() { + if (this.media && this.media.nativeElement) { + this.paused = this.media.nativeElement.paused; + return this.media.nativeElement.paused; + } else { + setTimeout(() => { + return this.getPaused(); + }, 2000); + } + } + + pause(): void { + this.media.nativeElement.pause(); + this.getPaused(); + } + openSession() { this.ngCastService.discoverDevices(); } @@ -41,4 +130,80 @@ export class NgCastComponent implements OnInit { closeSession() { this.ngCastService.discoverDevices(); } + + tryAgain() { + this.imageOffline = true; + this.isHidden = true; + console.log('loading...'); + + setTimeout(() => { + this.getVideos(); + }, 500); + } + + getVideos(): void { + if (this.playlist && this.playlist.length > 0) { + this.imageOffline = false; + this.video = this.playlist[this.currentIndex]; + + this.getPosition(this.video); + } else { + this.video = new ScheduleDto(); + this.tryAgain(); + } + } + + getPosition(result: ScheduleDto) { + setTimeout(() => { + let vid: any = document.getElementById('video_element'); + vid.load(); + + const now = new Date(); + const currentTime = Math.abs(now.getTime() - new Date(this.video.actualStart).getTime()); + + console.log('Temos no player: ' + result.url); + console.log('Início em: ' + currentTime); + + this.video.url = result.url; + vid['currentTime'] = currentTime / 1000; + + let promise = vid.play(); + if (promise !== undefined) { + promise.then((_: any) => { + // Autoplay started! + console.log('Estamos ao vivo!'); + }).catch(() => { + // Autoplay was prevented. + // Show a "Play" button so that user can start playback. + this.play = true; + }); + } + }, 1000); + } + + getMuted(): boolean { + return this.media && this.media.nativeElement && this.media.nativeElement.muted || false; + } + + getMaximized(): boolean { + return this.api && this.api.fsAPI && this.api.fsAPI.isFullscreen && this.api.fsAPI.isFullscreen || false; + } + + toggleSound(): void { + this.media.nativeElement.muted = !this.media.nativeElement.muted; + } + + toggleMaximize(): void { + this.api.fsAPI.toggleFullscreen(this.media); + } + + showVideoControls(): void { + this.isHidden = false; + this.isShow = true; + } + + hideVideoControls(): void { + this.isHidden = true; + this.isShow = false; + } } diff --git a/ng.cast.module.ts b/ng.cast.module.ts index cd3c74d..b013e7b 100644 --- a/ng.cast.module.ts +++ b/ng.cast.module.ts @@ -3,11 +3,21 @@ import { CommonModule } from '@angular/common'; import { NgCastComponent } from './ng-cast.component'; import { NgCastService } from './shared/ng-cast.service'; +import { VgCoreModule } from 'videogular2/compiled/core'; +import { VgControlsModule } from 'videogular2/compiled/controls'; +import { VgStreamingModule } from 'videogular2/compiled/streaming'; +import { VgBufferingModule } from 'videogular2/compiled/buffering'; +import { VgOverlayPlayModule } from 'videogular2/compiled/overlay-play'; @NgModule({ schemas: [ CUSTOM_ELEMENTS_SCHEMA ], imports: [ - CommonModule + CommonModule, + VgCoreModule, + VgControlsModule, + VgStreamingModule, + VgBufferingModule, + VgOverlayPlayModule, ], exports: [NgCastComponent], providers: [NgCastService], diff --git a/package-lock.json b/package-lock.json index dd7fea0..b250a16 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@thinkam.net/ng-cast", - "version": "0.0.22", + "version": "0.4.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -139,544 +139,336 @@ } }, "@angular-devkit/schematics": { - "version": "8.3.29", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.29.tgz", - "integrity": "sha512-AFJ9EK0XbcNlO5Dm9vr0OlBo1Nw6AaFXPR+DmHGBdcDDHxqEmYYLWfT+JU/8U2YFIdgrtlwvdtf6UQ3V2jdz1g==", - "dev": true, + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.2.0.tgz", + "integrity": "sha512-TQI5NnE6iM3ChF5gZQ9qb+lZgMWa7aLoF5ksOyT3zrmOuICiQYJhA6SsjV95q7J4M55qYymwBib8KTqU/xuQww==", "requires": { - "@angular-devkit/core": "8.3.29", - "rxjs": "6.4.0" + "@angular-devkit/core": "10.2.0", + "ora": "5.0.0", + "rxjs": "6.6.2" }, "dependencies": { "@angular-devkit/core": { - "version": "8.3.29", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.29.tgz", - "integrity": "sha512-4jdja9QPwR6XG14ZSunyyOWT3nE2WtZC5IMDIBZADxujXvhzOU0n4oWpy6/JVHLUAxYNNgzLz+/LQORRWndcPg==", - "dev": true, - "requires": { - "ajv": "6.12.3", - "fast-json-stable-stringify": "2.0.0", - "magic-string": "0.25.3", - "rxjs": "6.4.0", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.0.tgz", + "integrity": "sha512-XAszFhSF3mZw1VjoOsYGbArr5NJLcStjOvcCGjBPl1UBM2AKpuCQXHxI9XJGYKL3B93Vp5G58d8qkHvamT53OA==", + "requires": { + "ajv": "6.12.4", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.2", "source-map": "0.7.3" } - }, - "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "magic-string": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", - "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } } } }, "@angular/cli": { - "version": "8.3.29", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.3.29.tgz", - "integrity": "sha512-pW+iU0eKHIae+A1b9W5g8DKefMQcehZ+drGKs4Hryh8G+XGFS00BIWkmh6c1mydWTEhdsFlhdjD/rXCem7MAQQ==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.803.29", - "@angular-devkit/core": "8.3.29", - "@angular-devkit/schematics": "8.3.29", - "@schematics/angular": "8.3.29", - "@schematics/update": "0.803.29", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.2.0.tgz", + "integrity": "sha512-YBzwkFBmG6CdUJk8onsPXxHX/ByU5MERBQgYhLC873e2nZlXMUu+Ttq2Wai6apyskGvsXKxZNPOQSFZTGKXzXg==", + "requires": { + "@angular-devkit/architect": "0.1002.0", + "@angular-devkit/core": "10.2.0", + "@angular-devkit/schematics": "10.2.0", + "@schematics/angular": "10.2.0", + "@schematics/update": "0.1002.0", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", - "debug": "^4.1.1", + "debug": "4.1.1", "ini": "1.3.5", - "inquirer": "6.5.1", - "npm-package-arg": "6.1.0", - "npm-pick-manifest": "3.0.2", - "open": "6.4.0", - "pacote": "9.5.5", + "inquirer": "7.3.3", + "npm-package-arg": "8.0.1", + "npm-pick-manifest": "6.1.0", + "open": "7.2.0", + "pacote": "9.5.12", "read-package-tree": "5.3.1", - "rimraf": "3.0.0", - "semver": "6.3.0", + "rimraf": "3.0.2", + "semver": "7.3.2", "symbol-observable": "1.2.0", - "universal-analytics": "^0.4.20", - "uuid": "^3.3.2" + "universal-analytics": "0.4.23", + "uuid": "8.3.0" }, "dependencies": { "@angular-devkit/architect": { - "version": "0.803.29", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.29.tgz", - "integrity": "sha512-yHBud/fZHTelX24yjQg5lefZrfIebruoFTGeOwF0JdX8+KiHcTIxS4LOnUTYriasfHarcHRFXBAV/bRm+wv5ow==", - "dev": true, + "version": "0.1002.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1002.0.tgz", + "integrity": "sha512-twM8V03ujBIGVpgV1PBlSDodUdxtUb7WakutfWafAvEHUsgwzfvQz2VtKWvjNZ9AiYjnCuwkQaclqVv0VHNo9w==", "requires": { - "@angular-devkit/core": "8.3.29", - "rxjs": "6.4.0" + "@angular-devkit/core": "10.2.0", + "rxjs": "6.6.2" } }, "@angular-devkit/core": { - "version": "8.3.29", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.29.tgz", - "integrity": "sha512-4jdja9QPwR6XG14ZSunyyOWT3nE2WtZC5IMDIBZADxujXvhzOU0n4oWpy6/JVHLUAxYNNgzLz+/LQORRWndcPg==", - "dev": true, - "requires": { - "ajv": "6.12.3", - "fast-json-stable-stringify": "2.0.0", - "magic-string": "0.25.3", - "rxjs": "6.4.0", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.0.tgz", + "integrity": "sha512-XAszFhSF3mZw1VjoOsYGbArr5NJLcStjOvcCGjBPl1UBM2AKpuCQXHxI9XJGYKL3B93Vp5G58d8qkHvamT53OA==", + "requires": { + "ajv": "6.12.4", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.2", "source-map": "0.7.3" } }, - "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "magic-string": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", - "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "open": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "dev": true, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "tslib": "^1.9.0" + "ms": "^2.1.1" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" } } }, "@angular/common": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.2.14.tgz", - "integrity": "sha512-Qmt+aX2quUW54kaNT7QH7WGXnFxr/cC2C6sf5SW5SdkZfDQSiz8IaItvieZfXVQUbBOQKFRJ7TlSkt0jI/yjvw==", - "dev": true, + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.2.0.tgz", + "integrity": "sha512-4q7cb6Z18R1nQ8dN8uj6cckuk4jzY40lF7kpxf/wja0pQBUBtWwExwXsdHTVWGZ/mgQv9a5dTAPQq8/tSmf+hw==", "requires": { - "tslib": "^1.9.0" + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } } }, "@angular/compiler": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.2.14.tgz", - "integrity": "sha512-ABZO4E7eeFA1QyJ2trDezxeQM5ZFa1dXw1Mpl/+1vuXDKNjJgNyWYwKp/NwRkLmrsuV0yv4UDCDe4kJOGbPKnw==", - "dev": true, + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.2.0.tgz", + "integrity": "sha512-r+zNEDJmfH7pyQULgs6iQgMv/zH/CokepTuemrVbBKkUjd8F9Q84XdflR2Tx2rukiAAl4B0BuG+v4tSb9pR1WQ==", "requires": { - "tslib": "^1.9.0" + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } } }, "@angular/compiler-cli": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.2.14.tgz", - "integrity": "sha512-XDrTyrlIZM+0NquVT+Kbg5bn48AaWFT+B3bAT288PENrTdkuxuF9AhjFRZj8jnMdmaE4O2rioEkXBtl6z3zptA==", - "dev": true, + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.2.0.tgz", + "integrity": "sha512-NWTNg15LLL14MgooXV1Xb4w49I4OAfWakcc0J7XQm3B3mRFuue/UfXE9dKMStenTfmtUnNO9c+xjZRhTWYJkfw==", "requires": { "canonical-path": "1.0.0", - "chokidar": "^2.1.1", + "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", "dependency-graph": "^0.7.2", + "fs-extra": "4.0.2", "magic-string": "^0.25.0", "minimist": "^1.2.0", "reflect-metadata": "^0.1.2", + "semver": "^6.3.0", "source-map": "^0.6.1", - "tslib": "^1.9.0", - "yargs": "13.1.0" + "sourcemap-codec": "^1.4.8", + "tslib": "^2.0.0", + "yargs": "15.3.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "color-convert": "^2.0.1" } }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "color-name": "~1.1.4" } }, - "cliui": { + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - } + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, + "fs-extra": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } + "graceful-fs": "^4.1.6" } }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { - "binary-extensions": "^1.0.0" + "p-locate": "^4.1.0" } }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "p-limit": "^2.2.0" } }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "requires": { - "ansi-regex": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "ansi-regex": "^5.0.0" } }, + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "yargs": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz", - "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", - "dev": true, + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz", + "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==", "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^3.0.0", + "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" + "yargs-parser": "^18.1.0" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, "@angular/core": { - "version": "8.2.14", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.2.14.tgz", - "integrity": "sha512-zeePkigi+hPh3rN7yoNENG/YUBUsIvUXdxx+AZq+QPaFeKEA2FBSrKn36ojHFrdJUjKzl0lPMEiGC2b6a6bo6g==", - "dev": true, + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.2.0.tgz", + "integrity": "sha512-pj+0cIDHMfeTFFrxbxM1qanSqhnA3ybCYMQm+Fs/WAPlLSvB6s/vVhq6tCdicHzd7/fujGXPcb8Hvtx+km8TqQ==", "requires": { - "tslib": "^1.9.0" + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } } }, "@babel/code-frame": { @@ -1904,136 +1696,55 @@ } }, "@schematics/angular": { - "version": "8.3.29", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.29.tgz", - "integrity": "sha512-If+UhCsQzCgnQymiiF8dQRoic34+RgJ6rV0n4k7Tm4N2xNYJOG7ajjzKM7PIeafsF50FKnFP8dqaNGxCMyq5Ew==", - "dev": true, + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.2.0.tgz", + "integrity": "sha512-rJRTTTL8CMMFb3ebCvAVHKHxuNzRqy/HtbXhJ82l5Xo/jXcm74eV2Q0RBUrNo1yBKWFIR+FIwiXLJaGcC/R9Pw==", "requires": { - "@angular-devkit/core": "8.3.29", - "@angular-devkit/schematics": "8.3.29" + "@angular-devkit/core": "10.2.0", + "@angular-devkit/schematics": "10.2.0", + "jsonc-parser": "2.3.0" }, "dependencies": { "@angular-devkit/core": { - "version": "8.3.29", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.29.tgz", - "integrity": "sha512-4jdja9QPwR6XG14ZSunyyOWT3nE2WtZC5IMDIBZADxujXvhzOU0n4oWpy6/JVHLUAxYNNgzLz+/LQORRWndcPg==", - "dev": true, - "requires": { - "ajv": "6.12.3", - "fast-json-stable-stringify": "2.0.0", - "magic-string": "0.25.3", - "rxjs": "6.4.0", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.0.tgz", + "integrity": "sha512-XAszFhSF3mZw1VjoOsYGbArr5NJLcStjOvcCGjBPl1UBM2AKpuCQXHxI9XJGYKL3B93Vp5G58d8qkHvamT53OA==", + "requires": { + "ajv": "6.12.4", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.2", "source-map": "0.7.3" } - }, - "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "magic-string": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", - "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } } } }, "@schematics/update": { - "version": "0.803.29", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.803.29.tgz", - "integrity": "sha512-Syf6h6DYeu1WU9aLihMwIgVASpcHCxUYqhZyHfQABiK8NkdlZ+KAp4cOxihsZyDqIJNLWON+0/FLPAQF3BXh5Q==", - "dev": true, + "version": "0.1002.0", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1002.0.tgz", + "integrity": "sha512-g2bfJSAj3x/YL0GNhnHsDSQmO6DoxSnLxoFLqNN5+ukxK5jq7OZNDwMJGxZ3X6RcSMWKEkIKL/wlq9yhj2T/kw==", "requires": { - "@angular-devkit/core": "8.3.29", - "@angular-devkit/schematics": "8.3.29", + "@angular-devkit/core": "10.2.0", + "@angular-devkit/schematics": "10.2.0", "@yarnpkg/lockfile": "1.1.0", "ini": "1.3.5", - "pacote": "9.5.5", - "rxjs": "6.4.0", - "semver": "6.3.0", + "npm-package-arg": "^8.0.0", + "pacote": "9.5.12", + "semver": "7.3.2", "semver-intersect": "1.4.0" }, "dependencies": { "@angular-devkit/core": { - "version": "8.3.29", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.29.tgz", - "integrity": "sha512-4jdja9QPwR6XG14ZSunyyOWT3nE2WtZC5IMDIBZADxujXvhzOU0n4oWpy6/JVHLUAxYNNgzLz+/LQORRWndcPg==", - "dev": true, - "requires": { - "ajv": "6.12.3", - "fast-json-stable-stringify": "2.0.0", - "magic-string": "0.25.3", - "rxjs": "6.4.0", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.0.tgz", + "integrity": "sha512-XAszFhSF3mZw1VjoOsYGbArr5NJLcStjOvcCGjBPl1UBM2AKpuCQXHxI9XJGYKL3B93Vp5G58d8qkHvamT53OA==", + "requires": { + "ajv": "6.12.4", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.2", "source-map": "0.7.3" } - }, - "ajv": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", - "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "magic-string": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", - "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.4" - } - }, - "rxjs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", - "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true } } }, @@ -2307,14 +2018,12 @@ "@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" }, "JSONStream": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, "requires": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -2393,7 +2102,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, "requires": { "es6-promisify": "^5.0.0" } @@ -2402,7 +2110,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", - "dev": true, "requires": { "humanize-ms": "^1.2.1" } @@ -2421,7 +2128,6 @@ "version": "6.12.4", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2457,7 +2163,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, "requires": { "type-fest": "^0.11.0" }, @@ -2465,8 +2170,7 @@ "type-fest": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" } } }, @@ -2495,7 +2199,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -2504,8 +2207,7 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "argparse": { "version": "1.0.10", @@ -2567,14 +2269,12 @@ "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, "requires": { "safer-buffer": "~2.1.0" } @@ -2611,8 +2311,7 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assign-symbols": { "version": "1.0.0", @@ -2644,8 +2343,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "at-least-node": { "version": "1.0.0", @@ -2677,14 +2375,12 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", - "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", - "dev": true + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" }, "babel-loader": { "version": "8.1.0", @@ -2744,8 +2440,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -2818,7 +2513,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, "requires": { "tweetnacl": "^0.14.3" } @@ -2832,14 +2526,12 @@ "binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "bn.js": { "version": "5.1.3", @@ -2921,7 +2613,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2931,7 +2622,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -3068,8 +2758,7 @@ "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "buffer-indexof": { "version": "1.1.1", @@ -3098,8 +2787,7 @@ "builtins": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", - "dev": true + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" }, "bytes": { "version": "3.0.0", @@ -3208,14 +2896,12 @@ "canonical-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", - "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", - "dev": true + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==" }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "chalk": { "version": "2.4.2", @@ -3231,14 +2917,12 @@ "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, "chokidar": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "dev": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", @@ -3314,16 +2998,19 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, "requires": { "restore-cursor": "^3.1.0" } }, + "cli-spinners": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==" + }, "cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" }, "cliui": { "version": "5.0.0", @@ -3370,12 +3057,6 @@ "q": "^1.1.2" } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -3431,7 +3112,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -3507,14 +3187,12 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -3559,7 +3237,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, "requires": { "safe-buffer": "~5.1.1" } @@ -3580,7 +3257,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, "requires": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -3594,7 +3270,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -3664,8 +3339,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { "version": "5.2.1", @@ -3996,8 +3670,7 @@ "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, "d": { "version": "1.0.1", @@ -4013,7 +3686,6 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -4033,7 +3705,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -4041,14 +3712,12 @@ "debuglog": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", - "dev": true + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=" }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { "version": "0.2.0", @@ -4086,11 +3755,25 @@ "ip-regex": "^2.1.0" } }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "^1.0.2" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + } + } + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, "requires": { "object-keys": "^1.0.12" } @@ -4201,8 +3884,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "depd": { "version": "1.1.2", @@ -4213,8 +3895,7 @@ "dependency-graph": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", - "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", - "dev": true + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==" }, "des.js": { "version": "1.0.1", @@ -4242,7 +3923,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", - "dev": true, "requires": { "asap": "^2.0.0", "wrappy": "1" @@ -4354,7 +4034,6 @@ "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -4366,7 +4045,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -4429,7 +4107,6 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, "requires": { "iconv-lite": "^0.6.2" } @@ -4438,7 +4115,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -4463,8 +4139,7 @@ "err-code": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", - "dev": true + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=" }, "errno": { "version": "0.1.7", @@ -4488,7 +4163,6 @@ "version": "1.18.0-next.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", @@ -4508,7 +4182,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -4540,14 +4213,12 @@ "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "es6-promisify": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dev": true, "requires": { "es6-promise": "^4.0.3" } @@ -4577,8 +4248,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint-scope": { "version": "4.0.3", @@ -4814,8 +4484,7 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "3.0.2", @@ -4842,7 +4511,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -4853,7 +4521,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -4928,14 +4595,12 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { "version": "3.2.4", @@ -4954,8 +4619,7 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fastq": { "version": "1.8.0", @@ -4978,14 +4642,12 @@ "figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } @@ -5004,7 +4666,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -5131,7 +4792,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, "requires": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" @@ -5152,14 +4812,12 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -5191,7 +4849,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -5222,7 +4879,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", @@ -5233,27 +4889,23 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, "optional": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "genfun": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", - "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", - "dev": true + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==" }, "gensync": { "version": "1.0.0-beta.1", @@ -5264,14 +4916,12 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, "requires": { "pump": "^3.0.0" } @@ -5286,7 +4936,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -5295,7 +4944,6 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5309,7 +4957,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -5337,8 +4984,7 @@ "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, "handle-thing": { "version": "2.0.1", @@ -5349,14 +4995,12 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, "requires": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -5366,7 +5010,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -5380,8 +5023,7 @@ "has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" }, "has-value": { "version": "1.0.0", @@ -5495,8 +5137,7 @@ "hosted-git-info": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" }, "hpack.js": { "version": "2.1.6", @@ -5537,8 +5178,7 @@ "http-cache-semantics": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", - "dev": true + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" }, "http-deceiver": { "version": "1.2.7", @@ -5582,7 +5222,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, "requires": { "agent-base": "4", "debug": "3.1.0" @@ -5592,7 +5231,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -5600,8 +5238,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -5726,7 +5363,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -5743,7 +5379,6 @@ "version": "2.2.4", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, "requires": { "agent-base": "^4.3.0", "debug": "^3.1.0" @@ -5753,7 +5388,6 @@ "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, "requires": { "ms": "^2.1.1" } @@ -5764,7 +5398,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "dev": true, "requires": { "ms": "^2.0.0" } @@ -5773,7 +5406,6 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -5796,8 +5428,7 @@ "iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "ignore": { "version": "5.1.8", @@ -5809,7 +5440,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "dev": true, "requires": { "minimatch": "^3.0.4" } @@ -5862,8 +5492,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "indent-string": { "version": "4.0.0", @@ -5880,14 +5509,12 @@ "infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -5896,14 +5523,12 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "injection-js": { "version": "2.3.1", @@ -5915,81 +5540,99 @@ } }, "inquirer": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.1.tgz", - "integrity": "sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw==", - "dev": true, + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", + "chalk": "^4.1.0", "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", + "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", - "lodash": "^4.17.15", + "lodash": "^4.17.19", "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" }, "dependencies": { "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" } } } @@ -6013,17 +5656,10 @@ "loose-envify": "^1.0.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, "ip-regex": { "version": "2.1.0", @@ -6079,7 +5715,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -6093,8 +5728,7 @@ "is-callable": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==" }, "is-color-stop": { "version": "1.1.0", @@ -6133,8 +5767,7 @@ "is-date-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" }, "is-descriptor": { "version": "0.1.6", @@ -6164,8 +5797,7 @@ "is-docker": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", - "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", - "dev": true + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==" }, "is-extendable": { "version": "0.1.1", @@ -6176,8 +5808,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-fullwidth-code-point": { "version": "2.0.0", @@ -6189,11 +5820,15 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" + }, "is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -6203,14 +5838,12 @@ "is-negative-zero": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", - "dev": true + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=" }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-obj": { "version": "2.0.0", @@ -6270,7 +5903,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", - "dev": true, "requires": { "has-symbols": "^1.0.1" } @@ -6300,7 +5932,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, "requires": { "has-symbols": "^1.0.1" } @@ -6308,8 +5939,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-windows": { "version": "1.0.2", @@ -6321,7 +5951,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, "requires": { "is-docker": "^2.0.0" } @@ -6329,14 +5958,12 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", @@ -6347,8 +5974,7 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul-lib-coverage": { "version": "3.0.0", @@ -6423,8 +6049,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsesc": { "version": "2.5.2", @@ -6435,32 +6060,27 @@ "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json3": { "version": "3.3.3", @@ -6477,6 +6097,11 @@ "minimist": "^1.2.5" } }, + "jsonc-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz", + "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==" + }, "jsonfile": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", @@ -6490,14 +6115,12 @@ "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -6532,15 +6155,6 @@ "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "less": { "version": "3.12.2", "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz", @@ -6639,8 +6253,7 @@ "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, "lodash.clonedeep": { "version": "4.5.0", @@ -6666,6 +6279,59 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "requires": { + "chalk": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "loglevel": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", @@ -6685,7 +6351,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "requires": { "yallist": "^4.0.0" } @@ -6694,7 +6359,6 @@ "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, "requires": { "sourcemap-codec": "^1.4.4" } @@ -6721,7 +6385,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", - "dev": true, "requires": { "agentkeepalive": "^3.4.1", "cacache": "^12.0.0", @@ -6740,7 +6403,6 @@ "version": "12.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, "requires": { "bluebird": "^3.5.5", "chownr": "^1.1.1", @@ -6762,14 +6424,12 @@ "chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "requires": { "yallist": "^3.0.2" } @@ -6778,7 +6438,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -6787,7 +6446,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, "requires": { "figgy-pudding": "^3.5.1" } @@ -6795,20 +6453,10 @@ "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -6847,17 +6495,6 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, "memory-fs": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", @@ -6946,14 +6583,12 @@ "mime-db": { "version": "1.44.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", - "dev": true + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" }, "mime-types": { "version": "2.1.27", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", - "dev": true, "requires": { "mime-db": "1.44.0" } @@ -6961,8 +6596,7 @@ "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mini-css-extract-plugin": { "version": "0.10.0", @@ -7037,7 +6671,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -7045,8 +6678,7 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minipass": { "version": "3.1.3", @@ -7098,7 +6730,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, "requires": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -7137,16 +6768,19 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, "requires": { "minimist": "^1.2.5" } }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, "requires": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", @@ -7160,7 +6794,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -7170,8 +6803,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { "version": "6.2.3", @@ -7192,8 +6824,7 @@ "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "nanomatch": { "version": "1.2.13", @@ -7296,7 +6927,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", - "dev": true, "requires": { "encoding": "^0.1.11", "json-parse-better-errors": "^1.0.0", @@ -7382,7 +7012,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -7393,16 +7022,14 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-range": { "version": "0.1.2", @@ -7420,34 +7047,40 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "dev": true, "requires": { "npm-normalize-package-bin": "^1.0.1" } }, + "npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "requires": { + "semver": "^7.1.1" + } + }, "npm-normalize-package-bin": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" }, "npm-package-arg": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", - "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", - "dev": true, + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", + "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", "requires": { - "hosted-git-info": "^2.6.0", - "osenv": "^0.1.5", - "semver": "^5.5.0", + "hosted-git-info": "^3.0.2", + "semver": "^7.0.0", "validate-npm-package-name": "^3.0.0" }, "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "hosted-git-info": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", + "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "requires": { + "lru-cache": "^6.0.0" + } } } }, @@ -7455,7 +7088,6 @@ "version": "1.4.8", "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "dev": true, "requires": { "ignore-walk": "^3.0.1", "npm-bundled": "^1.0.1", @@ -7463,29 +7095,19 @@ } }, "npm-pick-manifest": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", - "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", - "dev": true, + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", + "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" } }, "npm-registry-fetch": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz", "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", - "dev": true, "requires": { "JSONStream": "^1.3.4", "bluebird": "^3.5.1", @@ -7500,22 +7122,35 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "requires": { "yallist": "^3.0.2" } }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } }, @@ -7543,17 +7178,10 @@ "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", "dev": true }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "4.1.1", @@ -7595,8 +7223,7 @@ "object-inspect": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", - "dev": true + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" }, "object-is": { "version": "1.1.3", @@ -7611,8 +7238,7 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-path": { "version": "0.11.4", @@ -7633,7 +7259,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", - "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.18.0-next.0", @@ -7645,7 +7270,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1" @@ -7655,7 +7279,6 @@ "version": "1.17.7", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", @@ -7739,7 +7362,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -7748,7 +7370,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "requires": { "mimic-fn": "^2.1.0" } @@ -7757,7 +7378,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/open/-/open-7.2.0.tgz", "integrity": "sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ==", - "dev": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -7780,6 +7400,79 @@ } } }, + "ora": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.0.0.tgz", + "integrity": "sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw==", + "requires": { + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.4.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "original": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", @@ -7798,59 +7491,32 @@ "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "osenv": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" } }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "requires": { "p-try": "^2.0.0" } @@ -7885,17 +7551,16 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "pacote": { - "version": "9.5.5", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.5.tgz", - "integrity": "sha512-jAEP+Nqj4kyMWyNpfTU/Whx1jA7jEc5cCOlurm0/0oL+v8TAp1QSsK83N7bYe+2bEdFzMAtPG5TBebjzzGV0cA==", - "dev": true, + "version": "9.5.12", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz", + "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==", "requires": { "bluebird": "^3.5.3", "cacache": "^12.0.2", + "chownr": "^1.1.2", "figgy-pudding": "^3.5.1", "get-stream": "^4.1.0", "glob": "^7.1.3", @@ -7907,9 +7572,10 @@ "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "normalize-package-data": "^2.4.0", + "npm-normalize-package-bin": "^1.0.0", "npm-package-arg": "^6.1.0", "npm-packlist": "^1.1.12", - "npm-pick-manifest": "^2.2.3", + "npm-pick-manifest": "^3.0.0", "npm-registry-fetch": "^4.0.0", "osenv": "^0.1.5", "promise-inflight": "^1.0.1", @@ -7919,7 +7585,7 @@ "safe-buffer": "^5.1.2", "semver": "^5.6.0", "ssri": "^6.0.1", - "tar": "^4.4.8", + "tar": "^4.4.10", "unique-filename": "^1.1.1", "which": "^1.3.1" }, @@ -7928,7 +7594,6 @@ "version": "12.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, "requires": { "bluebird": "^3.5.5", "chownr": "^1.1.1", @@ -7950,14 +7615,12 @@ "chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "fs-minipass": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, "requires": { "minipass": "^2.6.0" } @@ -7966,7 +7629,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "requires": { "yallist": "^3.0.2" } @@ -7975,7 +7637,6 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -7985,16 +7646,25 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, "requires": { "minipass": "^2.9.0" } }, + "npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "requires": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, "npm-pick-manifest": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", - "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", - "dev": true, + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", "requires": { "figgy-pudding": "^3.5.1", "npm-package-arg": "^6.0.0", @@ -8005,7 +7675,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -8013,14 +7682,12 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, "requires": { "figgy-pudding": "^3.5.1" } @@ -8029,7 +7696,6 @@ "version": "4.4.13", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", @@ -8043,8 +7709,7 @@ "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } }, @@ -8058,7 +7723,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, "requires": { "cyclist": "^1.0.1", "inherits": "^2.0.3", @@ -8136,8 +7800,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -8154,8 +7817,7 @@ "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-to-regexp": { "version": "0.1.7", @@ -8185,14 +7847,12 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" }, "pify": { "version": "4.0.1", @@ -8922,20 +8582,17 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "promise-retry": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", - "dev": true, "requires": { "err-code": "^1.0.0", "retry": "^0.10.0" @@ -8944,8 +8601,7 @@ "retry": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", - "dev": true + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=" } } }, @@ -8953,7 +8609,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", - "dev": true, "requires": { "genfun": "^5.0.0" } @@ -8977,8 +8632,7 @@ "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" }, "public-encrypt": { "version": "4.0.3", @@ -9006,7 +8660,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -9016,7 +8669,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, "requires": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -9027,7 +8679,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -9038,8 +8689,7 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "q": { "version": "1.5.1", @@ -9166,7 +8816,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", - "dev": true, "requires": { "glob": "^7.1.1", "json-parse-even-better-errors": "^2.3.0", @@ -9178,7 +8827,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", - "dev": true, "requires": { "read-package-json": "^2.0.0", "readdir-scoped-modules": "^1.0.0", @@ -9225,7 +8873,6 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -9240,7 +8887,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", - "dev": true, "requires": { "debuglog": "^1.0.1", "dezalgo": "^1.0.0", @@ -9252,7 +8898,6 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -9260,8 +8905,7 @@ "reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, "regenerate": { "version": "1.4.1", @@ -9399,7 +9043,6 @@ "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -9426,22 +9069,19 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" } } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "requires-port": { "version": "1.0.0", @@ -9453,7 +9093,6 @@ "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, "requires": { "path-parse": "^1.0.6" } @@ -9561,7 +9200,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, "requires": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -9625,7 +9263,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -9674,8 +9311,7 @@ "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" }, "run-parallel": { "version": "1.1.9", @@ -9687,7 +9323,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, "requires": { "aproba": "^1.1.1" } @@ -9696,7 +9331,6 @@ "version": "6.6.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", - "dev": true, "requires": { "tslib": "^1.9.0" } @@ -9704,8 +9338,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -9719,8 +9352,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { "version": "1.26.10", @@ -9779,14 +9411,12 @@ "semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" }, "semver-intersect": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", - "dev": true, "requires": { "semver": "^5.0.0" }, @@ -9794,8 +9424,7 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -9925,8 +9554,7 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-value": { "version": "2.0.1", @@ -9991,8 +9619,7 @@ "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "simple-swizzle": { "version": "0.2.2", @@ -10020,8 +9647,7 @@ "smart-buffer": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", - "dev": true + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" }, "snapdragon": { "version": "0.8.2", @@ -10200,7 +9826,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", - "dev": true, "requires": { "ip": "1.1.5", "smart-buffer": "^4.1.0" @@ -10210,7 +9835,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", - "dev": true, "requires": { "agent-base": "~4.2.1", "socks": "~2.3.2" @@ -10220,7 +9844,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "dev": true, "requires": { "es6-promisify": "^5.0.0" } @@ -10245,8 +9868,7 @@ "source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" }, "source-map-loader": { "version": "1.0.2", @@ -10309,14 +9931,12 @@ "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -10325,14 +9945,12 @@ "spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -10341,8 +9959,7 @@ "spdx-license-ids": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", - "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", - "dev": true + "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==" }, "spdy": { "version": "4.0.2", @@ -10412,7 +10029,6 @@ "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -10481,7 +10097,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" @@ -10503,8 +10118,7 @@ "stream-shift": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" }, "strict-uri-encode": { "version": "1.1.0", @@ -10544,7 +10158,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" @@ -10554,7 +10167,6 @@ "version": "1.17.7", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", @@ -10575,7 +10187,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" @@ -10585,7 +10196,6 @@ "version": "1.17.7", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", @@ -10606,7 +10216,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -10771,8 +10380,7 @@ "symbol-observable": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" }, "tapable": { "version": "1.1.3", @@ -10858,14 +10466,12 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -10896,7 +10502,6 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -10949,7 +10554,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -10964,7 +10568,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -10994,8 +10597,7 @@ "tslib": { "version": "1.14.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.0.tgz", - "integrity": "sha512-+Zw5lu0D9tvBMjGP8LpvMb0u2WW2QV3y+D8mO6J+cNzCYIN4sVy43Bf9vl92nqFahutN0I8zHa7cc4vihIshnw==", - "dev": true + "integrity": "sha512-+Zw5lu0D9tvBMjGP8LpvMb0u2WW2QV3y+D8mO6J+cNzCYIN4sVy43Bf9vl92nqFahutN0I8zHa7cc4vihIshnw==" }, "tty-browserify": { "version": "0.0.0", @@ -11007,7 +10609,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -11015,8 +10616,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "type": { "version": "1.2.0", @@ -11043,13 +10643,12 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", - "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.5.tgz", + "integrity": "sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ==", "dev": true }, "unicode-canonical-property-names-ecmascript": { @@ -11108,7 +10707,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, "requires": { "unique-slug": "^2.0.0" } @@ -11117,7 +10715,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, "requires": { "imurmurhash": "^0.1.4" } @@ -11126,7 +10723,6 @@ "version": "0.4.23", "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", - "dev": true, "requires": { "debug": "^4.1.1", "request": "^2.88.2", @@ -11201,7 +10797,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -11266,14 +10861,12 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util-promisify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", - "dev": true, "requires": { "object.getownpropertydescriptors": "^2.0.3" } @@ -11320,14 +10913,12 @@ "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -11337,7 +10928,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", - "dev": true, "requires": { "builtins": "^1.0.3" } @@ -11358,13 +10948,17 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, + "videogular2": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/videogular2/-/videogular2-7.0.2.tgz", + "integrity": "sha512-Y5r2S2nG3ALFSW2i48QXgJjAEERYGwJoub4DeIYLczkSRrkkwIypSOBCEprI9csmynwKAJ79rUy8DLN13DGlIQ==" + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -11618,6 +11212,14 @@ "minimalistic-assert": "^1.0.0" } }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "requires": { + "defaults": "^1.0.3" + } + }, "webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", @@ -12306,7 +11908,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -12314,8 +11915,7 @@ "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "worker-farm": { "version": "1.7.0", @@ -12388,8 +11988,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "wrench": { "version": "1.5.9", @@ -12409,8 +12008,7 @@ "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "xxhashjs": { "version": "0.2.2", @@ -12424,14 +12022,12 @@ "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs": { "version": "13.3.2", diff --git a/package.json b/package.json index 8c07ebd..92e966e 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,18 @@ { "$schema": "./node_modules/ng-packagr/package.schema.json", "name": "@thinkam.net/ng-cast", - "version": "0.3.7", + "version": "0.4.2", "ngPackage": { "lib": { - "entryFile": "index.ts" + "entryFile": "index.ts", + "umdModuleIds": { + "videogular2/compiled/core": "VgCoreModule", + "videogular2/compiled/controls": "VgControlsModule", + "videogular2/compiled/streaming": "VgStreamingModule", + "videogular2/compiled/buffering": "VgBufferingModule", + "videogular2/compiled/overlay-play": "VgOverlayPlayModule", + "videogular2/compiled/src/streaming/vg-dash/vg-dash": "VgDASH" + } } }, "description": "Broadcast media on your TV from your Angular app", @@ -33,12 +41,17 @@ "homepage": "https://github.com/ThinkAM/ngCast#readme", "devDependencies": { "@angular-devkit/build-angular": "^0.1001.5", - "@angular/cli": "^8.3.29", - "@angular/common": "^8.2.5", - "@angular/core": "^8.2.5", + "@angular/cli": "^10.2.0", + "@angular/common": "^10.2.0", + "@angular/core": "^10.2.0", + "@angular/compiler": "^10.2.0", + "@angular/compiler-cli": "^10.2.0", "ng-packagr": "^10.1.2", - "typescript": "^3.4.5", + "typescript": "^4.0.5", + "moment": "^2.24.0", + "videogular2": "^7.0.1", "wrench": "^1.5.9" }, - "dependencies": {} + "dependencies": { + } } From d6e233737ff786b06e6d89649d60cbd9e5049377 Mon Sep 17 00:00:00 2001 From: Felipe de Almeida Date: Tue, 27 Oct 2020 05:19:23 -0300 Subject: [PATCH 08/10] bug fixed - getPaused --- dist/bundles/thinkam.net-ng-cast.umd.js | 11 ++++++++--- dist/bundles/thinkam.net-ng-cast.umd.js.map | 2 +- dist/bundles/thinkam.net-ng-cast.umd.min.js | 2 +- dist/bundles/thinkam.net-ng-cast.umd.min.js.map | 2 +- dist/esm2015/ng-cast.component.js | 12 ++++++++---- dist/fesm2015/thinkam.net-ng-cast.js | 10 +++++++--- dist/fesm2015/thinkam.net-ng-cast.js.map | 2 +- dist/ng-cast.component.d.ts | 5 +++-- dist/package.json | 2 +- dist/thinkam.net-ng-cast.metadata.json | 2 +- ng-cast.component.html | 6 +++--- ng-cast.component.scss | 10 ---------- ng-cast.component.ts | 12 +++++++++--- package.json | 2 +- 14 files changed, 45 insertions(+), 35 deletions(-) diff --git a/dist/bundles/thinkam.net-ng-cast.umd.js b/dist/bundles/thinkam.net-ng-cast.umd.js index ee04629..3a1e323 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.js +++ b/dist/bundles/thinkam.net-ng-cast.umd.js @@ -148,7 +148,6 @@ }; this.api = new core$1.VgAPI(); this.isDebug = false; - this.paused = false; this.streams = [ { type: 'dash', @@ -175,6 +174,12 @@ }; this.castingStatus = this.ngCastService.getStatus(); }; + NgCastComponent.prototype.ngAfterViewChecked = function () { + var _this = this; + setInterval(function () { + _this.getPaused(); + }, 500); + }; NgCastComponent.prototype.onPlayerReady = function (api) { this.api = api; this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this)); @@ -284,8 +289,8 @@ NgCastComponent.decorators = [ { type: core.Component, args: [{ selector: 'ng-cast', - template: "
\n \n \n \n \n \n
\n \n \n
AGORA
\n
\n
\n \n \n \n \n
\n
\n \n \"TV\n
\n
\n\n
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", - styles: ["#video-container{background-color:#272c34;margin:0 auto;z-index:-1}#video-container vg-scrub-bar-current-time .background{background-color:red}#video-container .hidden{display:none}#video-container .show{display:block}#video-container .video-controls{background:rgba(0,0,0,.5);bottom:0;height:45px;left:0;position:absolute;right:0;transition:all .2s ease}#video-container .video-controls.hide{opacity:0;pointer-events:none}#video-container .video-progress{align-items:right;height:8.4px;position:relative}#video-container .video-progress #seek-tooltip{position:absolute}@media screen and (-webkit-min-device-pixel-ratio:0){#video-container .video-progress input[type=range]{-webkit-appearance:none;background-color:var(--youtube-red);overflow:hidden}#video-container .video-progress input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;color:var(--youtube-red);height:10px;margin-top:-1px}#video-container .video-progress input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--youtube-red);cursor:ew-resize;height:10px;width:10px}}#video-container .video-progress input[type=range]{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-moz-range-progress,#video-container .video-progress input[type=range]::-moz-range-track{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-ms-fill-lower,#video-container .video-progress input[type=range]::-ms-fill-upper{background-color:var(--youtube-red)}#video-container progress{-moz-appearance:none;-webkit-appearance:none;appearance:none;border-radius:2px;height:.5vh;pointer-events:none;position:absolute;top:0;width:100%}#video-container .buttons .video-control{align-items:center;background:none;border:2px solid #fff;border-radius:16px;color:#fff;display:flex;height:32px;justify-content:center;width:32px}#video-container .buttons .video-control i{color:#fff;line-height:16px}#video-container .buttons .video-control-paused{bottom:8px;left:1vw;position:absolute;z-index:1000}#video-container .buttons .video-control-muted{bottom:8px;position:absolute;right:5vw;z-index:1000}#video-container .buttons .video-control-maximized{bottom:8px;position:absolute;right:1vw;z-index:1000}#video-container progress::-webkit-progress-bar{background-color:var(--youtube-red);border-radius:2px}#video-container progress::-webkit-progress-value{background:#fff;border-radius:2px}#video-container progress::-moz-progress-bar{background:#fff;border:1px solid #fff}#video-container .seek{cursor:pointer;height:.5vh;margin:0;position:absolute;top:0;width:100%}#video-container .seek-tooltip{background-color:var(--youtube-red);color:#fff;content:attr(data-title);display:block;font-size:12px;font-weight:700;margin-left:5vw;padding:3px;position:absolute;top:10px}.playlist-item li{color:#fff}.kt-content.kt-grid__item.kt-grid__item--fluid.kt-grid.kt-grid--hor{background-color:#272c34}#kt_header_menu_wrapper{display:none}.kt-header__bottom{display:none!important}.player-wrapper{margin:auto;max-width:500px}.player-wrapper video{width:100%}ul{padding:0}ul li.playlist-item{background:#673ab7;cursor:pointer;list-style:none;margin-bottom:2px;padding:10px}ul li.playlist-item.selected{background-color:#ccc}body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] + template: "
\n \n \n \n \n \n
\n \n \n
AGORA
\n
\n
\n \n \n \n \n
\n
\n \n \"TV\n
\n\n\n
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", + styles: ["#video-container{background-color:#272c34;margin:0 auto;z-index:-1}#video-container vg-scrub-bar-current-time .background{background-color:red}#video-container .hidden{display:none}#video-container .show{display:block}#video-container .video-controls{background:rgba(0,0,0,.5);bottom:0;height:45px;left:0;position:absolute;right:0;transition:all .2s ease}#video-container .video-controls.hide{opacity:0;pointer-events:none}#video-container .video-progress{align-items:right;height:8.4px;position:relative}#video-container .video-progress #seek-tooltip{position:absolute}@media screen and (-webkit-min-device-pixel-ratio:0){#video-container .video-progress input[type=range]{-webkit-appearance:none;background-color:var(--youtube-red);overflow:hidden}#video-container .video-progress input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;color:var(--youtube-red);height:10px;margin-top:-1px}#video-container .video-progress input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--youtube-red);cursor:ew-resize;height:10px;width:10px}}#video-container .video-progress input[type=range]{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-moz-range-progress,#video-container .video-progress input[type=range]::-moz-range-track{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-ms-fill-lower,#video-container .video-progress input[type=range]::-ms-fill-upper{background-color:var(--youtube-red)}#video-container progress{-moz-appearance:none;-webkit-appearance:none;appearance:none;border-radius:2px;height:.5vh;pointer-events:none;position:absolute;top:0;width:100%}#video-container .buttons .video-control{align-items:center;background:none;border:2px solid #fff;border-radius:16px;color:#fff;display:flex;height:32px;justify-content:center;width:32px}#video-container .buttons .video-control i{color:#fff;line-height:16px}#video-container .buttons .video-control-paused{bottom:8px;left:1vw;position:absolute;z-index:1000}#video-container .buttons .video-control-muted{bottom:8px;position:absolute;right:5vw;z-index:1000}#video-container .buttons .video-control-maximized{bottom:8px;position:absolute;right:1vw;z-index:1000}#video-container progress::-webkit-progress-bar{background-color:var(--youtube-red);border-radius:2px}#video-container progress::-webkit-progress-value{background:#fff;border-radius:2px}#video-container progress::-moz-progress-bar{background:#fff;border:1px solid #fff}#video-container .seek{cursor:pointer;height:.5vh;margin:0;position:absolute;top:0;width:100%}#video-container .seek-tooltip{background-color:var(--youtube-red);color:#fff;content:attr(data-title);display:block;font-size:12px;font-weight:700;margin-left:5vw;padding:3px;position:absolute;top:10px}.playlist-item li{color:#fff}.kt-content.kt-grid__item.kt-grid__item--fluid.kt-grid.kt-grid--hor{background-color:#272c34}#kt_header_menu_wrapper{display:none}.kt-header__bottom{display:none!important}.player-wrapper{margin:auto;max-width:500px}.player-wrapper video{width:100%}ul{padding:0}ul li.playlist-item{background:#673ab7;cursor:pointer;list-style:none;margin-bottom:2px;padding:10px}ul li.playlist-item.selected{background-color:#ccc}body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);display:none;height:540px;margin-bottom:0;margin-right:0;margin-top:0;position:absolute;width:100%;z-index:0}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] },] } ]; NgCastComponent.ctorParameters = function () { return [ diff --git a/dist/bundles/thinkam.net-ng-cast.umd.js.map b/dist/bundles/thinkam.net-ng-cast.umd.js.map index c84c2f5..bcfa243 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.js.map +++ b/dist/bundles/thinkam.net-ng-cast.umd.js.map @@ -1 +1 @@ -{"version":3,"file":"thinkam.net-ng-cast.umd.js","sources":["../../shared/ng-cast.service.ts","../../dto/schedule-dto.ts","../../ng-cast.component.ts","../../ng.cast.module.ts","../../cast-videos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeCastPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n globalThis.CastPlayer.setupRemotePlayer();\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { TenantDto } from './tenant-dto';\n\nexport interface IScheduleDto {\n id: string | undefined;\n tenant: TenantDto | undefined;\n name: string | undefined;\n description: string | undefined;\n url: string | undefined;\n duration: number | undefined;\n actualStart: Date;\n realEnd?: Date | undefined;\n isActive: boolean | undefined;\n}\n\nexport class ScheduleDto implements IScheduleDto {\n id: string | undefined;\n tenant: TenantDto | undefined;\n name: string | undefined;\n description: string | undefined;\n url: string | undefined;\n duration: number | undefined;\n actualStart!: Date;\n realEnd?: Date | undefined;\n isActive: boolean | undefined;\n\n constructor(data?: IScheduleDto) {\n if (data) {\n for (let property in data) {\n if (data.hasOwnProperty(property)) {\n (this)[property] = (data)[property];\n }\n }\n }\n }\n\n static fromJS(data: any): ScheduleDto {\n data = typeof data === 'object' ? data : {};\n let result = new ScheduleDto();\n result.init(data);\n return result;\n }\n\n init(data?: any) {\n if (data) {\n this.id = data['id'];\n this.tenant = data['tenant'];\n this.name = data['name'];\n this.description = data['description'];\n this.url = data['url'];\n this.duration = data['duration'];\n this.actualStart = data['actualStart'];\n this.realEnd = data['realEnd'];\n this.isActive = data['isActive'];\n }\n }\n\n toJSON(data?: any) {\n data = typeof data === 'object' ? data : {};\n data['id'] = this.id;\n data['tenant'] = this.tenant;\n data['name'] = this.name;\n data['description'] = this.description;\n data['url'] = this.url;\n data['duration'] = this.duration;\n data['actualStart'] = this.actualStart;\n data['realEnd'] = this.realEnd;\n data['isActive'] = this.isActive;\n return data;\n }\n}\n","import { Component, Input, OnInit, ViewChild, ElementRef } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\nimport { VgDASH } from 'videogular2/compiled/src/streaming/vg-dash/vg-dash';\nimport { IDRMLicenseServer } from 'videogular2/compiled/src/streaming/streaming';\nimport { VgAPI, BitrateOption } from 'videogular2/compiled/core';\n\nimport { ScheduleDto } from './dto/schedule-dto';\n\nexport interface IMediaStream {\n type: 'vod' | 'dash';\n source: string;\n label: string;\n token?: string;\n licenseServers?: IDRMLicenseServer;\n}\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n @ViewChild(VgDASH, { static: false }) vgDash!: VgDASH;\n @ViewChild('media', { static: false }) media!: ElementRef;\n\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() premium = false;\n @Input() srcImageOffline = '';\n\n @Input() currentStream: IMediaStream = {\n type: 'dash',\n label: 'DASH: Media Stream test',\n source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd'\n };\n\n api: VgAPI = new VgAPI();\n\n @Input() isDebug = false;\n\n @Input() paused = false;\n\n @Input() streams: IMediaStream[] = [\n {\n type: 'dash',\n label: 'DASH: Media Stream test',\n source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd'\n }\n ];\n\n @Input() playlist: Array = [];\n\n @Input() play = false;\n @Input() isHidden = false;\n @Input() isShow = true;\n\n @Input() currentIndex = 0;\n @Input() video: ScheduleDto = new ScheduleDto();\n @Input() appBaseUrl: String = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n this.currentStream = this.streams[0];\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n onPlayerReady(api: VgAPI) {\n this.api = api;\n\n this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this));\n }\n\n setBitrate(option: BitrateOption) {\n switch (this.currentStream.type) {\n case 'dash':\n this.vgDash.setBitrate(option);\n break;\n }\n }\n\n nextVideo() {\n this.currentIndex++;\n\n if (this.currentIndex === this.playlist.length) {\n this.currentIndex = 0;\n }\n\n this.video = this.playlist[this.currentIndex];\n }\n\n getPaused() {\n if (this.media && this.media.nativeElement) {\n this.paused = this.media.nativeElement.paused;\n return this.media.nativeElement.paused;\n } else {\n setTimeout(() => {\n return this.getPaused();\n }, 2000);\n }\n }\n\n pause(): void {\n this.media.nativeElement.pause();\n this.getPaused();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n tryAgain() {\n this.imageOffline = true;\n this.isHidden = true;\n console.log('loading...');\n\n setTimeout(() => {\n this.getVideos();\n }, 500);\n }\n\n getVideos(): void {\n if (this.playlist && this.playlist.length > 0) {\n this.imageOffline = false;\n this.video = this.playlist[this.currentIndex];\n\n this.getPosition(this.video);\n } else {\n this.video = new ScheduleDto();\n this.tryAgain();\n }\n }\n\n getPosition(result: ScheduleDto) {\n setTimeout(() => {\n let vid: any = document.getElementById('video_element');\n vid.load();\n\n const now = new Date();\n const currentTime = Math.abs(now.getTime() - new Date(this.video.actualStart).getTime());\n\n console.log('Temos no player: ' + result.url);\n console.log('Início em: ' + currentTime);\n\n this.video.url = result.url;\n vid['currentTime'] = currentTime / 1000;\n\n let promise = vid.play();\n if (promise !== undefined) {\n promise.then((_: any) => {\n // Autoplay started!\n console.log('Estamos ao vivo!');\n }).catch(() => {\n // Autoplay was prevented.\n // Show a \"Play\" button so that user can start playback.\n this.play = true;\n });\n }\n }, 1000);\n }\n\n getMuted(): boolean {\n return this.media && this.media.nativeElement && this.media.nativeElement.muted || false;\n }\n\n getMaximized(): boolean {\n return this.api && this.api.fsAPI && this.api.fsAPI.isFullscreen && this.api.fsAPI.isFullscreen || false;\n }\n\n toggleSound(): void {\n this.media.nativeElement.muted = !this.media.nativeElement.muted;\n }\n\n toggleMaximize(): void {\n this.api.fsAPI.toggleFullscreen(this.media);\n }\n\n showVideoControls(): void {\n this.isHidden = false;\n this.isShow = true;\n }\n\n hideVideoControls(): void {\n this.isHidden = true;\n this.isShow = false;\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\nimport { VgCoreModule } from 'videogular2/compiled/core';\nimport { VgControlsModule } from 'videogular2/compiled/controls';\nimport { VgStreamingModule } from 'videogular2/compiled/streaming';\nimport { VgBufferingModule } from 'videogular2/compiled/buffering';\nimport { VgOverlayPlayModule } from 'videogular2/compiled/overlay-play';\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule,\n VgCoreModule,\n VgControlsModule,\n VgStreamingModule,\n VgBufferingModule,\n VgOverlayPlayModule,\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = () => {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n if (typeof localPlayer.stop === \"function\")\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["Subject","Injectable","VgAPI","Component","ViewChild","VgDASH","Input","NgModule","CUSTOM_ELEMENTS_SCHEMA","CommonModule","VgCoreModule","VgControlsModule","VgStreamingModule","VgBufferingModule","VgOverlayPlayModule"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"thinkam.net-ng-cast.umd.js","sources":["../../shared/ng-cast.service.ts","../../dto/schedule-dto.ts","../../ng-cast.component.ts","../../ng.cast.module.ts","../../cast-videos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeCastPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n globalThis.CastPlayer.setupRemotePlayer();\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { TenantDto } from './tenant-dto';\n\nexport interface IScheduleDto {\n id: string | undefined;\n tenant: TenantDto | undefined;\n name: string | undefined;\n description: string | undefined;\n url: string | undefined;\n duration: number | undefined;\n actualStart: Date;\n realEnd?: Date | undefined;\n isActive: boolean | undefined;\n}\n\nexport class ScheduleDto implements IScheduleDto {\n id: string | undefined;\n tenant: TenantDto | undefined;\n name: string | undefined;\n description: string | undefined;\n url: string | undefined;\n duration: number | undefined;\n actualStart!: Date;\n realEnd?: Date | undefined;\n isActive: boolean | undefined;\n\n constructor(data?: IScheduleDto) {\n if (data) {\n for (let property in data) {\n if (data.hasOwnProperty(property)) {\n (this)[property] = (data)[property];\n }\n }\n }\n }\n\n static fromJS(data: any): ScheduleDto {\n data = typeof data === 'object' ? data : {};\n let result = new ScheduleDto();\n result.init(data);\n return result;\n }\n\n init(data?: any) {\n if (data) {\n this.id = data['id'];\n this.tenant = data['tenant'];\n this.name = data['name'];\n this.description = data['description'];\n this.url = data['url'];\n this.duration = data['duration'];\n this.actualStart = data['actualStart'];\n this.realEnd = data['realEnd'];\n this.isActive = data['isActive'];\n }\n }\n\n toJSON(data?: any) {\n data = typeof data === 'object' ? data : {};\n data['id'] = this.id;\n data['tenant'] = this.tenant;\n data['name'] = this.name;\n data['description'] = this.description;\n data['url'] = this.url;\n data['duration'] = this.duration;\n data['actualStart'] = this.actualStart;\n data['realEnd'] = this.realEnd;\n data['isActive'] = this.isActive;\n return data;\n }\n}\n","import { Component, Input, OnInit, ViewChild, ElementRef, AfterViewChecked } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\nimport { VgDASH } from 'videogular2/compiled/src/streaming/vg-dash/vg-dash';\nimport { IDRMLicenseServer } from 'videogular2/compiled/src/streaming/streaming';\nimport { VgAPI, BitrateOption } from 'videogular2/compiled/core';\n\nimport { ScheduleDto } from './dto/schedule-dto';\n\nexport interface IMediaStream {\n type: 'vod' | 'dash';\n source: string;\n label: string;\n token?: string;\n licenseServers?: IDRMLicenseServer;\n}\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit, AfterViewChecked {\n @ViewChild(VgDASH, { static: false }) vgDash!: VgDASH;\n @ViewChild('media', { static: false }) media!: ElementRef;\n\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() premium = false;\n @Input() srcImageOffline = '';\n\n @Input() currentStream: IMediaStream = {\n type: 'dash',\n label: 'DASH: Media Stream test',\n source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd'\n };\n\n api: VgAPI = new VgAPI();\n\n @Input() isDebug = false;\n\n @Input() paused!: boolean;\n\n @Input() streams: IMediaStream[] = [\n {\n type: 'dash',\n label: 'DASH: Media Stream test',\n source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd'\n }\n ];\n\n @Input() playlist: Array = [];\n\n @Input() play = false;\n @Input() isHidden = false;\n @Input() isShow = true;\n\n @Input() currentIndex = 0;\n @Input() video: ScheduleDto = new ScheduleDto();\n @Input() appBaseUrl: String = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n this.currentStream = this.streams[0];\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n ngAfterViewChecked() { \n setInterval(() => {\n this.getPaused();\n }, 500);\n }\n\n onPlayerReady(api: VgAPI) {\n this.api = api;\n\n this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this));\n }\n\n setBitrate(option: BitrateOption) {\n switch (this.currentStream.type) {\n case 'dash':\n this.vgDash.setBitrate(option);\n break;\n }\n }\n\n nextVideo() {\n this.currentIndex++;\n\n if (this.currentIndex === this.playlist.length) {\n this.currentIndex = 0;\n }\n\n this.video = this.playlist[this.currentIndex];\n }\n\n getPaused() {\n if (this.media && this.media.nativeElement) {\n this.paused = this.media.nativeElement.paused;\n return this.media.nativeElement.paused;\n } else {\n setTimeout(() => {\n return this.getPaused();\n }, 2000);\n }\n }\n\n pause(): void {\n this.media.nativeElement.pause();\n this.getPaused();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n tryAgain() {\n this.imageOffline = true;\n this.isHidden = true;\n console.log('loading...');\n\n setTimeout(() => {\n this.getVideos();\n }, 500);\n }\n\n getVideos(): void {\n if (this.playlist && this.playlist.length > 0) {\n this.imageOffline = false;\n this.video = this.playlist[this.currentIndex];\n\n this.getPosition(this.video);\n } else {\n this.video = new ScheduleDto();\n this.tryAgain();\n }\n }\n\n getPosition(result: ScheduleDto) {\n setTimeout(() => {\n let vid: any = document.getElementById('video_element');\n vid.load();\n\n const now = new Date();\n const currentTime = Math.abs(now.getTime() - new Date(this.video.actualStart).getTime());\n\n console.log('Temos no player: ' + result.url);\n console.log('Início em: ' + currentTime);\n\n this.video.url = result.url;\n vid['currentTime'] = currentTime / 1000;\n\n let promise = vid.play();\n if (promise !== undefined) {\n promise.then((_: any) => {\n // Autoplay started!\n console.log('Estamos ao vivo!');\n }).catch(() => {\n // Autoplay was prevented.\n // Show a \"Play\" button so that user can start playback.\n this.play = true;\n });\n }\n }, 1000);\n }\n\n getMuted(): boolean {\n return this.media && this.media.nativeElement && this.media.nativeElement.muted || false;\n }\n\n getMaximized(): boolean {\n return this.api && this.api.fsAPI && this.api.fsAPI.isFullscreen && this.api.fsAPI.isFullscreen || false;\n }\n\n toggleSound(): void {\n this.media.nativeElement.muted = !this.media.nativeElement.muted;\n }\n\n toggleMaximize(): void {\n this.api.fsAPI.toggleFullscreen(this.media);\n }\n\n showVideoControls(): void {\n this.isHidden = false;\n this.isShow = true;\n }\n\n hideVideoControls(): void {\n this.isHidden = true;\n this.isShow = false;\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\nimport { VgCoreModule } from 'videogular2/compiled/core';\nimport { VgControlsModule } from 'videogular2/compiled/controls';\nimport { VgStreamingModule } from 'videogular2/compiled/streaming';\nimport { VgBufferingModule } from 'videogular2/compiled/buffering';\nimport { VgOverlayPlayModule } from 'videogular2/compiled/overlay-play';\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule,\n VgCoreModule,\n VgControlsModule,\n VgStreamingModule,\n VgBufferingModule,\n VgOverlayPlayModule,\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = () => {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n if (typeof localPlayer.stop === \"function\")\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":["Subject","Injectable","VgAPI","Component","ViewChild","VgDASH","Input","NgModule","CUSTOM_ELEMENTS_SCHEMA","CommonModule","VgCoreModule","VgControlsModule","VgStreamingModule","VgBufferingModule","VgOverlayPlayModule"],"mappings":"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"} \ No newline at end of file diff --git a/dist/bundles/thinkam.net-ng-cast.umd.min.js b/dist/bundles/thinkam.net-ng-cast.umd.min.js index 0a0e237..4c15bbc 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.min.js +++ b/dist/bundles/thinkam.net-ng-cast.umd.min.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("@angular/common"),require("rxjs"),require("videogular2/compiled/src/streaming/vg-dash/vg-dash"),require("videogular2/compiled/core"),require("videogular2/compiled/controls"),require("videogular2/compiled/streaming"),require("videogular2/compiled/buffering"),require("videogular2/compiled/overlay-play")):"function"==typeof define&&define.amd?define("@thinkam.net/ng-cast",["exports","@angular/core","@angular/common","rxjs","videogular2/compiled/src/streaming/vg-dash/vg-dash","videogular2/compiled/core","videogular2/compiled/controls","videogular2/compiled/streaming","videogular2/compiled/buffering","videogular2/compiled/overlay-play"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).thinkam=e.thinkam||{},e.thinkam.net=e.thinkam.net||{},e.thinkam.net["ng-cast"]={}),e.ng.core,e.ng.common,e.rxjs,e.VgDASH,e.VgCoreModule,e.VgControlsModule,e.VgStreamingModule,e.VgBufferingModule,e.VgOverlayPlayModule)}(this,(function(e,t,i,n,o,a,r,s,d,l){"use strict";var u=function(){function e(){var e=this;this.window=window,this.status={casting:!1},this.onInitSuccess=function(){console.log("GCast initialization success")},this.onError=function(e){console.log("GCast initialization failed",e)},this.discoverDevices=function(){var t=e,i=new n.Subject;return e.cast.requestSession((function(e){t.session=e,t.setCasting(!0),i.next("CONNECTED")}),(function(e){t.setCasting(!1),"cancel"===e.code?(t.session=void 0,i.next("CANCEL")):console.error("Error selecting a cast device",e)})),i},this.onMediaDiscovered=function(e){var t=window.document.createElement("script");return t.setAttribute("type","text/javascript"),t.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"),window.document.body.appendChild(t),globalThis.CastPlayer.mediaJSON.categories=e,globalThis.CastPlayer.addMediaContents()},this.play=function(){e.currentMedia.play(null)},this.pause=function(){e.currentMedia.pause(null)},this.stop=function(){e.currentMedia.stop(null)},this.onMediaError=function(e){console.error("Error launching media",e)},globalThis.CastPlayer.mediaJSON={categories:[]}}return e.prototype.initializeCastApi=function(){var e=this;this.cast=this.window.chrome.cast;var t=new this.cast.SessionRequest("4F8B3483"),i=new this.cast.ApiConfig(t,(function(){}),(function(t){e.cast.ReceiverAvailability.AVAILABLE}));this.cast.initialize(i,this.onInitSuccess,this.onError)},e.prototype.initialize=function(e){e&&(globalThis.CastPlayer.initializeUI(),globalThis.CastPlayer.setupLocalPlayer(),globalThis.CastPlayer.initializeCastPlayer())},e.prototype.setCasting=function(e){this.status.casting=e,globalThis.CastPlayer.setupRemotePlayer()},e.prototype.getStatus=function(){return this.status},e}();u.decorators=[{type:t.Injectable}],u.ctorParameters=function(){return[]};var p=function(){function e(e){if(e)for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t])}return e.fromJS=function(t){t="object"==typeof t?t:{};var i=new e;return i.init(t),i},e.prototype.init=function(e){e&&(this.id=e.id,this.tenant=e.tenant,this.name=e.name,this.description=e.description,this.url=e.url,this.duration=e.duration,this.actualStart=e.actualStart,this.realEnd=e.realEnd,this.isActive=e.isActive)},e.prototype.toJSON=function(e){return(e="object"==typeof e?e:{}).id=this.id,e.tenant=this.tenant,e.name=this.name,e.description=this.description,e.url=this.url,e.duration=this.duration,e.actualStart=this.actualStart,e.realEnd=this.realEnd,e.isActive=this.isActive,e},e}(),c=function(){function e(e){this.ngCastService=e,this.videoImage="",this.imageOffline=!1,this.premium=!1,this.srcImageOffline="",this.currentStream={type:"dash",label:"DASH: Media Stream test",source:"http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd"},this.api=new a.VgAPI,this.isDebug=!1,this.paused=!1,this.streams=[{type:"dash",label:"DASH: Media Stream test",source:"http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd"}],this.playlist=[],this.play=!1,this.isHidden=!1,this.isShow=!0,this.currentIndex=0,this.video=new p,this.appBaseUrl=""}return e.prototype.ngOnInit=function(){this.window=window,this.currentStream=this.streams[0];var e=this.ngCastService;this.window.__onGCastApiAvailable=function(t){t&&e.initializeCastApi()},this.castingStatus=this.ngCastService.getStatus()},e.prototype.onPlayerReady=function(e){this.api=e,this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this))},e.prototype.setBitrate=function(e){switch(this.currentStream.type){case"dash":this.vgDash.setBitrate(e)}},e.prototype.nextVideo=function(){this.currentIndex++,this.currentIndex===this.playlist.length&&(this.currentIndex=0),this.video=this.playlist[this.currentIndex]},e.prototype.getPaused=function(){var e=this;if(this.media&&this.media.nativeElement)return this.paused=this.media.nativeElement.paused,this.media.nativeElement.paused;setTimeout((function(){return e.getPaused()}),2e3)},e.prototype.pause=function(){this.media.nativeElement.pause(),this.getPaused()},e.prototype.openSession=function(){this.ngCastService.discoverDevices()},e.prototype.closeSession=function(){this.ngCastService.discoverDevices()},e.prototype.tryAgain=function(){var e=this;this.imageOffline=!0,this.isHidden=!0,console.log("loading..."),setTimeout((function(){e.getVideos()}),500)},e.prototype.getVideos=function(){this.playlist&&this.playlist.length>0?(this.imageOffline=!1,this.video=this.playlist[this.currentIndex],this.getPosition(this.video)):(this.video=new p,this.tryAgain())},e.prototype.getPosition=function(e){var t=this;setTimeout((function(){var i=document.getElementById("video_element");i.load();var n=new Date,o=Math.abs(n.getTime()-new Date(t.video.actualStart).getTime());console.log("Temos no player: "+e.url),console.log("Início em: "+o),t.video.url=e.url,i.currentTime=o/1e3;var a=i.play();void 0!==a&&a.then((function(e){console.log("Estamos ao vivo!")})).catch((function(){t.play=!0}))}),1e3)},e.prototype.getMuted=function(){return this.media&&this.media.nativeElement&&this.media.nativeElement.muted||!1},e.prototype.getMaximized=function(){return this.api&&this.api.fsAPI&&this.api.fsAPI.isFullscreen&&this.api.fsAPI.isFullscreen||!1},e.prototype.toggleSound=function(){this.media.nativeElement.muted=!this.media.nativeElement.muted},e.prototype.toggleMaximize=function(){this.api.fsAPI.toggleFullscreen(this.media)},e.prototype.showVideoControls=function(){this.isHidden=!1,this.isShow=!0},e.prototype.hideVideoControls=function(){this.isHidden=!0,this.isShow=!1},e}();c.decorators=[{type:t.Component,args:[{selector:"ng-cast",template:'
\n \n \n \n \n \n
\n \n \n
AGORA
\n
\n
\n \n \n \n \n
\n
\n \n TV Offline\n \n\n\n
\n
\x3c!-- Put Your Image Width --\x3e\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\nTV Offline\n',styles:['#video-container{background-color:#272c34;margin:0 auto;z-index:-1}#video-container vg-scrub-bar-current-time .background{background-color:red}#video-container .hidden{display:none}#video-container .show{display:block}#video-container .video-controls{background:rgba(0,0,0,.5);bottom:0;height:45px;left:0;position:absolute;right:0;transition:all .2s ease}#video-container .video-controls.hide{opacity:0;pointer-events:none}#video-container .video-progress{align-items:right;height:8.4px;position:relative}#video-container .video-progress #seek-tooltip{position:absolute}@media screen and (-webkit-min-device-pixel-ratio:0){#video-container .video-progress input[type=range]{-webkit-appearance:none;background-color:var(--youtube-red);overflow:hidden}#video-container .video-progress input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;color:var(--youtube-red);height:10px;margin-top:-1px}#video-container .video-progress input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--youtube-red);cursor:ew-resize;height:10px;width:10px}}#video-container .video-progress input[type=range]{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-moz-range-progress,#video-container .video-progress input[type=range]::-moz-range-track{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-ms-fill-lower,#video-container .video-progress input[type=range]::-ms-fill-upper{background-color:var(--youtube-red)}#video-container progress{-moz-appearance:none;-webkit-appearance:none;appearance:none;border-radius:2px;height:.5vh;pointer-events:none;position:absolute;top:0;width:100%}#video-container .buttons .video-control{align-items:center;background:none;border:2px solid #fff;border-radius:16px;color:#fff;display:flex;height:32px;justify-content:center;width:32px}#video-container .buttons .video-control i{color:#fff;line-height:16px}#video-container .buttons .video-control-paused{bottom:8px;left:1vw;position:absolute;z-index:1000}#video-container .buttons .video-control-muted{bottom:8px;position:absolute;right:5vw;z-index:1000}#video-container .buttons .video-control-maximized{bottom:8px;position:absolute;right:1vw;z-index:1000}#video-container progress::-webkit-progress-bar{background-color:var(--youtube-red);border-radius:2px}#video-container progress::-webkit-progress-value{background:#fff;border-radius:2px}#video-container progress::-moz-progress-bar{background:#fff;border:1px solid #fff}#video-container .seek{cursor:pointer;height:.5vh;margin:0;position:absolute;top:0;width:100%}#video-container .seek-tooltip{background-color:var(--youtube-red);color:#fff;content:attr(data-title);display:block;font-size:12px;font-weight:700;margin-left:5vw;padding:3px;position:absolute;top:10px}.playlist-item li{color:#fff}.kt-content.kt-grid__item.kt-grid__item--fluid.kt-grid.kt-grid--hor{background-color:#272c34}#kt_header_menu_wrapper{display:none}.kt-header__bottom{display:none!important}.player-wrapper{margin:auto;max-width:500px}.player-wrapper video{width:100%}ul{padding:0}ul li.playlist-item{background:#673ab7;cursor:pointer;list-style:none;margin-bottom:2px;padding:10px}ul li.playlist-item.selected{background-color:#ccc}body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}']}]}],c.ctorParameters=function(){return[{type:u}]},c.propDecorators={vgDash:[{type:t.ViewChild,args:[o.VgDASH,{static:!1}]}],media:[{type:t.ViewChild,args:["media",{static:!1}]}],videoImage:[{type:t.Input}],imageOffline:[{type:t.Input}],premium:[{type:t.Input}],srcImageOffline:[{type:t.Input}],currentStream:[{type:t.Input}],isDebug:[{type:t.Input}],paused:[{type:t.Input}],streams:[{type:t.Input}],playlist:[{type:t.Input}],play:[{type:t.Input}],isHidden:[{type:t.Input}],isShow:[{type:t.Input}],currentIndex:[{type:t.Input}],video:[{type:t.Input}],appBaseUrl:[{type:t.Input}]};var m=function(){};m.decorators=[{type:t.NgModule,args:[{schemas:[t.CUSTOM_ELEMENTS_SCHEMA],imports:[i.CommonModule,a.VgCoreModule,r.VgControlsModule,s.VgStreamingModule,d.VgBufferingModule,l.VgOverlayPlayModule],exports:[c],providers:[u],declarations:[c]}]}];var g=600,y=100,f="IDLE",h="BUFFERING",v="LOADED",b="PLAYING",x="PAUSED",_="ERROR",E=function(){this.playerHandler=new I(this),this.playerState=f,this.playerStateBeforeSwitch=null,this.remotePlayer=null,this.remotePlayerController=null,this.currentMediaTime=0,this.mediaDuration=-1,this.timer=null,this.incrementMediaTimeHandler=this.incrementMediaTime.bind(this),this.seekMediaListener=this.seekMedia.bind(this),this.currentMediaIndex=0,this.mediaContents=null,this.fullscreen=!1,this.mediaInfo=null,this.whenSkippable=null,this.liveSeekableRange=null,this.isLiveContent=!1,this.mediaJSON={categories:[]}};E.prototype.initializeCastPlayer=function(){var e={receiverApplicationId:"4F8B3483"};e.autoJoinPolicy=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,cast.framework.CastContext.getInstance().setOptions(e),k.remotePlayer=new cast.framework.RemotePlayer,k.remotePlayerController=new cast.framework.RemotePlayerController(k.remotePlayer),k.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,k.switchPlayer.bind(k))},E.prototype.switchPlayer=function(){k.stopProgressTimer(),k.resetVolumeSlider(),k.playerHandler.stop(),k.playerState=f,cast&&cast.framework&&k.remotePlayer.isConnected?k.setupRemotePlayer():k.setupLocalPlayer()};var I=function(e){this.target={},this.setTarget=function(e){this.target=e},this.play=function(){e.playerState===b||e.playerState===x||e.playerState===v?(this.target.play(),e.playerState=b,document.getElementById("play").style.display="none",document.getElementById("pause").style.display="block",this.updateDisplayMessage()):this.load(e.currentMediaIndex)},this.updateDisplayMessage=function(){this.target.updateDisplayMessage()},this.pause=function(){this.target.pause(),e.playerState=x,document.getElementById("play").style.display="block",document.getElementById("pause").style.display="none"},this.stop=function(){e.playerState=f,this.target.stop()},this.load=function(t){void 0===t&&(t=null),t||(t=e.currentMediaIndex),e.playerState=h,this.target.load(t)},this.isMediaLoaded=function(e){return this.target.isMediaLoaded(e)},this.prepareToPlay=function(){e.mediaDuration=this.getMediaDuration(),e.playerHandler.updateDurationDisplay(),e.playerState=v,this.play(),e.startProgressTimer(),this.updateDisplay()},this.loaded=function(){e.currentMediaDuration=this.getMediaDuration(),e.updateMediaDuration(),e.playerState=v,e.currentMediaTime>0&&this.seekTo(e.currentMediaTime),this.play(),e.startProgressTimer(),this.updateDisplayMessage()},this.getCurrentMediaTime=function(){return this.target.getCurrentMediaTime()},this.getMediaDuration=function(){return this.target.getMediaDuration()},this.updateDisplay=function(){this.currentMediaTime=this.target.getCurrentMediaTime(),this.mediaDuration=this.target.getMediaDuration(),this.target.updateDisplay()},this.updateCurrentTimeDisplay=function(){this.target.updateCurrentTimeDisplay()},this.setTimeString=function(e,t){this.target.setTimeString(e,t)},this.setVolume=function(e){this.target.setVolume(e)},this.mute=function(){this.target.mute(),document.getElementById("audio_on").style.display="none",document.getElementById("audio_off").style.display="block"},this.unMute=function(){this.target.unMute(),document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},this.isMuted=function(){return this.target.isMuted()},this.seekTo=function(e){this.target.seekTo(e)}};E.prototype.setupLocalPlayer=function(){var e=document.getElementById("video_element");e.addEventListener("loadeddata",k.onMediaLoadedLocally.bind(k));var t={play:function(){e.play(),document.getElementById("video_image").style.display="none",e.style.display="block"},pause:function(){e.pause()},stop:function(){"function"==typeof e.stop&&e.stop()}};t.load=function(t){e.src=k.mediaContents[t].sources[0],e.load()}.bind(k),t.getCurrentMediaTime=function(){return e.currentTime},t.getMediaDuration=function(){return e.duration},t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none"},t.setVolume=function(t){e.volume=t0&&k.playerHandler.play()},E.prototype.setupRemotePlayer=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();k.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,function(){k.remotePlayer.isPaused?k.playerHandler.pause():k.playerHandler.play()}.bind(k)),k.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,function(){k.remotePlayer.isMuted?k.playerHandler.mute():k.playerHandler.unMute()}.bind(k)),k.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,function(){var e=k.remotePlayer.volumeLevel*y,t=document.getElementById("audio_bg_level");t.style.height=e+"px",t.style.marginTop=-e+"px"}.bind(k));var t={};t.play=function(){k.remotePlayer.isPaused&&k.remotePlayerController.playOrPause(),document.getElementById("video_image").style.display="block",document.getElementById("video_element").style.display="none"}.bind(k),t.pause=function(){k.remotePlayer.isPaused||k.remotePlayerController.playOrPause()}.bind(k),t.stop=function(){k.remotePlayerController.stop()}.bind(k),t.load=function(t){console.log("Loading..."+k.mediaContents[t].title);var i=new chrome.cast.media.MediaInfo(k.mediaContents[t].sources[0],"video/mp4");i.metadata=new chrome.cast.media.GenericMediaMetadata,i.metadata.metadataType=chrome.cast.media.MetadataType.GENERIC,i.metadata.title=k.mediaContents[t].title,i.metadata.images=[{url:""+k.mediaContents[t].thumb}];var n=new chrome.cast.media.LoadRequest(i);e.loadMedia(n).then(k.playerHandler.loaded.bind(k.playerHandler),function(e){k.playerState=_,console.log("Remote media load error: "+E.getErrorMessage(e))}.bind(k))}.bind(k),t.getCurrentMediaTime=function(){return k.remotePlayer.currentTime}.bind(k),t.getMediaDuration=function(){return k.remotePlayer.duration}.bind(k),t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="block",document.getElementById("playerstatebg").style.display="block",document.getElementById("video_image_overlay").style.display="block",document.getElementById("playerstate").innerHTML=k.mediaContents[k.currentMediaIndex].title+" "+k.playerState+" on "+e.getCastDevice().friendlyName}.bind(k),t.setVolume=function(e){var t=k.remotePlayer.volumeLevel,i=document.getElementById("audio_bg_level");if(en&&(e=n+(pos-n)/2),i.style.height=e+"px",i.style.marginTop=-e+"px",t=e/y}else t=1;k.remotePlayer.volumeLevel=t,k.remotePlayerController.setVolumeLevel()}.bind(k),t.mute=function(){k.remotePlayer.isMuted||k.remotePlayerController.muteOrUnmute()}.bind(k),t.unMute=function(){k.remotePlayer.isMuted&&k.remotePlayerController.muteOrUnmute()}.bind(k),t.isMuted=function(){return k.remotePlayer.isMuted}.bind(k),t.seekTo=function(e){k.remotePlayer.currentTime=e,k.remotePlayerController.seek()}.bind(k),k.playerHandler.setTarget(t),k.remotePlayer.isMuted&&k.playerHandler.mute();var i=k.remotePlayer.volumeLevel*y,n=document.getElementById("audio_bg_level");n.style.height=i+"px",n.style.marginTop=-i+"px",k.hideFullscreenButton(),k.playerHandler.play()},E.prototype.onMediaLoadedLocally=function(){document.getElementById("video_element").currentTime=k.currentMediaTime,k.playerHandler.loaded()},E.prototype.selectMedia=function(e){console.log("Media index selected: "+e),k.currentMediaIndex=e,k.playerHandler.currentMediaInfo=void 0,document.getElementById("video_image").src=""+k.mediaContents[e].thumb,document.getElementById("progress_indicator").style.marginLeft="0px",document.getElementById("progress").style.width="0px";var t=document.getElementById("seekable_window"),i=document.getElementById("unseekable_overlay");t.style.width=g,i.style.width="0px",k.stopProgressTimer(),k.currentMediaTime=0,k.playerHandler.setTimeString(document.getElementById("currentTime"),0),k.playerHandler.setTimeString(document.getElementById("duration"),0),k.playerState=f,k.playerHandler.play()},E.prototype.seekMedia=function(e){if(null==k.mediaDuration||cast.framework.CastContext.getInstance().getCurrentSession()&&!k.remotePlayer.canSeek)console.log("Error - Not seekable");else if(!k.isLiveContent||k.liveSeekableRange){var t=parseInt(e.offsetX,10),i=document.getElementById("progress_indicator"),n=document.getElementById("progress"),o=0,a=0,r=0;"progress_indicator"==e.currentTarget.id?(o=parseInt(k.currentMediaTime+k.mediaDuration*t/g,10),a=parseInt(i.style.marginLeft,10)+t,r=parseInt(n.style.width,10)+t):(o=parseInt(t*k.mediaDuration/g,10),a=t,r=t),k.playerState!==b&&k.playerState!==x||(k.currentMediaTime=o,n.style.width=r+"px",i.style.marginLeft=a+"px"),k.isLiveContent&&(o+=k.mediaInfo.metadata.sectionStartTimeInMedia),k.playerHandler.seekTo(o)}else console.log("Live content has no seekable range.")},E.prototype.setVolume=function(e){var t=document.getElementById("audio_bg_level"),i=0;i="audio_bg_track"===e.currentTarget.id?y-parseInt(e.offsetY,10):parseInt(t.clientHeight,10)-parseInt(e.offsetY,10),k.playerHandler.setVolume(i)},E.prototype.startProgressTimer=function(){k.stopProgressTimer(),k.timer=setInterval(k.incrementMediaTimeHandler,1e3)},E.prototype.stopProgressTimer=function(){k.timer&&(clearInterval(k.timer),k.timer=null)},E.prototype.incrementMediaTime=function(){k.currentMediaTime=k.playerHandler.getCurrentMediaTime(),k.currentMediaDuration=k.playerHandler.getMediaDuration(),k.playerState===b&&(k.currentMediaTime0)var t=Math.floor(g*k.currentMediaTime/k.currentMediaDuration);e.style.width=t+"px",document.getElementById("progress_indicator").style.marginLeft=-621+t+"px",t>=g&&k.endPlayback()},E.prototype.endPlayback=function(){k.currentMediaTime=0,k.stopProgressTimer(),k.playerState=f,k.playerHandler.updateDisplay();var e=document.getElementById("play");e&&e.style&&e.display&&(e.style.display="block");var t=document.getElementById("pause");t&&t.style&&t.style.display&&(t.style.display="none")},E.prototype.getMediaTimeString=function(e){if(null==e||null==e)return null;var t=!1;e<0&&(t=!0,e*=-1);var i=Math.floor(e/3600),n=Math.floor((e-3600*i)/60),o=Math.floor(e-3600*i-60*n);return i<10&&(i="0"+i),n<10&&(n="0"+n),o<10&&(o="0"+o),(t?"-":"")+i+":"+n+":"+o},E.prototype.getClockTimeString=function(e){if(!e)return"0:00:00";var t=new Date(1e3*e),i=t.getHours(),n=t.getMinutes(),o=t.getSeconds(),a=i>=12?"PM":"AM";return(i=(i%=12)||12)+":"+(n=("0"+n).slice(-2))+":"+(o=("0"+o).slice(-2))+" "+a},E.prototype.updateAdMarkers=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e){var t=e.getMediaSession();if(t){var i=t.media;if(i){var n=i.breaks,o=i.duration;if(n)for(var a=0;ao&&r.isEmbedded))if(!document.getElementById("ad"+r.position))document.getElementById("progress").innerHTML+='
'}}}}},E.prototype.removeAdMarkers=function(){document.querySelectorAll(".adMarker").forEach((function(e){e.remove()}))},E.prototype.adPositionToMargin=function(e,t){return-1==e||e>t?g:g*e/t},E.prototype.onBreakClipIdChanged=function(){var e=document.getElementById("skip");e&&e.style&&e.style.display&&(e.style.display="none")},E.prototype.isPlayingBreak=function(e){k.enableProgressBar(!e)},E.prototype.onWhenSkippableChanged=function(e){k.whenSkippable=e},E.prototype.onCurrentBreakClipTimeChanged=function(e){var t=document.getElementById("skip");null==k.whenSkippable||k.whenSkippable<0?t&&t.style&&t.style.display&&(t.style.display="none"):void 0!==k.whenSkippable||e>=k.whenSkippable?t&&t.style&&t.style.display&&(t.style.display="block"):t&&t.style&&t.style.display&&(t.style.display="none")},E.prototype.skipAd=function(){k.remotePlayerController.skipAd()},E.prototype.enableProgressBar=function(e){var t=document.getElementById("progress"),i=document.getElementById("progress_indicator"),n=document.getElementById("seekable_window");e?(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_progress.png')",t.style.cursor="pointer",n.style.cursor="pointer",i.style.cursor="pointer",i.draggable=!0,t.addEventListener("click",k.seekMediaListener),n.addEventListener("click",k.seekMediaListener),i.addEventListener("dragend",k.seekMediaListener)):(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_buffer.png')",t.style.cursor="default",n.style.cursor="default",i.style.cursor="default",i.draggable=!1,t.removeEventListener("click",k.seekMediaListener),n.removeEventListener("click",k.seekMediaListener),i.removeEventListener("dragend",k.seekMediaListener))},E.prototype.updateMediaDuration=function(){document.getElementById("duration").innerHTML=E.getDurationString(k.currentMediaDuration)},E.getDurationString=function(e){var t=""+Math.floor(e%60),i=Math.floor(e/60);if(0===i)return t;t=i%60+":"+t;var n=Math.floor(i/60);return 0===n?t:n+":"+t},E.prototype.requestFullScreen=function(){var e=document.getElementById("video_element"),t=e.requestFullScreen||e.webkitRequestFullScreen;t&&(t.call(e),console.log("Requested fullscreen"))},E.prototype.cancelFullScreen=function(){var e=document.cancelFullScreen||document.webkitCancelFullScreen;e&&e.call(document)},E.prototype.fullscreenChangeHandler=function(){k.fullscreen=!k.fullscreen},E.prototype.showFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");k.fullscreen?(e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="block")):(e&&e.style&&e.style.display&&(e.style.display="block"),t&&t.style&&t.style.display&&(t.style.display="none"))},E.prototype.hideFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="none")},E.prototype.showMediaControl=function(){var e=document.getElementById("media_control");e&&e.style&&e.style.opacity&&(e.style.opacity=.7)},E.prototype.hideMediaControl=function(){if("undefined"!=typeof cast){var e=cast.framework.CastContext.getInstance();e&&e.getCurrentSession()?document.getElementById("media_control").style.opacity=.7:document.getElementById("media_control").style.opacity=0}},E.prototype.showVolumeSlider=function(){k.playerHandler.isMuted()||(document.getElementById("audio_bg").style.opacity=1,document.getElementById("audio_bg_track").style.opacity=1,document.getElementById("audio_bg_level").style.opacity=1,document.getElementById("audio_indicator").style.opacity=1)},E.prototype.hideVolumeSlider=function(){document.getElementById("audio_bg").style.opacity=0,document.getElementById("audio_bg_track").style.opacity=0,document.getElementById("audio_bg_level").style.opacity=0,document.getElementById("audio_indicator").style.opacity=0},E.prototype.resetVolumeSlider=function(){var e=.5*document.getElementById("audio_bg_track").clientHeight;document.getElementById("audio_bg_level").style.height=e+"px",document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},E.prototype.initializeUI=function(){document.getElementById("media_title").innerHTML=k.mediaContents[0].title,document.getElementById("media_subtitle").innerHTML=k.mediaContents[k.currentMediaIndex].subtitle,document.getElementById("media_desc").innerHTML=k.mediaContents[k.currentMediaIndex].description,document.getElementById("progress_bg").addEventListener("click",k.seekMedia.bind(k)),document.getElementById("progress").addEventListener("click",k.seekMedia.bind(k)),document.getElementById("progress_indicator").addEventListener("dragend",k.seekMedia.bind(k)),document.getElementById("audio_on").addEventListener("click",k.playerHandler.mute.bind(k.playerHandler)),document.getElementById("audio_off").addEventListener("click",k.playerHandler.unMute.bind(k.playerHandler)),document.getElementById("audio_bg").addEventListener("mouseover",k.showVolumeSlider.bind(k)),document.getElementById("audio_on").addEventListener("mouseover",k.showVolumeSlider.bind(k)),document.getElementById("audio_bg_level").addEventListener("mouseover",k.showVolumeSlider.bind(k)),document.getElementById("audio_bg_track").addEventListener("mouseover",k.showVolumeSlider.bind(k)),document.getElementById("audio_bg_level").addEventListener("click",k.setVolume.bind(k)),document.getElementById("audio_bg_track").addEventListener("click",k.setVolume.bind(k)),document.getElementById("audio_bg").addEventListener("mouseout",k.hideVolumeSlider.bind(k)),document.getElementById("audio_on").addEventListener("mouseout",k.hideVolumeSlider.bind(k)),document.getElementById("main_video").addEventListener("mouseover",k.showMediaControl.bind(k)),document.getElementById("main_video").addEventListener("mouseout",k.hideMediaControl.bind(k)),document.getElementById("media_control").addEventListener("mouseover",k.showMediaControl.bind(k)),document.getElementById("media_control").addEventListener("mouseout",k.hideMediaControl.bind(k)),document.getElementById("fullscreen_expand").addEventListener("click",k.requestFullScreen.bind(k)),document.getElementById("fullscreen_collapse").addEventListener("click",k.cancelFullScreen.bind(k)),document.addEventListener("fullscreenchange",k.fullscreenChangeHandler.bind(k),!1),document.addEventListener("webkitfullscreenchange",k.fullscreenChangeHandler.bind(k),!1),document.getElementById("play").addEventListener("click",k.playerHandler.play.bind(k.playerHandler)),document.getElementById("pause").addEventListener("click",k.playerHandler.pause.bind(k.playerHandler)),document.getElementById("progress_indicator").draggable=!0},E.prototype.addVideoThumbs=function(){if(void 0!==k.mediaJSON&&k.mediaJSON.categories&&k.mediaJSON.categories.length>0){k.mediaContents=k.mediaJSON.categories[0].videos;for(var e=document.getElementById("carousel"),t=null,i=null,n=0;n',t.addEventListener("click",k.selectMedia.bind(k,n)),e.appendChild(t)}},E.prototype.addMediaContents=function(){return void 0!==k.mediaJSON&&k.mediaJSON.categories&&k.mediaJSON.categories.length>0?(k.mediaContents=k.mediaJSON.categories[0].videos,k.mediaContents):null},E.getErrorMessage=function(e){switch(e.code){case chrome.cast.ErrorCode.API_NOT_INITIALIZED:return"The API is not initialized."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CANCEL:return"The operation was canceled by the user"+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CHANNEL_ERROR:return"A channel to the receiver is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.EXTENSION_MISSING:return"The Cast extension is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.INVALID_PARAMETER:return"The parameters to the operation were not valid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:return"No receiver was compatible with the session request."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.SESSION_ERROR:return"A session could not be created, or a session was invalid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.TIMEOUT:return"The operation timed out."+(e.description?" :"+e.description:"");default:return e}};var k=new E;window.__onGCastApiAvailable=function(e){e&&k.initializeCastPlayer()},window.CastPlayer=k,e.NgCastModule=m,e.NgCastService=u,e.ɵa=c,Object.defineProperty(e,"__esModule",{value:!0})})); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("@angular/common"),require("rxjs"),require("videogular2/compiled/src/streaming/vg-dash/vg-dash"),require("videogular2/compiled/core"),require("videogular2/compiled/controls"),require("videogular2/compiled/streaming"),require("videogular2/compiled/buffering"),require("videogular2/compiled/overlay-play")):"function"==typeof define&&define.amd?define("@thinkam.net/ng-cast",["exports","@angular/core","@angular/common","rxjs","videogular2/compiled/src/streaming/vg-dash/vg-dash","videogular2/compiled/core","videogular2/compiled/controls","videogular2/compiled/streaming","videogular2/compiled/buffering","videogular2/compiled/overlay-play"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).thinkam=e.thinkam||{},e.thinkam.net=e.thinkam.net||{},e.thinkam.net["ng-cast"]={}),e.ng.core,e.ng.common,e.rxjs,e.VgDASH,e.VgCoreModule,e.VgControlsModule,e.VgStreamingModule,e.VgBufferingModule,e.VgOverlayPlayModule)}(this,(function(e,t,i,n,o,a,r,s,d,l){"use strict";var u=function(){function e(){var e=this;this.window=window,this.status={casting:!1},this.onInitSuccess=function(){console.log("GCast initialization success")},this.onError=function(e){console.log("GCast initialization failed",e)},this.discoverDevices=function(){var t=e,i=new n.Subject;return e.cast.requestSession((function(e){t.session=e,t.setCasting(!0),i.next("CONNECTED")}),(function(e){t.setCasting(!1),"cancel"===e.code?(t.session=void 0,i.next("CANCEL")):console.error("Error selecting a cast device",e)})),i},this.onMediaDiscovered=function(e){var t=window.document.createElement("script");return t.setAttribute("type","text/javascript"),t.setAttribute("src","https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"),window.document.body.appendChild(t),globalThis.CastPlayer.mediaJSON.categories=e,globalThis.CastPlayer.addMediaContents()},this.play=function(){e.currentMedia.play(null)},this.pause=function(){e.currentMedia.pause(null)},this.stop=function(){e.currentMedia.stop(null)},this.onMediaError=function(e){console.error("Error launching media",e)},globalThis.CastPlayer.mediaJSON={categories:[]}}return e.prototype.initializeCastApi=function(){var e=this;this.cast=this.window.chrome.cast;var t=new this.cast.SessionRequest("4F8B3483"),i=new this.cast.ApiConfig(t,(function(){}),(function(t){e.cast.ReceiverAvailability.AVAILABLE}));this.cast.initialize(i,this.onInitSuccess,this.onError)},e.prototype.initialize=function(e){e&&(globalThis.CastPlayer.initializeUI(),globalThis.CastPlayer.setupLocalPlayer(),globalThis.CastPlayer.initializeCastPlayer())},e.prototype.setCasting=function(e){this.status.casting=e,globalThis.CastPlayer.setupRemotePlayer()},e.prototype.getStatus=function(){return this.status},e}();u.decorators=[{type:t.Injectable}],u.ctorParameters=function(){return[]};var p=function(){function e(e){if(e)for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t])}return e.fromJS=function(t){t="object"==typeof t?t:{};var i=new e;return i.init(t),i},e.prototype.init=function(e){e&&(this.id=e.id,this.tenant=e.tenant,this.name=e.name,this.description=e.description,this.url=e.url,this.duration=e.duration,this.actualStart=e.actualStart,this.realEnd=e.realEnd,this.isActive=e.isActive)},e.prototype.toJSON=function(e){return(e="object"==typeof e?e:{}).id=this.id,e.tenant=this.tenant,e.name=this.name,e.description=this.description,e.url=this.url,e.duration=this.duration,e.actualStart=this.actualStart,e.realEnd=this.realEnd,e.isActive=this.isActive,e},e}(),c=function(){function e(e){this.ngCastService=e,this.videoImage="",this.imageOffline=!1,this.premium=!1,this.srcImageOffline="",this.currentStream={type:"dash",label:"DASH: Media Stream test",source:"http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd"},this.api=new a.VgAPI,this.isDebug=!1,this.streams=[{type:"dash",label:"DASH: Media Stream test",source:"http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd"}],this.playlist=[],this.play=!1,this.isHidden=!1,this.isShow=!0,this.currentIndex=0,this.video=new p,this.appBaseUrl=""}return e.prototype.ngOnInit=function(){this.window=window,this.currentStream=this.streams[0];var e=this.ngCastService;this.window.__onGCastApiAvailable=function(t){t&&e.initializeCastApi()},this.castingStatus=this.ngCastService.getStatus()},e.prototype.ngAfterViewChecked=function(){var e=this;setInterval((function(){e.getPaused()}),500)},e.prototype.onPlayerReady=function(e){this.api=e,this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this))},e.prototype.setBitrate=function(e){switch(this.currentStream.type){case"dash":this.vgDash.setBitrate(e)}},e.prototype.nextVideo=function(){this.currentIndex++,this.currentIndex===this.playlist.length&&(this.currentIndex=0),this.video=this.playlist[this.currentIndex]},e.prototype.getPaused=function(){var e=this;if(this.media&&this.media.nativeElement)return this.paused=this.media.nativeElement.paused,this.media.nativeElement.paused;setTimeout((function(){return e.getPaused()}),2e3)},e.prototype.pause=function(){this.media.nativeElement.pause(),this.getPaused()},e.prototype.openSession=function(){this.ngCastService.discoverDevices()},e.prototype.closeSession=function(){this.ngCastService.discoverDevices()},e.prototype.tryAgain=function(){var e=this;this.imageOffline=!0,this.isHidden=!0,console.log("loading..."),setTimeout((function(){e.getVideos()}),500)},e.prototype.getVideos=function(){this.playlist&&this.playlist.length>0?(this.imageOffline=!1,this.video=this.playlist[this.currentIndex],this.getPosition(this.video)):(this.video=new p,this.tryAgain())},e.prototype.getPosition=function(e){var t=this;setTimeout((function(){var i=document.getElementById("video_element");i.load();var n=new Date,o=Math.abs(n.getTime()-new Date(t.video.actualStart).getTime());console.log("Temos no player: "+e.url),console.log("Início em: "+o),t.video.url=e.url,i.currentTime=o/1e3;var a=i.play();void 0!==a&&a.then((function(e){console.log("Estamos ao vivo!")})).catch((function(){t.play=!0}))}),1e3)},e.prototype.getMuted=function(){return this.media&&this.media.nativeElement&&this.media.nativeElement.muted||!1},e.prototype.getMaximized=function(){return this.api&&this.api.fsAPI&&this.api.fsAPI.isFullscreen&&this.api.fsAPI.isFullscreen||!1},e.prototype.toggleSound=function(){this.media.nativeElement.muted=!this.media.nativeElement.muted},e.prototype.toggleMaximize=function(){this.api.fsAPI.toggleFullscreen(this.media)},e.prototype.showVideoControls=function(){this.isHidden=!1,this.isShow=!0},e.prototype.hideVideoControls=function(){this.isHidden=!0,this.isShow=!1},e}();c.decorators=[{type:t.Component,args:[{selector:"ng-cast",template:'
\n \n \n \n \n \n
\n \n \n
AGORA
\n
\n
\n \n \n \n \n
\n
\n \n TV Offline\n \n\n\n
\n
\x3c!-- Put Your Image Width --\x3e\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n\n\nTV Offline\n',styles:['#video-container{background-color:#272c34;margin:0 auto;z-index:-1}#video-container vg-scrub-bar-current-time .background{background-color:red}#video-container .hidden{display:none}#video-container .show{display:block}#video-container .video-controls{background:rgba(0,0,0,.5);bottom:0;height:45px;left:0;position:absolute;right:0;transition:all .2s ease}#video-container .video-controls.hide{opacity:0;pointer-events:none}#video-container .video-progress{align-items:right;height:8.4px;position:relative}#video-container .video-progress #seek-tooltip{position:absolute}@media screen and (-webkit-min-device-pixel-ratio:0){#video-container .video-progress input[type=range]{-webkit-appearance:none;background-color:var(--youtube-red);overflow:hidden}#video-container .video-progress input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;color:var(--youtube-red);height:10px;margin-top:-1px}#video-container .video-progress input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--youtube-red);cursor:ew-resize;height:10px;width:10px}}#video-container .video-progress input[type=range]{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-moz-range-progress,#video-container .video-progress input[type=range]::-moz-range-track{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-ms-fill-lower,#video-container .video-progress input[type=range]::-ms-fill-upper{background-color:var(--youtube-red)}#video-container progress{-moz-appearance:none;-webkit-appearance:none;appearance:none;border-radius:2px;height:.5vh;pointer-events:none;position:absolute;top:0;width:100%}#video-container .buttons .video-control{align-items:center;background:none;border:2px solid #fff;border-radius:16px;color:#fff;display:flex;height:32px;justify-content:center;width:32px}#video-container .buttons .video-control i{color:#fff;line-height:16px}#video-container .buttons .video-control-paused{bottom:8px;left:1vw;position:absolute;z-index:1000}#video-container .buttons .video-control-muted{bottom:8px;position:absolute;right:5vw;z-index:1000}#video-container .buttons .video-control-maximized{bottom:8px;position:absolute;right:1vw;z-index:1000}#video-container progress::-webkit-progress-bar{background-color:var(--youtube-red);border-radius:2px}#video-container progress::-webkit-progress-value{background:#fff;border-radius:2px}#video-container progress::-moz-progress-bar{background:#fff;border:1px solid #fff}#video-container .seek{cursor:pointer;height:.5vh;margin:0;position:absolute;top:0;width:100%}#video-container .seek-tooltip{background-color:var(--youtube-red);color:#fff;content:attr(data-title);display:block;font-size:12px;font-weight:700;margin-left:5vw;padding:3px;position:absolute;top:10px}.playlist-item li{color:#fff}.kt-content.kt-grid__item.kt-grid__item--fluid.kt-grid.kt-grid--hor{background-color:#272c34}#kt_header_menu_wrapper{display:none}.kt-header__bottom{display:none!important}.player-wrapper{margin:auto;max-width:500px}.player-wrapper video{width:100%}ul{padding:0}ul li.playlist-item{background:#673ab7;cursor:pointer;list-style:none;margin-bottom:2px;padding:10px}ul li.playlist-item.selected{background-color:#ccc}body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);display:none;height:540px;margin-bottom:0;margin-right:0;margin-top:0;position:absolute;width:100%;z-index:0}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}']}]}],c.ctorParameters=function(){return[{type:u}]},c.propDecorators={vgDash:[{type:t.ViewChild,args:[o.VgDASH,{static:!1}]}],media:[{type:t.ViewChild,args:["media",{static:!1}]}],videoImage:[{type:t.Input}],imageOffline:[{type:t.Input}],premium:[{type:t.Input}],srcImageOffline:[{type:t.Input}],currentStream:[{type:t.Input}],isDebug:[{type:t.Input}],paused:[{type:t.Input}],streams:[{type:t.Input}],playlist:[{type:t.Input}],play:[{type:t.Input}],isHidden:[{type:t.Input}],isShow:[{type:t.Input}],currentIndex:[{type:t.Input}],video:[{type:t.Input}],appBaseUrl:[{type:t.Input}]};var m=function(){};m.decorators=[{type:t.NgModule,args:[{schemas:[t.CUSTOM_ELEMENTS_SCHEMA],imports:[i.CommonModule,a.VgCoreModule,r.VgControlsModule,s.VgStreamingModule,d.VgBufferingModule,l.VgOverlayPlayModule],exports:[c],providers:[u],declarations:[c]}]}];var g=600,y=100,f="IDLE",h="BUFFERING",v="LOADED",b="PLAYING",x="PAUSED",_="ERROR",I=function(){this.playerHandler=new E(this),this.playerState=f,this.playerStateBeforeSwitch=null,this.remotePlayer=null,this.remotePlayerController=null,this.currentMediaTime=0,this.mediaDuration=-1,this.timer=null,this.incrementMediaTimeHandler=this.incrementMediaTime.bind(this),this.seekMediaListener=this.seekMedia.bind(this),this.currentMediaIndex=0,this.mediaContents=null,this.fullscreen=!1,this.mediaInfo=null,this.whenSkippable=null,this.liveSeekableRange=null,this.isLiveContent=!1,this.mediaJSON={categories:[]}};I.prototype.initializeCastPlayer=function(){var e={receiverApplicationId:"4F8B3483"};e.autoJoinPolicy=chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,cast.framework.CastContext.getInstance().setOptions(e),k.remotePlayer=new cast.framework.RemotePlayer,k.remotePlayerController=new cast.framework.RemotePlayerController(k.remotePlayer),k.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,k.switchPlayer.bind(k))},I.prototype.switchPlayer=function(){k.stopProgressTimer(),k.resetVolumeSlider(),k.playerHandler.stop(),k.playerState=f,cast&&cast.framework&&k.remotePlayer.isConnected?k.setupRemotePlayer():k.setupLocalPlayer()};var E=function(e){this.target={},this.setTarget=function(e){this.target=e},this.play=function(){e.playerState===b||e.playerState===x||e.playerState===v?(this.target.play(),e.playerState=b,document.getElementById("play").style.display="none",document.getElementById("pause").style.display="block",this.updateDisplayMessage()):this.load(e.currentMediaIndex)},this.updateDisplayMessage=function(){this.target.updateDisplayMessage()},this.pause=function(){this.target.pause(),e.playerState=x,document.getElementById("play").style.display="block",document.getElementById("pause").style.display="none"},this.stop=function(){e.playerState=f,this.target.stop()},this.load=function(t){void 0===t&&(t=null),t||(t=e.currentMediaIndex),e.playerState=h,this.target.load(t)},this.isMediaLoaded=function(e){return this.target.isMediaLoaded(e)},this.prepareToPlay=function(){e.mediaDuration=this.getMediaDuration(),e.playerHandler.updateDurationDisplay(),e.playerState=v,this.play(),e.startProgressTimer(),this.updateDisplay()},this.loaded=function(){e.currentMediaDuration=this.getMediaDuration(),e.updateMediaDuration(),e.playerState=v,e.currentMediaTime>0&&this.seekTo(e.currentMediaTime),this.play(),e.startProgressTimer(),this.updateDisplayMessage()},this.getCurrentMediaTime=function(){return this.target.getCurrentMediaTime()},this.getMediaDuration=function(){return this.target.getMediaDuration()},this.updateDisplay=function(){this.currentMediaTime=this.target.getCurrentMediaTime(),this.mediaDuration=this.target.getMediaDuration(),this.target.updateDisplay()},this.updateCurrentTimeDisplay=function(){this.target.updateCurrentTimeDisplay()},this.setTimeString=function(e,t){this.target.setTimeString(e,t)},this.setVolume=function(e){this.target.setVolume(e)},this.mute=function(){this.target.mute(),document.getElementById("audio_on").style.display="none",document.getElementById("audio_off").style.display="block"},this.unMute=function(){this.target.unMute(),document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},this.isMuted=function(){return this.target.isMuted()},this.seekTo=function(e){this.target.seekTo(e)}};I.prototype.setupLocalPlayer=function(){var e=document.getElementById("video_element");e.addEventListener("loadeddata",k.onMediaLoadedLocally.bind(k));var t={play:function(){e.play(),document.getElementById("video_image").style.display="none",e.style.display="block"},pause:function(){e.pause()},stop:function(){"function"==typeof e.stop&&e.stop()}};t.load=function(t){e.src=k.mediaContents[t].sources[0],e.load()}.bind(k),t.getCurrentMediaTime=function(){return e.currentTime},t.getMediaDuration=function(){return e.duration},t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="none",document.getElementById("playerstatebg").style.display="none",document.getElementById("video_image_overlay").style.display="none"},t.setVolume=function(t){e.volume=t0&&k.playerHandler.play()},I.prototype.setupRemotePlayer=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();k.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,function(){k.remotePlayer.isPaused?k.playerHandler.pause():k.playerHandler.play()}.bind(k)),k.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,function(){k.remotePlayer.isMuted?k.playerHandler.mute():k.playerHandler.unMute()}.bind(k)),k.remotePlayerController.addEventListener(cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,function(){var e=k.remotePlayer.volumeLevel*y,t=document.getElementById("audio_bg_level");t.style.height=e+"px",t.style.marginTop=-e+"px"}.bind(k));var t={};t.play=function(){k.remotePlayer.isPaused&&k.remotePlayerController.playOrPause(),document.getElementById("video_image").style.display="block",document.getElementById("video_element").style.display="none"}.bind(k),t.pause=function(){k.remotePlayer.isPaused||k.remotePlayerController.playOrPause()}.bind(k),t.stop=function(){k.remotePlayerController.stop()}.bind(k),t.load=function(t){console.log("Loading..."+k.mediaContents[t].title);var i=new chrome.cast.media.MediaInfo(k.mediaContents[t].sources[0],"video/mp4");i.metadata=new chrome.cast.media.GenericMediaMetadata,i.metadata.metadataType=chrome.cast.media.MetadataType.GENERIC,i.metadata.title=k.mediaContents[t].title,i.metadata.images=[{url:""+k.mediaContents[t].thumb}];var n=new chrome.cast.media.LoadRequest(i);e.loadMedia(n).then(k.playerHandler.loaded.bind(k.playerHandler),function(e){k.playerState=_,console.log("Remote media load error: "+I.getErrorMessage(e))}.bind(k))}.bind(k),t.getCurrentMediaTime=function(){return k.remotePlayer.currentTime}.bind(k),t.getMediaDuration=function(){return k.remotePlayer.duration}.bind(k),t.updateDisplayMessage=function(){document.getElementById("playerstate").style.display="block",document.getElementById("playerstatebg").style.display="block",document.getElementById("video_image_overlay").style.display="block",document.getElementById("playerstate").innerHTML=k.mediaContents[k.currentMediaIndex].title+" "+k.playerState+" on "+e.getCastDevice().friendlyName}.bind(k),t.setVolume=function(e){var t=k.remotePlayer.volumeLevel,i=document.getElementById("audio_bg_level");if(en&&(e=n+(pos-n)/2),i.style.height=e+"px",i.style.marginTop=-e+"px",t=e/y}else t=1;k.remotePlayer.volumeLevel=t,k.remotePlayerController.setVolumeLevel()}.bind(k),t.mute=function(){k.remotePlayer.isMuted||k.remotePlayerController.muteOrUnmute()}.bind(k),t.unMute=function(){k.remotePlayer.isMuted&&k.remotePlayerController.muteOrUnmute()}.bind(k),t.isMuted=function(){return k.remotePlayer.isMuted}.bind(k),t.seekTo=function(e){k.remotePlayer.currentTime=e,k.remotePlayerController.seek()}.bind(k),k.playerHandler.setTarget(t),k.remotePlayer.isMuted&&k.playerHandler.mute();var i=k.remotePlayer.volumeLevel*y,n=document.getElementById("audio_bg_level");n.style.height=i+"px",n.style.marginTop=-i+"px",k.hideFullscreenButton(),k.playerHandler.play()},I.prototype.onMediaLoadedLocally=function(){document.getElementById("video_element").currentTime=k.currentMediaTime,k.playerHandler.loaded()},I.prototype.selectMedia=function(e){console.log("Media index selected: "+e),k.currentMediaIndex=e,k.playerHandler.currentMediaInfo=void 0,document.getElementById("video_image").src=""+k.mediaContents[e].thumb,document.getElementById("progress_indicator").style.marginLeft="0px",document.getElementById("progress").style.width="0px";var t=document.getElementById("seekable_window"),i=document.getElementById("unseekable_overlay");t.style.width=g,i.style.width="0px",k.stopProgressTimer(),k.currentMediaTime=0,k.playerHandler.setTimeString(document.getElementById("currentTime"),0),k.playerHandler.setTimeString(document.getElementById("duration"),0),k.playerState=f,k.playerHandler.play()},I.prototype.seekMedia=function(e){if(null==k.mediaDuration||cast.framework.CastContext.getInstance().getCurrentSession()&&!k.remotePlayer.canSeek)console.log("Error - Not seekable");else if(!k.isLiveContent||k.liveSeekableRange){var t=parseInt(e.offsetX,10),i=document.getElementById("progress_indicator"),n=document.getElementById("progress"),o=0,a=0,r=0;"progress_indicator"==e.currentTarget.id?(o=parseInt(k.currentMediaTime+k.mediaDuration*t/g,10),a=parseInt(i.style.marginLeft,10)+t,r=parseInt(n.style.width,10)+t):(o=parseInt(t*k.mediaDuration/g,10),a=t,r=t),k.playerState!==b&&k.playerState!==x||(k.currentMediaTime=o,n.style.width=r+"px",i.style.marginLeft=a+"px"),k.isLiveContent&&(o+=k.mediaInfo.metadata.sectionStartTimeInMedia),k.playerHandler.seekTo(o)}else console.log("Live content has no seekable range.")},I.prototype.setVolume=function(e){var t=document.getElementById("audio_bg_level"),i=0;i="audio_bg_track"===e.currentTarget.id?y-parseInt(e.offsetY,10):parseInt(t.clientHeight,10)-parseInt(e.offsetY,10),k.playerHandler.setVolume(i)},I.prototype.startProgressTimer=function(){k.stopProgressTimer(),k.timer=setInterval(k.incrementMediaTimeHandler,1e3)},I.prototype.stopProgressTimer=function(){k.timer&&(clearInterval(k.timer),k.timer=null)},I.prototype.incrementMediaTime=function(){k.currentMediaTime=k.playerHandler.getCurrentMediaTime(),k.currentMediaDuration=k.playerHandler.getMediaDuration(),k.playerState===b&&(k.currentMediaTime0)var t=Math.floor(g*k.currentMediaTime/k.currentMediaDuration);e.style.width=t+"px",document.getElementById("progress_indicator").style.marginLeft=-621+t+"px",t>=g&&k.endPlayback()},I.prototype.endPlayback=function(){k.currentMediaTime=0,k.stopProgressTimer(),k.playerState=f,k.playerHandler.updateDisplay();var e=document.getElementById("play");e&&e.style&&e.display&&(e.style.display="block");var t=document.getElementById("pause");t&&t.style&&t.style.display&&(t.style.display="none")},I.prototype.getMediaTimeString=function(e){if(null==e||null==e)return null;var t=!1;e<0&&(t=!0,e*=-1);var i=Math.floor(e/3600),n=Math.floor((e-3600*i)/60),o=Math.floor(e-3600*i-60*n);return i<10&&(i="0"+i),n<10&&(n="0"+n),o<10&&(o="0"+o),(t?"-":"")+i+":"+n+":"+o},I.prototype.getClockTimeString=function(e){if(!e)return"0:00:00";var t=new Date(1e3*e),i=t.getHours(),n=t.getMinutes(),o=t.getSeconds(),a=i>=12?"PM":"AM";return(i=(i%=12)||12)+":"+(n=("0"+n).slice(-2))+":"+(o=("0"+o).slice(-2))+" "+a},I.prototype.updateAdMarkers=function(){var e=cast.framework.CastContext.getInstance().getCurrentSession();if(e){var t=e.getMediaSession();if(t){var i=t.media;if(i){var n=i.breaks,o=i.duration;if(n)for(var a=0;ao&&r.isEmbedded))if(!document.getElementById("ad"+r.position))document.getElementById("progress").innerHTML+='
'}}}}},I.prototype.removeAdMarkers=function(){document.querySelectorAll(".adMarker").forEach((function(e){e.remove()}))},I.prototype.adPositionToMargin=function(e,t){return-1==e||e>t?g:g*e/t},I.prototype.onBreakClipIdChanged=function(){var e=document.getElementById("skip");e&&e.style&&e.style.display&&(e.style.display="none")},I.prototype.isPlayingBreak=function(e){k.enableProgressBar(!e)},I.prototype.onWhenSkippableChanged=function(e){k.whenSkippable=e},I.prototype.onCurrentBreakClipTimeChanged=function(e){var t=document.getElementById("skip");null==k.whenSkippable||k.whenSkippable<0?t&&t.style&&t.style.display&&(t.style.display="none"):void 0!==k.whenSkippable||e>=k.whenSkippable?t&&t.style&&t.style.display&&(t.style.display="block"):t&&t.style&&t.style.display&&(t.style.display="none")},I.prototype.skipAd=function(){k.remotePlayerController.skipAd()},I.prototype.enableProgressBar=function(e){var t=document.getElementById("progress"),i=document.getElementById("progress_indicator"),n=document.getElementById("seekable_window");e?(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_progress.png')",t.style.cursor="pointer",n.style.cursor="pointer",i.style.cursor="pointer",i.draggable=!0,t.addEventListener("click",k.seekMediaListener),n.addEventListener("click",k.seekMediaListener),i.addEventListener("dragend",k.seekMediaListener)):(t.style.backgroundImage="url('./assets/imagefiles/timeline_bg_buffer.png')",t.style.cursor="default",n.style.cursor="default",i.style.cursor="default",i.draggable=!1,t.removeEventListener("click",k.seekMediaListener),n.removeEventListener("click",k.seekMediaListener),i.removeEventListener("dragend",k.seekMediaListener))},I.prototype.updateMediaDuration=function(){document.getElementById("duration").innerHTML=I.getDurationString(k.currentMediaDuration)},I.getDurationString=function(e){var t=""+Math.floor(e%60),i=Math.floor(e/60);if(0===i)return t;t=i%60+":"+t;var n=Math.floor(i/60);return 0===n?t:n+":"+t},I.prototype.requestFullScreen=function(){var e=document.getElementById("video_element"),t=e.requestFullScreen||e.webkitRequestFullScreen;t&&(t.call(e),console.log("Requested fullscreen"))},I.prototype.cancelFullScreen=function(){var e=document.cancelFullScreen||document.webkitCancelFullScreen;e&&e.call(document)},I.prototype.fullscreenChangeHandler=function(){k.fullscreen=!k.fullscreen},I.prototype.showFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");k.fullscreen?(e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="block")):(e&&e.style&&e.style.display&&(e.style.display="block"),t&&t.style&&t.style.display&&(t.style.display="none"))},I.prototype.hideFullscreenButton=function(){var e=document.getElementById("fullscreen_expand"),t=document.getElementById("fullscreen_collapse");e&&e.style&&e.style.display&&(e.style.display="none"),t&&t.style&&t.style.display&&(t.style.display="none")},I.prototype.showMediaControl=function(){var e=document.getElementById("media_control");e&&e.style&&e.style.opacity&&(e.style.opacity=.7)},I.prototype.hideMediaControl=function(){if("undefined"!=typeof cast){var e=cast.framework.CastContext.getInstance();e&&e.getCurrentSession()?document.getElementById("media_control").style.opacity=.7:document.getElementById("media_control").style.opacity=0}},I.prototype.showVolumeSlider=function(){k.playerHandler.isMuted()||(document.getElementById("audio_bg").style.opacity=1,document.getElementById("audio_bg_track").style.opacity=1,document.getElementById("audio_bg_level").style.opacity=1,document.getElementById("audio_indicator").style.opacity=1)},I.prototype.hideVolumeSlider=function(){document.getElementById("audio_bg").style.opacity=0,document.getElementById("audio_bg_track").style.opacity=0,document.getElementById("audio_bg_level").style.opacity=0,document.getElementById("audio_indicator").style.opacity=0},I.prototype.resetVolumeSlider=function(){var e=.5*document.getElementById("audio_bg_track").clientHeight;document.getElementById("audio_bg_level").style.height=e+"px",document.getElementById("audio_on").style.display="block",document.getElementById("audio_off").style.display="none"},I.prototype.initializeUI=function(){document.getElementById("media_title").innerHTML=k.mediaContents[0].title,document.getElementById("media_subtitle").innerHTML=k.mediaContents[k.currentMediaIndex].subtitle,document.getElementById("media_desc").innerHTML=k.mediaContents[k.currentMediaIndex].description,document.getElementById("progress_bg").addEventListener("click",k.seekMedia.bind(k)),document.getElementById("progress").addEventListener("click",k.seekMedia.bind(k)),document.getElementById("progress_indicator").addEventListener("dragend",k.seekMedia.bind(k)),document.getElementById("audio_on").addEventListener("click",k.playerHandler.mute.bind(k.playerHandler)),document.getElementById("audio_off").addEventListener("click",k.playerHandler.unMute.bind(k.playerHandler)),document.getElementById("audio_bg").addEventListener("mouseover",k.showVolumeSlider.bind(k)),document.getElementById("audio_on").addEventListener("mouseover",k.showVolumeSlider.bind(k)),document.getElementById("audio_bg_level").addEventListener("mouseover",k.showVolumeSlider.bind(k)),document.getElementById("audio_bg_track").addEventListener("mouseover",k.showVolumeSlider.bind(k)),document.getElementById("audio_bg_level").addEventListener("click",k.setVolume.bind(k)),document.getElementById("audio_bg_track").addEventListener("click",k.setVolume.bind(k)),document.getElementById("audio_bg").addEventListener("mouseout",k.hideVolumeSlider.bind(k)),document.getElementById("audio_on").addEventListener("mouseout",k.hideVolumeSlider.bind(k)),document.getElementById("main_video").addEventListener("mouseover",k.showMediaControl.bind(k)),document.getElementById("main_video").addEventListener("mouseout",k.hideMediaControl.bind(k)),document.getElementById("media_control").addEventListener("mouseover",k.showMediaControl.bind(k)),document.getElementById("media_control").addEventListener("mouseout",k.hideMediaControl.bind(k)),document.getElementById("fullscreen_expand").addEventListener("click",k.requestFullScreen.bind(k)),document.getElementById("fullscreen_collapse").addEventListener("click",k.cancelFullScreen.bind(k)),document.addEventListener("fullscreenchange",k.fullscreenChangeHandler.bind(k),!1),document.addEventListener("webkitfullscreenchange",k.fullscreenChangeHandler.bind(k),!1),document.getElementById("play").addEventListener("click",k.playerHandler.play.bind(k.playerHandler)),document.getElementById("pause").addEventListener("click",k.playerHandler.pause.bind(k.playerHandler)),document.getElementById("progress_indicator").draggable=!0},I.prototype.addVideoThumbs=function(){if(void 0!==k.mediaJSON&&k.mediaJSON.categories&&k.mediaJSON.categories.length>0){k.mediaContents=k.mediaJSON.categories[0].videos;for(var e=document.getElementById("carousel"),t=null,i=null,n=0;n',t.addEventListener("click",k.selectMedia.bind(k,n)),e.appendChild(t)}},I.prototype.addMediaContents=function(){return void 0!==k.mediaJSON&&k.mediaJSON.categories&&k.mediaJSON.categories.length>0?(k.mediaContents=k.mediaJSON.categories[0].videos,k.mediaContents):null},I.getErrorMessage=function(e){switch(e.code){case chrome.cast.ErrorCode.API_NOT_INITIALIZED:return"The API is not initialized."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CANCEL:return"The operation was canceled by the user"+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.CHANNEL_ERROR:return"A channel to the receiver is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.EXTENSION_MISSING:return"The Cast extension is not available."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.INVALID_PARAMETER:return"The parameters to the operation were not valid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:return"No receiver was compatible with the session request."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.SESSION_ERROR:return"A session could not be created, or a session was invalid."+(e.description?" :"+e.description:"");case chrome.cast.ErrorCode.TIMEOUT:return"The operation timed out."+(e.description?" :"+e.description:"");default:return e}};var k=new I;window.__onGCastApiAvailable=function(e){e&&k.initializeCastPlayer()},window.CastPlayer=k,e.NgCastModule=m,e.NgCastService=u,e.ɵa=c,Object.defineProperty(e,"__esModule",{value:!0})})); //# sourceMappingURL=thinkam.net-ng-cast.umd.min.js.map \ No newline at end of file diff --git a/dist/bundles/thinkam.net-ng-cast.umd.min.js.map b/dist/bundles/thinkam.net-ng-cast.umd.min.js.map index 428e7b6..9ae4135 100644 --- a/dist/bundles/thinkam.net-ng-cast.umd.min.js.map +++ b/dist/bundles/thinkam.net-ng-cast.umd.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../shared/ng-cast.service.ts","../../dto/schedule-dto.ts","../../ng-cast.component.ts","../../ng.cast.module.ts","../../cast-videos.js"],"names":["NgCastService","_this","this","window","status","casting","onInitSuccess","console","log","onError","err","discoverDevices","self","subj","Subject","cast","requestSession","s","session","setCasting","next","code","undefined","error","onMediaDiscovered","categories","script","createElement","setAttribute","body","appendChild","globalThis","CastPlayer","mediaJSON","addMediaContents","play","currentMedia","pause","stop","onMediaError","prototype","initializeCastApi","sessionRequest","SessionRequest","apiConfig","ApiConfig","ReceiverAvailability","AVAILABLE","initialize","mediaContents","initializeUI","setupLocalPlayer","initializeCastPlayer","value","setupRemotePlayer","getStatus","Injectable","ScheduleDto","data","property","hasOwnProperty","fromJS","result","init","id","tenant","name","description","url","duration","actualStart","realEnd","isActive","toJSON","NgCastComponent","ngCastService","videoImage","imageOffline","premium","srcImageOffline","currentStream","type","label","source","api","VgAPI","isDebug","paused","streams","playlist","isHidden","isShow","currentIndex","video","appBaseUrl","ngOnInit","isAvailable","castingStatus","onPlayerReady","getDefaultMedia","subscriptions","ended","subscribe","nextVideo","bind","setBitrate","option","vgDash","length","getPaused","media","nativeElement","setTimeout","openSession","closeSession","tryAgain","getVideos","getPosition","vid","document","getElementById","load","now","Date","currentTime","Math","abs","getTime","promise","then","_","catch","getMuted","muted","getMaximized","fsAPI","isFullscreen","toggleSound","toggleMaximize","toggleFullscreen","showVideoControls","hideVideoControls","Component","args","selector","template","ViewChild","VgDASH","static","Input","NgModule","schemas","CUSTOM_ELEMENTS_SCHEMA","imports","CommonModule","VgCoreModule","VgControlsModule","VgStreamingModule","VgBufferingModule","VgOverlayPlayModule","exports","providers","declarations","PROGRESS_BAR_WIDTH","FULL_VOLUME_HEIGHT","PLAYER_STATE","playerHandler","PlayerHandler","playerState","playerStateBeforeSwitch","remotePlayer","remotePlayerController","currentMediaTime","mediaDuration","timer","incrementMediaTimeHandler","incrementMediaTime","seekMediaListener","seekMedia","currentMediaIndex","fullscreen","mediaInfo","whenSkippable","liveSeekableRange","isLiveContent","options","receiverApplicationId","autoJoinPolicy","chrome","AutoJoinPolicy","ORIGIN_SCOPED","framework","CastContext","getInstance","setOptions","castPlayer","RemotePlayer","RemotePlayerController","addEventListener","RemotePlayerEventType","IS_CONNECTED_CHANGED","switchPlayer","stopProgressTimer","resetVolumeSlider","isConnected","target","setTarget","style","display","updateDisplayMessage","mediaIndex","isMediaLoaded","prepareToPlay","getMediaDuration","updateDurationDisplay","startProgressTimer","updateDisplay","loaded","currentMediaDuration","updateMediaDuration","seekTo","getCurrentMediaTime","updateCurrentTimeDisplay","setTimeString","element","time","setVolume","volumeSliderPosition","mute","unMute","isMuted","localPlayer","onMediaLoadedLocally","playerTarget","src","volume","p","height","marginTop","DEFAULT_VOLUME","showFullscreenButton","castSession","getCurrentSession","IS_PAUSED_CHANGED","isPaused","IS_MUTED_CHANGED","VOLUME_LEVEL_CHANGED","newVolume","volumeLevel","playOrPause","MediaInfo","metadata","GenericMediaMetadata","metadataType","MetadataType","GENERIC","title","images","request","LoadRequest","loadMedia","errorCode","getErrorMessage","innerHTML","getCastDevice","friendlyName","currentVolume","vScale","pos","setVolumeLevel","muteOrUnmute","seek","hideFullscreenButton","selectMedia","currentMediaInfo","marginLeft","width","seekable_window","unseekable_overlay","event","canSeek","position","parseInt","offsetX","pi","progress","seekTime","pp","pw","currentTarget","sectionStartTimeInMedia","mouseEvent","offsetY","clientHeight","setInterval","clearInterval","updateProgressBarByTimer","endPlayback","isNaN","floor","getMediaTimeString","timestamp","isNegative","hours","minutes","seconds","getClockTimeString","date","getHours","getMinutes","getSeconds","ampm","slice","updateAdMarkers","getMediaSession","breaks","contentDuration","i","adBreak","isEmbedded","adPositionToMargin","removeAdMarkers","querySelectorAll","forEach","adMarker","remove","onBreakClipIdChanged","skip","isPlayingBreak","enableProgressBar","onWhenSkippableChanged","onCurrentBreakClipTimeChanged","currentBreakClipTime","skipAd","enable","progress_indicator","backgroundImage","cursor","draggable","removeEventListener","getDurationString","durationInSec","durationString","durationInMin","durationInHour","requestFullScreen","requestMethod","call","cancelFullScreen","fullscreenChangeHandler","fullscreen_expand","fullscreen_collapse","showMediaControl","media_control","opacity","hideMediaControl","context","showVolumeSlider","hideVolumeSlider","defaultVolumeSliderHeight","addVideoThumbs","ni","newdiv","divIdName","ErrorCode","API_NOT_INITIALIZED","CANCEL","CHANNEL_ERROR","EXTENSION_MISSING","INVALID_PARAMETER","RECEIVER_UNAVAILABLE","SESSION_ERROR","TIMEOUT"],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeCastPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n globalThis.CastPlayer.setupRemotePlayer();\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { TenantDto } from './tenant-dto';\n\nexport interface IScheduleDto {\n id: string | undefined;\n tenant: TenantDto | undefined;\n name: string | undefined;\n description: string | undefined;\n url: string | undefined;\n duration: number | undefined;\n actualStart: Date;\n realEnd?: Date | undefined;\n isActive: boolean | undefined;\n}\n\nexport class ScheduleDto implements IScheduleDto {\n id: string | undefined;\n tenant: TenantDto | undefined;\n name: string | undefined;\n description: string | undefined;\n url: string | undefined;\n duration: number | undefined;\n actualStart!: Date;\n realEnd?: Date | undefined;\n isActive: boolean | undefined;\n\n constructor(data?: IScheduleDto) {\n if (data) {\n for (let property in data) {\n if (data.hasOwnProperty(property)) {\n (this)[property] = (data)[property];\n }\n }\n }\n }\n\n static fromJS(data: any): ScheduleDto {\n data = typeof data === 'object' ? data : {};\n let result = new ScheduleDto();\n result.init(data);\n return result;\n }\n\n init(data?: any) {\n if (data) {\n this.id = data['id'];\n this.tenant = data['tenant'];\n this.name = data['name'];\n this.description = data['description'];\n this.url = data['url'];\n this.duration = data['duration'];\n this.actualStart = data['actualStart'];\n this.realEnd = data['realEnd'];\n this.isActive = data['isActive'];\n }\n }\n\n toJSON(data?: any) {\n data = typeof data === 'object' ? data : {};\n data['id'] = this.id;\n data['tenant'] = this.tenant;\n data['name'] = this.name;\n data['description'] = this.description;\n data['url'] = this.url;\n data['duration'] = this.duration;\n data['actualStart'] = this.actualStart;\n data['realEnd'] = this.realEnd;\n data['isActive'] = this.isActive;\n return data;\n }\n}\n","import { Component, Input, OnInit, ViewChild, ElementRef } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\nimport { VgDASH } from 'videogular2/compiled/src/streaming/vg-dash/vg-dash';\nimport { IDRMLicenseServer } from 'videogular2/compiled/src/streaming/streaming';\nimport { VgAPI, BitrateOption } from 'videogular2/compiled/core';\n\nimport { ScheduleDto } from './dto/schedule-dto';\n\nexport interface IMediaStream {\n type: 'vod' | 'dash';\n source: string;\n label: string;\n token?: string;\n licenseServers?: IDRMLicenseServer;\n}\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n @ViewChild(VgDASH, { static: false }) vgDash!: VgDASH;\n @ViewChild('media', { static: false }) media!: ElementRef;\n\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() premium = false;\n @Input() srcImageOffline = '';\n\n @Input() currentStream: IMediaStream = {\n type: 'dash',\n label: 'DASH: Media Stream test',\n source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd'\n };\n\n api: VgAPI = new VgAPI();\n\n @Input() isDebug = false;\n\n @Input() paused = false;\n\n @Input() streams: IMediaStream[] = [\n {\n type: 'dash',\n label: 'DASH: Media Stream test',\n source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd'\n }\n ];\n\n @Input() playlist: Array = [];\n\n @Input() play = false;\n @Input() isHidden = false;\n @Input() isShow = true;\n\n @Input() currentIndex = 0;\n @Input() video: ScheduleDto = new ScheduleDto();\n @Input() appBaseUrl: String = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n this.currentStream = this.streams[0];\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n onPlayerReady(api: VgAPI) {\n this.api = api;\n\n this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this));\n }\n\n setBitrate(option: BitrateOption) {\n switch (this.currentStream.type) {\n case 'dash':\n this.vgDash.setBitrate(option);\n break;\n }\n }\n\n nextVideo() {\n this.currentIndex++;\n\n if (this.currentIndex === this.playlist.length) {\n this.currentIndex = 0;\n }\n\n this.video = this.playlist[this.currentIndex];\n }\n\n getPaused() {\n if (this.media && this.media.nativeElement) {\n this.paused = this.media.nativeElement.paused;\n return this.media.nativeElement.paused;\n } else {\n setTimeout(() => {\n return this.getPaused();\n }, 2000);\n }\n }\n\n pause(): void {\n this.media.nativeElement.pause();\n this.getPaused();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n tryAgain() {\n this.imageOffline = true;\n this.isHidden = true;\n console.log('loading...');\n\n setTimeout(() => {\n this.getVideos();\n }, 500);\n }\n\n getVideos(): void {\n if (this.playlist && this.playlist.length > 0) {\n this.imageOffline = false;\n this.video = this.playlist[this.currentIndex];\n\n this.getPosition(this.video);\n } else {\n this.video = new ScheduleDto();\n this.tryAgain();\n }\n }\n\n getPosition(result: ScheduleDto) {\n setTimeout(() => {\n let vid: any = document.getElementById('video_element');\n vid.load();\n\n const now = new Date();\n const currentTime = Math.abs(now.getTime() - new Date(this.video.actualStart).getTime());\n\n console.log('Temos no player: ' + result.url);\n console.log('Início em: ' + currentTime);\n\n this.video.url = result.url;\n vid['currentTime'] = currentTime / 1000;\n\n let promise = vid.play();\n if (promise !== undefined) {\n promise.then((_: any) => {\n // Autoplay started!\n console.log('Estamos ao vivo!');\n }).catch(() => {\n // Autoplay was prevented.\n // Show a \"Play\" button so that user can start playback.\n this.play = true;\n });\n }\n }, 1000);\n }\n\n getMuted(): boolean {\n return this.media && this.media.nativeElement && this.media.nativeElement.muted || false;\n }\n\n getMaximized(): boolean {\n return this.api && this.api.fsAPI && this.api.fsAPI.isFullscreen && this.api.fsAPI.isFullscreen || false;\n }\n\n toggleSound(): void {\n this.media.nativeElement.muted = !this.media.nativeElement.muted;\n }\n\n toggleMaximize(): void {\n this.api.fsAPI.toggleFullscreen(this.media);\n }\n\n showVideoControls(): void {\n this.isHidden = false;\n this.isShow = true;\n }\n\n hideVideoControls(): void {\n this.isHidden = true;\n this.isShow = false;\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\nimport { VgCoreModule } from 'videogular2/compiled/core';\nimport { VgControlsModule } from 'videogular2/compiled/controls';\nimport { VgStreamingModule } from 'videogular2/compiled/streaming';\nimport { VgBufferingModule } from 'videogular2/compiled/buffering';\nimport { VgOverlayPlayModule } from 'videogular2/compiled/overlay-play';\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule,\n VgCoreModule,\n VgControlsModule,\n VgStreamingModule,\n VgBufferingModule,\n VgOverlayPlayModule,\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = () => {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n if (typeof localPlayer.stop === \"function\")\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n"]} \ No newline at end of file +{"version":3,"sources":["../../shared/ng-cast.service.ts","../../dto/schedule-dto.ts","../../ng-cast.component.ts","../../ng.cast.module.ts","../../cast-videos.js"],"names":["NgCastService","_this","this","window","status","casting","onInitSuccess","console","log","onError","err","discoverDevices","self","subj","Subject","cast","requestSession","s","session","setCasting","next","code","undefined","error","onMediaDiscovered","categories","script","createElement","setAttribute","body","appendChild","globalThis","CastPlayer","mediaJSON","addMediaContents","play","currentMedia","pause","stop","onMediaError","prototype","initializeCastApi","sessionRequest","SessionRequest","apiConfig","ApiConfig","ReceiverAvailability","AVAILABLE","initialize","mediaContents","initializeUI","setupLocalPlayer","initializeCastPlayer","value","setupRemotePlayer","getStatus","Injectable","ScheduleDto","data","property","hasOwnProperty","fromJS","result","init","id","tenant","name","description","url","duration","actualStart","realEnd","isActive","toJSON","NgCastComponent","ngCastService","videoImage","imageOffline","premium","srcImageOffline","currentStream","type","label","source","api","VgAPI","isDebug","streams","playlist","isHidden","isShow","currentIndex","video","appBaseUrl","ngOnInit","isAvailable","castingStatus","ngAfterViewChecked","setInterval","getPaused","onPlayerReady","getDefaultMedia","subscriptions","ended","subscribe","nextVideo","bind","setBitrate","option","vgDash","length","media","nativeElement","paused","setTimeout","openSession","closeSession","tryAgain","getVideos","getPosition","vid","document","getElementById","load","now","Date","currentTime","Math","abs","getTime","promise","then","_","catch","getMuted","muted","getMaximized","fsAPI","isFullscreen","toggleSound","toggleMaximize","toggleFullscreen","showVideoControls","hideVideoControls","Component","args","selector","template","ViewChild","VgDASH","static","Input","NgModule","schemas","CUSTOM_ELEMENTS_SCHEMA","imports","CommonModule","VgCoreModule","VgControlsModule","VgStreamingModule","VgBufferingModule","VgOverlayPlayModule","exports","providers","declarations","PROGRESS_BAR_WIDTH","FULL_VOLUME_HEIGHT","PLAYER_STATE","playerHandler","PlayerHandler","playerState","playerStateBeforeSwitch","remotePlayer","remotePlayerController","currentMediaTime","mediaDuration","timer","incrementMediaTimeHandler","incrementMediaTime","seekMediaListener","seekMedia","currentMediaIndex","fullscreen","mediaInfo","whenSkippable","liveSeekableRange","isLiveContent","options","receiverApplicationId","autoJoinPolicy","chrome","AutoJoinPolicy","ORIGIN_SCOPED","framework","CastContext","getInstance","setOptions","castPlayer","RemotePlayer","RemotePlayerController","addEventListener","RemotePlayerEventType","IS_CONNECTED_CHANGED","switchPlayer","stopProgressTimer","resetVolumeSlider","isConnected","target","setTarget","style","display","updateDisplayMessage","mediaIndex","isMediaLoaded","prepareToPlay","getMediaDuration","updateDurationDisplay","startProgressTimer","updateDisplay","loaded","currentMediaDuration","updateMediaDuration","seekTo","getCurrentMediaTime","updateCurrentTimeDisplay","setTimeString","element","time","setVolume","volumeSliderPosition","mute","unMute","isMuted","localPlayer","onMediaLoadedLocally","playerTarget","src","volume","p","height","marginTop","DEFAULT_VOLUME","showFullscreenButton","castSession","getCurrentSession","IS_PAUSED_CHANGED","isPaused","IS_MUTED_CHANGED","VOLUME_LEVEL_CHANGED","newVolume","volumeLevel","playOrPause","MediaInfo","metadata","GenericMediaMetadata","metadataType","MetadataType","GENERIC","title","images","request","LoadRequest","loadMedia","errorCode","getErrorMessage","innerHTML","getCastDevice","friendlyName","currentVolume","vScale","pos","setVolumeLevel","muteOrUnmute","seek","hideFullscreenButton","selectMedia","currentMediaInfo","marginLeft","width","seekable_window","unseekable_overlay","event","canSeek","position","parseInt","offsetX","pi","progress","seekTime","pp","pw","currentTarget","sectionStartTimeInMedia","mouseEvent","offsetY","clientHeight","clearInterval","updateProgressBarByTimer","endPlayback","isNaN","floor","getMediaTimeString","timestamp","isNegative","hours","minutes","seconds","getClockTimeString","date","getHours","getMinutes","getSeconds","ampm","slice","updateAdMarkers","getMediaSession","breaks","contentDuration","i","adBreak","isEmbedded","adPositionToMargin","removeAdMarkers","querySelectorAll","forEach","adMarker","remove","onBreakClipIdChanged","skip","isPlayingBreak","enableProgressBar","onWhenSkippableChanged","onCurrentBreakClipTimeChanged","currentBreakClipTime","skipAd","enable","progress_indicator","backgroundImage","cursor","draggable","removeEventListener","getDurationString","durationInSec","durationString","durationInMin","durationInHour","requestFullScreen","requestMethod","call","cancelFullScreen","fullscreenChangeHandler","fullscreen_expand","fullscreen_collapse","showMediaControl","media_control","opacity","hideMediaControl","context","showVolumeSlider","hideVolumeSlider","defaultVolumeSliderHeight","addVideoThumbs","ni","newdiv","divIdName","ErrorCode","API_NOT_INITIALIZED","CANCEL","CHANNEL_ERROR","EXTENSION_MISSING","INVALID_PARAMETER","RECEIVER_UNAVAILABLE","SESSION_ERROR","TIMEOUT"],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeCastPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n globalThis.CastPlayer.setupRemotePlayer();\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { TenantDto } from './tenant-dto';\n\nexport interface IScheduleDto {\n id: string | undefined;\n tenant: TenantDto | undefined;\n name: string | undefined;\n description: string | undefined;\n url: string | undefined;\n duration: number | undefined;\n actualStart: Date;\n realEnd?: Date | undefined;\n isActive: boolean | undefined;\n}\n\nexport class ScheduleDto implements IScheduleDto {\n id: string | undefined;\n tenant: TenantDto | undefined;\n name: string | undefined;\n description: string | undefined;\n url: string | undefined;\n duration: number | undefined;\n actualStart!: Date;\n realEnd?: Date | undefined;\n isActive: boolean | undefined;\n\n constructor(data?: IScheduleDto) {\n if (data) {\n for (let property in data) {\n if (data.hasOwnProperty(property)) {\n (this)[property] = (data)[property];\n }\n }\n }\n }\n\n static fromJS(data: any): ScheduleDto {\n data = typeof data === 'object' ? data : {};\n let result = new ScheduleDto();\n result.init(data);\n return result;\n }\n\n init(data?: any) {\n if (data) {\n this.id = data['id'];\n this.tenant = data['tenant'];\n this.name = data['name'];\n this.description = data['description'];\n this.url = data['url'];\n this.duration = data['duration'];\n this.actualStart = data['actualStart'];\n this.realEnd = data['realEnd'];\n this.isActive = data['isActive'];\n }\n }\n\n toJSON(data?: any) {\n data = typeof data === 'object' ? data : {};\n data['id'] = this.id;\n data['tenant'] = this.tenant;\n data['name'] = this.name;\n data['description'] = this.description;\n data['url'] = this.url;\n data['duration'] = this.duration;\n data['actualStart'] = this.actualStart;\n data['realEnd'] = this.realEnd;\n data['isActive'] = this.isActive;\n return data;\n }\n}\n","import { Component, Input, OnInit, ViewChild, ElementRef, AfterViewChecked } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\nimport { VgDASH } from 'videogular2/compiled/src/streaming/vg-dash/vg-dash';\nimport { IDRMLicenseServer } from 'videogular2/compiled/src/streaming/streaming';\nimport { VgAPI, BitrateOption } from 'videogular2/compiled/core';\n\nimport { ScheduleDto } from './dto/schedule-dto';\n\nexport interface IMediaStream {\n type: 'vod' | 'dash';\n source: string;\n label: string;\n token?: string;\n licenseServers?: IDRMLicenseServer;\n}\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit, AfterViewChecked {\n @ViewChild(VgDASH, { static: false }) vgDash!: VgDASH;\n @ViewChild('media', { static: false }) media!: ElementRef;\n\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() premium = false;\n @Input() srcImageOffline = '';\n\n @Input() currentStream: IMediaStream = {\n type: 'dash',\n label: 'DASH: Media Stream test',\n source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd'\n };\n\n api: VgAPI = new VgAPI();\n\n @Input() isDebug = false;\n\n @Input() paused!: boolean;\n\n @Input() streams: IMediaStream[] = [\n {\n type: 'dash',\n label: 'DASH: Media Stream test',\n source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd'\n }\n ];\n\n @Input() playlist: Array = [];\n\n @Input() play = false;\n @Input() isHidden = false;\n @Input() isShow = true;\n\n @Input() currentIndex = 0;\n @Input() video: ScheduleDto = new ScheduleDto();\n @Input() appBaseUrl: String = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n this.currentStream = this.streams[0];\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n ngAfterViewChecked() { \n setInterval(() => {\n this.getPaused();\n }, 500);\n }\n\n onPlayerReady(api: VgAPI) {\n this.api = api;\n\n this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this));\n }\n\n setBitrate(option: BitrateOption) {\n switch (this.currentStream.type) {\n case 'dash':\n this.vgDash.setBitrate(option);\n break;\n }\n }\n\n nextVideo() {\n this.currentIndex++;\n\n if (this.currentIndex === this.playlist.length) {\n this.currentIndex = 0;\n }\n\n this.video = this.playlist[this.currentIndex];\n }\n\n getPaused() {\n if (this.media && this.media.nativeElement) {\n this.paused = this.media.nativeElement.paused;\n return this.media.nativeElement.paused;\n } else {\n setTimeout(() => {\n return this.getPaused();\n }, 2000);\n }\n }\n\n pause(): void {\n this.media.nativeElement.pause();\n this.getPaused();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n tryAgain() {\n this.imageOffline = true;\n this.isHidden = true;\n console.log('loading...');\n\n setTimeout(() => {\n this.getVideos();\n }, 500);\n }\n\n getVideos(): void {\n if (this.playlist && this.playlist.length > 0) {\n this.imageOffline = false;\n this.video = this.playlist[this.currentIndex];\n\n this.getPosition(this.video);\n } else {\n this.video = new ScheduleDto();\n this.tryAgain();\n }\n }\n\n getPosition(result: ScheduleDto) {\n setTimeout(() => {\n let vid: any = document.getElementById('video_element');\n vid.load();\n\n const now = new Date();\n const currentTime = Math.abs(now.getTime() - new Date(this.video.actualStart).getTime());\n\n console.log('Temos no player: ' + result.url);\n console.log('Início em: ' + currentTime);\n\n this.video.url = result.url;\n vid['currentTime'] = currentTime / 1000;\n\n let promise = vid.play();\n if (promise !== undefined) {\n promise.then((_: any) => {\n // Autoplay started!\n console.log('Estamos ao vivo!');\n }).catch(() => {\n // Autoplay was prevented.\n // Show a \"Play\" button so that user can start playback.\n this.play = true;\n });\n }\n }, 1000);\n }\n\n getMuted(): boolean {\n return this.media && this.media.nativeElement && this.media.nativeElement.muted || false;\n }\n\n getMaximized(): boolean {\n return this.api && this.api.fsAPI && this.api.fsAPI.isFullscreen && this.api.fsAPI.isFullscreen || false;\n }\n\n toggleSound(): void {\n this.media.nativeElement.muted = !this.media.nativeElement.muted;\n }\n\n toggleMaximize(): void {\n this.api.fsAPI.toggleFullscreen(this.media);\n }\n\n showVideoControls(): void {\n this.isHidden = false;\n this.isShow = true;\n }\n\n hideVideoControls(): void {\n this.isHidden = true;\n this.isShow = false;\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\nimport { VgCoreModule } from 'videogular2/compiled/core';\nimport { VgControlsModule } from 'videogular2/compiled/controls';\nimport { VgStreamingModule } from 'videogular2/compiled/streaming';\nimport { VgBufferingModule } from 'videogular2/compiled/buffering';\nimport { VgOverlayPlayModule } from 'videogular2/compiled/overlay-play';\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule,\n VgCoreModule,\n VgControlsModule,\n VgStreamingModule,\n VgBufferingModule,\n VgOverlayPlayModule,\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = () => {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n if (typeof localPlayer.stop === \"function\")\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n"]} \ No newline at end of file diff --git a/dist/esm2015/ng-cast.component.js b/dist/esm2015/ng-cast.component.js index 718c274..39d2eeb 100644 --- a/dist/esm2015/ng-cast.component.js +++ b/dist/esm2015/ng-cast.component.js @@ -17,7 +17,6 @@ export class NgCastComponent { }; this.api = new VgAPI(); this.isDebug = false; - this.paused = false; this.streams = [ { type: 'dash', @@ -44,6 +43,11 @@ export class NgCastComponent { }; this.castingStatus = this.ngCastService.getStatus(); } + ngAfterViewChecked() { + setInterval(() => { + this.getPaused(); + }, 500); + } onPlayerReady(api) { this.api = api; this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this)); @@ -149,8 +153,8 @@ export class NgCastComponent { NgCastComponent.decorators = [ { type: Component, args: [{ selector: 'ng-cast', - template: "
\n \n \n \n \n \n
\n \n \n
AGORA
\n
\n
\n \n \n \n \n
\n
\n \n \"TV\n \n\n\n
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", - styles: ["#video-container{background-color:#272c34;margin:0 auto;z-index:-1}#video-container vg-scrub-bar-current-time .background{background-color:red}#video-container .hidden{display:none}#video-container .show{display:block}#video-container .video-controls{background:rgba(0,0,0,.5);bottom:0;height:45px;left:0;position:absolute;right:0;transition:all .2s ease}#video-container .video-controls.hide{opacity:0;pointer-events:none}#video-container .video-progress{align-items:right;height:8.4px;position:relative}#video-container .video-progress #seek-tooltip{position:absolute}@media screen and (-webkit-min-device-pixel-ratio:0){#video-container .video-progress input[type=range]{-webkit-appearance:none;background-color:var(--youtube-red);overflow:hidden}#video-container .video-progress input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;color:var(--youtube-red);height:10px;margin-top:-1px}#video-container .video-progress input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--youtube-red);cursor:ew-resize;height:10px;width:10px}}#video-container .video-progress input[type=range]{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-moz-range-progress,#video-container .video-progress input[type=range]::-moz-range-track{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-ms-fill-lower,#video-container .video-progress input[type=range]::-ms-fill-upper{background-color:var(--youtube-red)}#video-container progress{-moz-appearance:none;-webkit-appearance:none;appearance:none;border-radius:2px;height:.5vh;pointer-events:none;position:absolute;top:0;width:100%}#video-container .buttons .video-control{align-items:center;background:none;border:2px solid #fff;border-radius:16px;color:#fff;display:flex;height:32px;justify-content:center;width:32px}#video-container .buttons .video-control i{color:#fff;line-height:16px}#video-container .buttons .video-control-paused{bottom:8px;left:1vw;position:absolute;z-index:1000}#video-container .buttons .video-control-muted{bottom:8px;position:absolute;right:5vw;z-index:1000}#video-container .buttons .video-control-maximized{bottom:8px;position:absolute;right:1vw;z-index:1000}#video-container progress::-webkit-progress-bar{background-color:var(--youtube-red);border-radius:2px}#video-container progress::-webkit-progress-value{background:#fff;border-radius:2px}#video-container progress::-moz-progress-bar{background:#fff;border:1px solid #fff}#video-container .seek{cursor:pointer;height:.5vh;margin:0;position:absolute;top:0;width:100%}#video-container .seek-tooltip{background-color:var(--youtube-red);color:#fff;content:attr(data-title);display:block;font-size:12px;font-weight:700;margin-left:5vw;padding:3px;position:absolute;top:10px}.playlist-item li{color:#fff}.kt-content.kt-grid__item.kt-grid__item--fluid.kt-grid.kt-grid--hor{background-color:#272c34}#kt_header_menu_wrapper{display:none}.kt-header__bottom{display:none!important}.player-wrapper{margin:auto;max-width:500px}.player-wrapper video{width:100%}ul{padding:0}ul li.playlist-item{background:#673ab7;cursor:pointer;list-style:none;margin-bottom:2px;padding:10px}ul li.playlist-item.selected{background-color:#ccc}body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] + template: "
\n \n \n \n \n \n
\n \n \n
AGORA
\n
\n
\n \n \n \n \n
\n
\n \n \"TV\n \n\n\n
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", + styles: ["#video-container{background-color:#272c34;margin:0 auto;z-index:-1}#video-container vg-scrub-bar-current-time .background{background-color:red}#video-container .hidden{display:none}#video-container .show{display:block}#video-container .video-controls{background:rgba(0,0,0,.5);bottom:0;height:45px;left:0;position:absolute;right:0;transition:all .2s ease}#video-container .video-controls.hide{opacity:0;pointer-events:none}#video-container .video-progress{align-items:right;height:8.4px;position:relative}#video-container .video-progress #seek-tooltip{position:absolute}@media screen and (-webkit-min-device-pixel-ratio:0){#video-container .video-progress input[type=range]{-webkit-appearance:none;background-color:var(--youtube-red);overflow:hidden}#video-container .video-progress input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;color:var(--youtube-red);height:10px;margin-top:-1px}#video-container .video-progress input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--youtube-red);cursor:ew-resize;height:10px;width:10px}}#video-container .video-progress input[type=range]{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-moz-range-progress,#video-container .video-progress input[type=range]::-moz-range-track{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-ms-fill-lower,#video-container .video-progress input[type=range]::-ms-fill-upper{background-color:var(--youtube-red)}#video-container progress{-moz-appearance:none;-webkit-appearance:none;appearance:none;border-radius:2px;height:.5vh;pointer-events:none;position:absolute;top:0;width:100%}#video-container .buttons .video-control{align-items:center;background:none;border:2px solid #fff;border-radius:16px;color:#fff;display:flex;height:32px;justify-content:center;width:32px}#video-container .buttons .video-control i{color:#fff;line-height:16px}#video-container .buttons .video-control-paused{bottom:8px;left:1vw;position:absolute;z-index:1000}#video-container .buttons .video-control-muted{bottom:8px;position:absolute;right:5vw;z-index:1000}#video-container .buttons .video-control-maximized{bottom:8px;position:absolute;right:1vw;z-index:1000}#video-container progress::-webkit-progress-bar{background-color:var(--youtube-red);border-radius:2px}#video-container progress::-webkit-progress-value{background:#fff;border-radius:2px}#video-container progress::-moz-progress-bar{background:#fff;border:1px solid #fff}#video-container .seek{cursor:pointer;height:.5vh;margin:0;position:absolute;top:0;width:100%}#video-container .seek-tooltip{background-color:var(--youtube-red);color:#fff;content:attr(data-title);display:block;font-size:12px;font-weight:700;margin-left:5vw;padding:3px;position:absolute;top:10px}.playlist-item li{color:#fff}.kt-content.kt-grid__item.kt-grid__item--fluid.kt-grid.kt-grid--hor{background-color:#272c34}#kt_header_menu_wrapper{display:none}.kt-header__bottom{display:none!important}.player-wrapper{margin:auto;max-width:500px}.player-wrapper video{width:100%}ul{padding:0}ul li.playlist-item{background:#673ab7;cursor:pointer;list-style:none;margin-bottom:2px;padding:10px}ul li.playlist-item.selected{background-color:#ccc}body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);display:none;height:540px;margin-bottom:0;margin-right:0;margin-top:0;position:absolute;width:100%;z-index:0}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] },] } ]; NgCastComponent.ctorParameters = () => [ @@ -175,4 +179,4 @@ NgCastComponent.propDecorators = { video: [{ type: Input }], appBaseUrl: [{ type: Input }] }; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJuZy1jYXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFFaEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXpELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUU1RSxPQUFPLEVBQUUsS0FBSyxFQUFpQixNQUFNLDJCQUEyQixDQUFDO0FBRWpFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQWlCakQsTUFBTSxPQUFPLGVBQWU7SUEwQzFCLFlBQ1UsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFwQzdCLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUVyQixrQkFBYSxHQUFpQjtZQUNyQyxJQUFJLEVBQUUsTUFBTTtZQUNaLEtBQUssRUFBRSx5QkFBeUI7WUFDaEMsTUFBTSxFQUFFLDJEQUEyRDtTQUNwRSxDQUFDO1FBRUYsUUFBRyxHQUFVLElBQUksS0FBSyxFQUFFLENBQUM7UUFFaEIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVoQixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRWYsWUFBTyxHQUFtQjtZQUNqQztnQkFDRSxJQUFJLEVBQUUsTUFBTTtnQkFDWixLQUFLLEVBQUUseUJBQXlCO2dCQUNoQyxNQUFNLEVBQUUsMkRBQTJEO2FBQ3BFO1NBQ0YsQ0FBQztRQUVPLGFBQVEsR0FBdUIsRUFBRSxDQUFDO1FBRWxDLFNBQUksR0FBRyxLQUFLLENBQUM7UUFDYixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFdBQU0sR0FBRyxJQUFJLENBQUM7UUFFZCxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixVQUFLLEdBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7UUFDdkMsZUFBVSxHQUFXLEVBQUUsQ0FBQztJQUk3QixDQUFDO0lBRUwsUUFBUTtRQUNOLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyQyxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsR0FBRyxVQUFVLFdBQW9CO1lBQ25FLElBQUksV0FBVyxFQUFFO2dCQUNmLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ25DO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRCxhQUFhLENBQUMsR0FBVTtRQUN0QixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUVmLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQsVUFBVSxDQUFDLE1BQXFCO1FBQzlCLFFBQVEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUU7WUFDL0IsS0FBSyxNQUFNO2dCQUNULElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMvQixNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVwQixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7U0FDdkI7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFO1lBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQzlDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1NBQ3hDO2FBQU07WUFDTCxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzFCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNWO0lBQ0gsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFMUIsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0MsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUU5QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM5QjthQUFNO1lBQ0wsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNqQjtJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsTUFBbUI7UUFDN0IsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksR0FBRyxHQUFRLFFBQVEsQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDeEQsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRVgsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFFekYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDLENBQUM7WUFFekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztZQUM1QixHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQztZQUV4QyxJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekIsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO2dCQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7b0JBQ3RCLG9CQUFvQjtvQkFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUNsQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFO29CQUNaLDBCQUEwQjtvQkFDMUIsd0RBQXdEO29CQUN4RCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDbkIsQ0FBQyxDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUM7SUFDM0YsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUM7SUFDM0csQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7SUFDbkUsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDOzs7WUE3TEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxTQUFTO2dCQUNuQiw0d0hBQXVDOzthQUl4Qzs7O1lBdEJRLGFBQWE7OztxQkF3Qm5CLFNBQVMsU0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO29CQUNuQyxTQUFTLFNBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTt5QkFLcEMsS0FBSzsyQkFDTCxLQUFLO3NCQUNMLEtBQUs7OEJBQ0wsS0FBSzs0QkFFTCxLQUFLO3NCQVFMLEtBQUs7cUJBRUwsS0FBSztzQkFFTCxLQUFLO3VCQVFMLEtBQUs7bUJBRUwsS0FBSzt1QkFDTCxLQUFLO3FCQUNMLEtBQUs7MkJBRUwsS0FBSztvQkFDTCxLQUFLO3lCQUNMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBOZ0Nhc3RTZXJ2aWNlIH0gZnJvbSAnLi9zaGFyZWQvbmctY2FzdC5zZXJ2aWNlJztcblxuaW1wb3J0IHsgVmdEQVNIIH0gZnJvbSAndmlkZW9ndWxhcjIvY29tcGlsZWQvc3JjL3N0cmVhbWluZy92Zy1kYXNoL3ZnLWRhc2gnO1xuaW1wb3J0IHsgSURSTUxpY2Vuc2VTZXJ2ZXIgfSBmcm9tICd2aWRlb2d1bGFyMi9jb21waWxlZC9zcmMvc3RyZWFtaW5nL3N0cmVhbWluZyc7XG5pbXBvcnQgeyBWZ0FQSSwgQml0cmF0ZU9wdGlvbiB9IGZyb20gJ3ZpZGVvZ3VsYXIyL2NvbXBpbGVkL2NvcmUnO1xuXG5pbXBvcnQgeyBTY2hlZHVsZUR0byB9IGZyb20gJy4vZHRvL3NjaGVkdWxlLWR0byc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lZGlhU3RyZWFtIHtcbiAgdHlwZTogJ3ZvZCcgfCAnZGFzaCc7XG4gIHNvdXJjZTogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICB0b2tlbj86IHN0cmluZztcbiAgbGljZW5zZVNlcnZlcnM/OiBJRFJNTGljZW5zZVNlcnZlcjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctY2FzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZy1jYXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbXG4gICAgJy4vbmctY2FzdC5jb21wb25lbnQuc2NzcydcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBOZ0Nhc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBAVmlld0NoaWxkKFZnREFTSCwgeyBzdGF0aWM6IGZhbHNlIH0pIHZnRGFzaCE6IFZnREFTSDtcbiAgQFZpZXdDaGlsZCgnbWVkaWEnLCB7IHN0YXRpYzogZmFsc2UgfSkgbWVkaWEhOiBFbGVtZW50UmVmPEhUTUxWaWRlb0VsZW1lbnQ+O1xuXG4gIGNhc3RpbmdTdGF0dXM6IGFueTtcbiAgd2luZG93OiBhbnk7XG5cbiAgQElucHV0KCkgdmlkZW9JbWFnZSA9ICcnO1xuICBASW5wdXQoKSBpbWFnZU9mZmxpbmUgPSBmYWxzZTtcbiAgQElucHV0KCkgcHJlbWl1bSA9IGZhbHNlO1xuICBASW5wdXQoKSBzcmNJbWFnZU9mZmxpbmUgPSAnJztcblxuICBASW5wdXQoKSBjdXJyZW50U3RyZWFtOiBJTWVkaWFTdHJlYW0gPSB7XG4gICAgdHlwZTogJ2Rhc2gnLFxuICAgIGxhYmVsOiAnREFTSDogTWVkaWEgU3RyZWFtIHRlc3QnLFxuICAgIHNvdXJjZTogJ2h0dHA6Ly9saXZlc2ltLmRhc2hpZi5vcmcvbGl2ZXNpbS90ZXN0cGljXzJzL01hbmlmZXN0Lm1wZCdcbiAgfTtcblxuICBhcGk6IFZnQVBJID0gbmV3IFZnQVBJKCk7XG5cbiAgQElucHV0KCkgaXNEZWJ1ZyA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHBhdXNlZCA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHN0cmVhbXM6IElNZWRpYVN0cmVhbVtdID0gW1xuICAgIHtcbiAgICAgIHR5cGU6ICdkYXNoJyxcbiAgICAgIGxhYmVsOiAnREFTSDogTWVkaWEgU3RyZWFtIHRlc3QnLFxuICAgICAgc291cmNlOiAnaHR0cDovL2xpdmVzaW0uZGFzaGlmLm9yZy9saXZlc2ltL3Rlc3RwaWNfMnMvTWFuaWZlc3QubXBkJ1xuICAgIH1cbiAgXTtcblxuICBASW5wdXQoKSBwbGF5bGlzdDogQXJyYXk8U2NoZWR1bGVEdG8+ID0gW107XG5cbiAgQElucHV0KCkgcGxheSA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0hpZGRlbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc1Nob3cgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIGN1cnJlbnRJbmRleCA9IDA7XG4gIEBJbnB1dCgpIHZpZGVvOiBTY2hlZHVsZUR0byA9IG5ldyBTY2hlZHVsZUR0bygpO1xuICBASW5wdXQoKSBhcHBCYXNlVXJsOiBTdHJpbmcgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nQ2FzdFNlcnZpY2U6IE5nQ2FzdFNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLndpbmRvdyA9IHdpbmRvdztcbiAgICB0aGlzLmN1cnJlbnRTdHJlYW0gPSB0aGlzLnN0cmVhbXNbMF07XG5cbiAgICBsZXQgbmdDYXN0U2VydmljZSA9IHRoaXMubmdDYXN0U2VydmljZTtcbiAgICB0aGlzLndpbmRvd1snX19vbkdDYXN0QXBpQXZhaWxhYmxlJ10gPSBmdW5jdGlvbiAoaXNBdmFpbGFibGU6IGJvb2xlYW4pIHtcbiAgICAgIGlmIChpc0F2YWlsYWJsZSkge1xuICAgICAgICBuZ0Nhc3RTZXJ2aWNlLmluaXRpYWxpemVDYXN0QXBpKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuY2FzdGluZ1N0YXR1cyA9IHRoaXMubmdDYXN0U2VydmljZS5nZXRTdGF0dXMoKTtcbiAgfVxuXG4gIG9uUGxheWVyUmVhZHkoYXBpOiBWZ0FQSSkge1xuICAgIHRoaXMuYXBpID0gYXBpO1xuXG4gICAgdGhpcy5hcGkuZ2V0RGVmYXVsdE1lZGlhKCkuc3Vic2NyaXB0aW9ucy5lbmRlZC5zdWJzY3JpYmUodGhpcy5uZXh0VmlkZW8uYmluZCh0aGlzKSk7XG4gIH1cblxuICBzZXRCaXRyYXRlKG9wdGlvbjogQml0cmF0ZU9wdGlvbikge1xuICAgIHN3aXRjaCAodGhpcy5jdXJyZW50U3RyZWFtLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2Rhc2gnOlxuICAgICAgICB0aGlzLnZnRGFzaC5zZXRCaXRyYXRlKG9wdGlvbik7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG5leHRWaWRlbygpIHtcbiAgICB0aGlzLmN1cnJlbnRJbmRleCsrO1xuXG4gICAgaWYgKHRoaXMuY3VycmVudEluZGV4ID09PSB0aGlzLnBsYXlsaXN0Lmxlbmd0aCkge1xuICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSAwO1xuICAgIH1cblxuICAgIHRoaXMudmlkZW8gPSB0aGlzLnBsYXlsaXN0W3RoaXMuY3VycmVudEluZGV4XTtcbiAgfVxuXG4gIGdldFBhdXNlZCgpIHtcbiAgICBpZiAodGhpcy5tZWRpYSAmJiB0aGlzLm1lZGlhLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMucGF1c2VkID0gdGhpcy5tZWRpYS5uYXRpdmVFbGVtZW50LnBhdXNlZDtcbiAgICAgIHJldHVybiB0aGlzLm1lZGlhLm5hdGl2ZUVsZW1lbnQucGF1c2VkO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGF1c2VkKCk7XG4gICAgICB9LCAyMDAwKTtcbiAgICB9XG4gIH1cblxuICBwYXVzZSgpOiB2b2lkIHtcbiAgICB0aGlzLm1lZGlhLm5hdGl2ZUVsZW1lbnQucGF1c2UoKTtcbiAgICB0aGlzLmdldFBhdXNlZCgpO1xuICB9XG5cbiAgb3BlblNlc3Npb24oKSB7XG4gICAgdGhpcy5uZ0Nhc3RTZXJ2aWNlLmRpc2NvdmVyRGV2aWNlcygpO1xuICB9XG5cbiAgY2xvc2VTZXNzaW9uKCkge1xuICAgIHRoaXMubmdDYXN0U2VydmljZS5kaXNjb3ZlckRldmljZXMoKTtcbiAgfVxuXG4gIHRyeUFnYWluKCkge1xuICAgIHRoaXMuaW1hZ2VPZmZsaW5lID0gdHJ1ZTtcbiAgICB0aGlzLmlzSGlkZGVuID0gdHJ1ZTtcbiAgICBjb25zb2xlLmxvZygnbG9hZGluZy4uLicpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmdldFZpZGVvcygpO1xuICAgIH0sIDUwMCk7XG4gIH1cblxuICBnZXRWaWRlb3MoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGxheWxpc3QgJiYgdGhpcy5wbGF5bGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmltYWdlT2ZmbGluZSA9IGZhbHNlO1xuICAgICAgdGhpcy52aWRlbyA9IHRoaXMucGxheWxpc3RbdGhpcy5jdXJyZW50SW5kZXhdO1xuXG4gICAgICB0aGlzLmdldFBvc2l0aW9uKHRoaXMudmlkZW8pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZpZGVvID0gbmV3IFNjaGVkdWxlRHRvKCk7XG4gICAgICB0aGlzLnRyeUFnYWluKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UG9zaXRpb24ocmVzdWx0OiBTY2hlZHVsZUR0bykge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgbGV0IHZpZDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZpZGVvX2VsZW1lbnQnKTtcbiAgICAgIHZpZC5sb2FkKCk7XG5cbiAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCBjdXJyZW50VGltZSA9IE1hdGguYWJzKG5vdy5nZXRUaW1lKCkgLSBuZXcgRGF0ZSh0aGlzLnZpZGVvLmFjdHVhbFN0YXJ0KS5nZXRUaW1lKCkpO1xuXG4gICAgICBjb25zb2xlLmxvZygnVGVtb3Mgbm8gcGxheWVyOiAnICsgcmVzdWx0LnVybCk7XG4gICAgICBjb25zb2xlLmxvZygnSW7DrWNpbyBlbTogJyArIGN1cnJlbnRUaW1lKTtcblxuICAgICAgdGhpcy52aWRlby51cmwgPSByZXN1bHQudXJsO1xuICAgICAgdmlkWydjdXJyZW50VGltZSddID0gY3VycmVudFRpbWUgLyAxMDAwO1xuXG4gICAgICBsZXQgcHJvbWlzZSA9IHZpZC5wbGF5KCk7XG4gICAgICBpZiAocHJvbWlzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb21pc2UudGhlbigoXzogYW55KSA9PiB7XG4gICAgICAgICAgLy8gQXV0b3BsYXkgc3RhcnRlZCFcbiAgICAgICAgICBjb25zb2xlLmxvZygnRXN0YW1vcyBhbyB2aXZvIScpO1xuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gQXV0b3BsYXkgd2FzIHByZXZlbnRlZC5cbiAgICAgICAgICAvLyBTaG93IGEgXCJQbGF5XCIgYnV0dG9uIHNvIHRoYXQgdXNlciBjYW4gc3RhcnQgcGxheWJhY2suXG4gICAgICAgICAgdGhpcy5wbGF5ID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICBnZXRNdXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tZWRpYSAmJiB0aGlzLm1lZGlhLm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5tZWRpYS5uYXRpdmVFbGVtZW50Lm11dGVkIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0TWF4aW1pemVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFwaSAmJiB0aGlzLmFwaS5mc0FQSSAmJiB0aGlzLmFwaS5mc0FQSS5pc0Z1bGxzY3JlZW4gJiYgdGhpcy5hcGkuZnNBUEkuaXNGdWxsc2NyZWVuIHx8IGZhbHNlO1xuICB9XG5cbiAgdG9nZ2xlU291bmQoKTogdm9pZCB7XG4gICAgdGhpcy5tZWRpYS5uYXRpdmVFbGVtZW50Lm11dGVkID0gIXRoaXMubWVkaWEubmF0aXZlRWxlbWVudC5tdXRlZDtcbiAgfVxuXG4gIHRvZ2dsZU1heGltaXplKCk6IHZvaWQge1xuICAgIHRoaXMuYXBpLmZzQVBJLnRvZ2dsZUZ1bGxzY3JlZW4odGhpcy5tZWRpYSk7XG4gIH1cblxuICBzaG93VmlkZW9Db250cm9scygpOiB2b2lkIHtcbiAgICB0aGlzLmlzSGlkZGVuID0gZmFsc2U7XG4gICAgdGhpcy5pc1Nob3cgPSB0cnVlO1xuICB9XG5cbiAgaGlkZVZpZGVvQ29udHJvbHMoKTogdm9pZCB7XG4gICAgdGhpcy5pc0hpZGRlbiA9IHRydWU7XG4gICAgdGhpcy5pc1Nob3cgPSBmYWxzZTtcbiAgfVxufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2FzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdGhpbmtlci9kZXYvdGhpbmthbS9uZ0Nhc3QvIiwic291cmNlcyI6WyJuZy1jYXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQWdDLE1BQU0sZUFBZSxDQUFDO0FBRWxHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFFNUUsT0FBTyxFQUFFLEtBQUssRUFBaUIsTUFBTSwyQkFBMkIsQ0FBQztBQUVqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFpQmpELE1BQU0sT0FBTyxlQUFlO0lBMEMxQixZQUNVLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBcEM3QixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFFckIsa0JBQWEsR0FBaUI7WUFDckMsSUFBSSxFQUFFLE1BQU07WUFDWixLQUFLLEVBQUUseUJBQXlCO1lBQ2hDLE1BQU0sRUFBRSwyREFBMkQ7U0FDcEUsQ0FBQztRQUVGLFFBQUcsR0FBVSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBRWhCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFJaEIsWUFBTyxHQUFtQjtZQUNqQztnQkFDRSxJQUFJLEVBQUUsTUFBTTtnQkFDWixLQUFLLEVBQUUseUJBQXlCO2dCQUNoQyxNQUFNLEVBQUUsMkRBQTJEO2FBQ3BFO1NBQ0YsQ0FBQztRQUVPLGFBQVEsR0FBdUIsRUFBRSxDQUFDO1FBRWxDLFNBQUksR0FBRyxLQUFLLENBQUM7UUFDYixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFdBQU0sR0FBRyxJQUFJLENBQUM7UUFFZCxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixVQUFLLEdBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7UUFDdkMsZUFBVSxHQUFXLEVBQUUsQ0FBQztJQUk3QixDQUFDO0lBRUwsUUFBUTtRQUNOLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVyQyxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsR0FBRyxVQUFVLFdBQW9CO1lBQ25FLElBQUksV0FBVyxFQUFFO2dCQUNmLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQ25DO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNmLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQVU7UUFDdEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFFZixJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVELFVBQVUsQ0FBQyxNQUFxQjtRQUM5QixRQUFRLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFO1lBQy9CLEtBQUssTUFBTTtnQkFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDL0IsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFcEIsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQzlDLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1NBQ3ZCO1FBRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUMxQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztZQUM5QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztTQUN4QzthQUFNO1lBQ0wsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDZCxPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxQixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDVjtJQUNILENBQUM7SUFFRCxLQUFLO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTFCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzFCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFOUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDOUI7YUFBTTtZQUNMLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDakI7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLE1BQW1CO1FBQzdCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLEdBQUcsR0FBUSxRQUFRLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3hELEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVYLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdkIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBRXpGLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzlDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLFdBQVcsQ0FBQyxDQUFDO1lBRXpDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7WUFDNUIsR0FBRyxDQUFDLGFBQWEsQ0FBQyxHQUFHLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFFeEMsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pCLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtnQkFDekIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO29CQUN0QixvQkFBb0I7b0JBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDbEMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtvQkFDWiwwQkFBMEI7b0JBQzFCLHdEQUF3RDtvQkFDeEQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7Z0JBQ25CLENBQUMsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDO0lBQzNGLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDO0lBQzNHLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO0lBQ25FLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQzs7O1lBbk1GLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsU0FBUztnQkFDbkIsd3dIQUF1Qzs7YUFJeEM7OztZQXRCUSxhQUFhOzs7cUJBd0JuQixTQUFTLFNBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtvQkFDbkMsU0FBUyxTQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7eUJBS3BDLEtBQUs7MkJBQ0wsS0FBSztzQkFDTCxLQUFLOzhCQUNMLEtBQUs7NEJBRUwsS0FBSztzQkFRTCxLQUFLO3FCQUVMLEtBQUs7c0JBRUwsS0FBSzt1QkFRTCxLQUFLO21CQUVMLEtBQUs7dUJBQ0wsS0FBSztxQkFDTCxLQUFLOzJCQUVMLEtBQUs7b0JBQ0wsS0FBSzt5QkFDTCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0NoZWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgTmdDYXN0U2VydmljZSB9IGZyb20gJy4vc2hhcmVkL25nLWNhc3Quc2VydmljZSc7XG5cbmltcG9ydCB7IFZnREFTSCB9IGZyb20gJ3ZpZGVvZ3VsYXIyL2NvbXBpbGVkL3NyYy9zdHJlYW1pbmcvdmctZGFzaC92Zy1kYXNoJztcbmltcG9ydCB7IElEUk1MaWNlbnNlU2VydmVyIH0gZnJvbSAndmlkZW9ndWxhcjIvY29tcGlsZWQvc3JjL3N0cmVhbWluZy9zdHJlYW1pbmcnO1xuaW1wb3J0IHsgVmdBUEksIEJpdHJhdGVPcHRpb24gfSBmcm9tICd2aWRlb2d1bGFyMi9jb21waWxlZC9jb3JlJztcblxuaW1wb3J0IHsgU2NoZWR1bGVEdG8gfSBmcm9tICcuL2R0by9zY2hlZHVsZS1kdG8nO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNZWRpYVN0cmVhbSB7XG4gIHR5cGU6ICd2b2QnIHwgJ2Rhc2gnO1xuICBzb3VyY2U6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgdG9rZW4/OiBzdHJpbmc7XG4gIGxpY2Vuc2VTZXJ2ZXJzPzogSURSTUxpY2Vuc2VTZXJ2ZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25nLWNhc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vbmctY2FzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogW1xuICAgICcuL25nLWNhc3QuY29tcG9uZW50LnNjc3MnXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTmdDYXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdDaGVja2VkIHtcbiAgQFZpZXdDaGlsZChWZ0RBU0gsIHsgc3RhdGljOiBmYWxzZSB9KSB2Z0Rhc2ghOiBWZ0RBU0g7XG4gIEBWaWV3Q2hpbGQoJ21lZGlhJywgeyBzdGF0aWM6IGZhbHNlIH0pIG1lZGlhITogRWxlbWVudFJlZjxIVE1MVmlkZW9FbGVtZW50PjtcblxuICBjYXN0aW5nU3RhdHVzOiBhbnk7XG4gIHdpbmRvdzogYW55O1xuXG4gIEBJbnB1dCgpIHZpZGVvSW1hZ2UgPSAnJztcbiAgQElucHV0KCkgaW1hZ2VPZmZsaW5lID0gZmFsc2U7XG4gIEBJbnB1dCgpIHByZW1pdW0gPSBmYWxzZTtcbiAgQElucHV0KCkgc3JjSW1hZ2VPZmZsaW5lID0gJyc7XG5cbiAgQElucHV0KCkgY3VycmVudFN0cmVhbTogSU1lZGlhU3RyZWFtID0ge1xuICAgIHR5cGU6ICdkYXNoJyxcbiAgICBsYWJlbDogJ0RBU0g6IE1lZGlhIFN0cmVhbSB0ZXN0JyxcbiAgICBzb3VyY2U6ICdodHRwOi8vbGl2ZXNpbS5kYXNoaWYub3JnL2xpdmVzaW0vdGVzdHBpY18ycy9NYW5pZmVzdC5tcGQnXG4gIH07XG5cbiAgYXBpOiBWZ0FQSSA9IG5ldyBWZ0FQSSgpO1xuXG4gIEBJbnB1dCgpIGlzRGVidWcgPSBmYWxzZTtcblxuICBASW5wdXQoKSBwYXVzZWQhOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpIHN0cmVhbXM6IElNZWRpYVN0cmVhbVtdID0gW1xuICAgIHtcbiAgICAgIHR5cGU6ICdkYXNoJyxcbiAgICAgIGxhYmVsOiAnREFTSDogTWVkaWEgU3RyZWFtIHRlc3QnLFxuICAgICAgc291cmNlOiAnaHR0cDovL2xpdmVzaW0uZGFzaGlmLm9yZy9saXZlc2ltL3Rlc3RwaWNfMnMvTWFuaWZlc3QubXBkJ1xuICAgIH1cbiAgXTtcblxuICBASW5wdXQoKSBwbGF5bGlzdDogQXJyYXk8U2NoZWR1bGVEdG8+ID0gW107XG5cbiAgQElucHV0KCkgcGxheSA9IGZhbHNlO1xuICBASW5wdXQoKSBpc0hpZGRlbiA9IGZhbHNlO1xuICBASW5wdXQoKSBpc1Nob3cgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIGN1cnJlbnRJbmRleCA9IDA7XG4gIEBJbnB1dCgpIHZpZGVvOiBTY2hlZHVsZUR0byA9IG5ldyBTY2hlZHVsZUR0bygpO1xuICBASW5wdXQoKSBhcHBCYXNlVXJsOiBTdHJpbmcgPSAnJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG5nQ2FzdFNlcnZpY2U6IE5nQ2FzdFNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLndpbmRvdyA9IHdpbmRvdztcbiAgICB0aGlzLmN1cnJlbnRTdHJlYW0gPSB0aGlzLnN0cmVhbXNbMF07XG5cbiAgICBsZXQgbmdDYXN0U2VydmljZSA9IHRoaXMubmdDYXN0U2VydmljZTtcbiAgICB0aGlzLndpbmRvd1snX19vbkdDYXN0QXBpQXZhaWxhYmxlJ10gPSBmdW5jdGlvbiAoaXNBdmFpbGFibGU6IGJvb2xlYW4pIHtcbiAgICAgIGlmIChpc0F2YWlsYWJsZSkge1xuICAgICAgICBuZ0Nhc3RTZXJ2aWNlLmluaXRpYWxpemVDYXN0QXBpKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuY2FzdGluZ1N0YXR1cyA9IHRoaXMubmdDYXN0U2VydmljZS5nZXRTdGF0dXMoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHsgXG4gICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5nZXRQYXVzZWQoKTtcbiAgICB9LCA1MDApO1xuICB9XG5cbiAgb25QbGF5ZXJSZWFkeShhcGk6IFZnQVBJKSB7XG4gICAgdGhpcy5hcGkgPSBhcGk7XG5cbiAgICB0aGlzLmFwaS5nZXREZWZhdWx0TWVkaWEoKS5zdWJzY3JpcHRpb25zLmVuZGVkLnN1YnNjcmliZSh0aGlzLm5leHRWaWRlby5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHNldEJpdHJhdGUob3B0aW9uOiBCaXRyYXRlT3B0aW9uKSB7XG4gICAgc3dpdGNoICh0aGlzLmN1cnJlbnRTdHJlYW0udHlwZSkge1xuICAgICAgY2FzZSAnZGFzaCc6XG4gICAgICAgIHRoaXMudmdEYXNoLnNldEJpdHJhdGUob3B0aW9uKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgbmV4dFZpZGVvKCkge1xuICAgIHRoaXMuY3VycmVudEluZGV4Kys7XG5cbiAgICBpZiAodGhpcy5jdXJyZW50SW5kZXggPT09IHRoaXMucGxheWxpc3QubGVuZ3RoKSB7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgdGhpcy52aWRlbyA9IHRoaXMucGxheWxpc3RbdGhpcy5jdXJyZW50SW5kZXhdO1xuICB9XG5cbiAgZ2V0UGF1c2VkKCkge1xuICAgIGlmICh0aGlzLm1lZGlhICYmIHRoaXMubWVkaWEubmF0aXZlRWxlbWVudCkge1xuICAgICAgdGhpcy5wYXVzZWQgPSB0aGlzLm1lZGlhLm5hdGl2ZUVsZW1lbnQucGF1c2VkO1xuICAgICAgcmV0dXJuIHRoaXMubWVkaWEubmF0aXZlRWxlbWVudC5wYXVzZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYXVzZWQoKTtcbiAgICAgIH0sIDIwMDApO1xuICAgIH1cbiAgfVxuXG4gIHBhdXNlKCk6IHZvaWQge1xuICAgIHRoaXMubWVkaWEubmF0aXZlRWxlbWVudC5wYXVzZSgpO1xuICAgIHRoaXMuZ2V0UGF1c2VkKCk7XG4gIH1cblxuICBvcGVuU2Vzc2lvbigpIHtcbiAgICB0aGlzLm5nQ2FzdFNlcnZpY2UuZGlzY292ZXJEZXZpY2VzKCk7XG4gIH1cblxuICBjbG9zZVNlc3Npb24oKSB7XG4gICAgdGhpcy5uZ0Nhc3RTZXJ2aWNlLmRpc2NvdmVyRGV2aWNlcygpO1xuICB9XG5cbiAgdHJ5QWdhaW4oKSB7XG4gICAgdGhpcy5pbWFnZU9mZmxpbmUgPSB0cnVlO1xuICAgIHRoaXMuaXNIaWRkZW4gPSB0cnVlO1xuICAgIGNvbnNvbGUubG9nKCdsb2FkaW5nLi4uJyk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZ2V0VmlkZW9zKCk7XG4gICAgfSwgNTAwKTtcbiAgfVxuXG4gIGdldFZpZGVvcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wbGF5bGlzdCAmJiB0aGlzLnBsYXlsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuaW1hZ2VPZmZsaW5lID0gZmFsc2U7XG4gICAgICB0aGlzLnZpZGVvID0gdGhpcy5wbGF5bGlzdFt0aGlzLmN1cnJlbnRJbmRleF07XG5cbiAgICAgIHRoaXMuZ2V0UG9zaXRpb24odGhpcy52aWRlbyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmlkZW8gPSBuZXcgU2NoZWR1bGVEdG8oKTtcbiAgICAgIHRoaXMudHJ5QWdhaW4oKTtcbiAgICB9XG4gIH1cblxuICBnZXRQb3NpdGlvbihyZXN1bHQ6IFNjaGVkdWxlRHRvKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBsZXQgdmlkOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlkZW9fZWxlbWVudCcpO1xuICAgICAgdmlkLmxvYWQoKTtcblxuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gTWF0aC5hYnMobm93LmdldFRpbWUoKSAtIG5ldyBEYXRlKHRoaXMudmlkZW8uYWN0dWFsU3RhcnQpLmdldFRpbWUoKSk7XG5cbiAgICAgIGNvbnNvbGUubG9nKCdUZW1vcyBubyBwbGF5ZXI6ICcgKyByZXN1bHQudXJsKTtcbiAgICAgIGNvbnNvbGUubG9nKCdJbsOtY2lvIGVtOiAnICsgY3VycmVudFRpbWUpO1xuXG4gICAgICB0aGlzLnZpZGVvLnVybCA9IHJlc3VsdC51cmw7XG4gICAgICB2aWRbJ2N1cnJlbnRUaW1lJ10gPSBjdXJyZW50VGltZSAvIDEwMDA7XG5cbiAgICAgIGxldCBwcm9taXNlID0gdmlkLnBsYXkoKTtcbiAgICAgIGlmIChwcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJvbWlzZS50aGVuKChfOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBBdXRvcGxheSBzdGFydGVkIVxuICAgICAgICAgIGNvbnNvbGUubG9nKCdFc3RhbW9zIGFvIHZpdm8hJyk7XG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAvLyBBdXRvcGxheSB3YXMgcHJldmVudGVkLlxuICAgICAgICAgIC8vIFNob3cgYSBcIlBsYXlcIiBidXR0b24gc28gdGhhdCB1c2VyIGNhbiBzdGFydCBwbGF5YmFjay5cbiAgICAgICAgICB0aGlzLnBsYXkgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LCAxMDAwKTtcbiAgfVxuXG4gIGdldE11dGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1lZGlhICYmIHRoaXMubWVkaWEubmF0aXZlRWxlbWVudCAmJiB0aGlzLm1lZGlhLm5hdGl2ZUVsZW1lbnQubXV0ZWQgfHwgZmFsc2U7XG4gIH1cblxuICBnZXRNYXhpbWl6ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYXBpICYmIHRoaXMuYXBpLmZzQVBJICYmIHRoaXMuYXBpLmZzQVBJLmlzRnVsbHNjcmVlbiAmJiB0aGlzLmFwaS5mc0FQSS5pc0Z1bGxzY3JlZW4gfHwgZmFsc2U7XG4gIH1cblxuICB0b2dnbGVTb3VuZCgpOiB2b2lkIHtcbiAgICB0aGlzLm1lZGlhLm5hdGl2ZUVsZW1lbnQubXV0ZWQgPSAhdGhpcy5tZWRpYS5uYXRpdmVFbGVtZW50Lm11dGVkO1xuICB9XG5cbiAgdG9nZ2xlTWF4aW1pemUoKTogdm9pZCB7XG4gICAgdGhpcy5hcGkuZnNBUEkudG9nZ2xlRnVsbHNjcmVlbih0aGlzLm1lZGlhKTtcbiAgfVxuXG4gIHNob3dWaWRlb0NvbnRyb2xzKCk6IHZvaWQge1xuICAgIHRoaXMuaXNIaWRkZW4gPSBmYWxzZTtcbiAgICB0aGlzLmlzU2hvdyA9IHRydWU7XG4gIH1cblxuICBoaWRlVmlkZW9Db250cm9scygpOiB2b2lkIHtcbiAgICB0aGlzLmlzSGlkZGVuID0gdHJ1ZTtcbiAgICB0aGlzLmlzU2hvdyA9IGZhbHNlO1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/dist/fesm2015/thinkam.net-ng-cast.js b/dist/fesm2015/thinkam.net-ng-cast.js index fbc7590..5b66e92 100644 --- a/dist/fesm2015/thinkam.net-ng-cast.js +++ b/dist/fesm2015/thinkam.net-ng-cast.js @@ -148,7 +148,6 @@ class NgCastComponent { }; this.api = new VgAPI(); this.isDebug = false; - this.paused = false; this.streams = [ { type: 'dash', @@ -175,6 +174,11 @@ class NgCastComponent { }; this.castingStatus = this.ngCastService.getStatus(); } + ngAfterViewChecked() { + setInterval(() => { + this.getPaused(); + }, 500); + } onPlayerReady(api) { this.api = api; this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this)); @@ -280,8 +284,8 @@ class NgCastComponent { NgCastComponent.decorators = [ { type: Component, args: [{ selector: 'ng-cast', - template: "
\n \n \n \n \n \n
\n \n \n
AGORA
\n
\n
\n \n \n \n \n
\n
\n \n \"TV\n \n\n\n
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", - styles: ["#video-container{background-color:#272c34;margin:0 auto;z-index:-1}#video-container vg-scrub-bar-current-time .background{background-color:red}#video-container .hidden{display:none}#video-container .show{display:block}#video-container .video-controls{background:rgba(0,0,0,.5);bottom:0;height:45px;left:0;position:absolute;right:0;transition:all .2s ease}#video-container .video-controls.hide{opacity:0;pointer-events:none}#video-container .video-progress{align-items:right;height:8.4px;position:relative}#video-container .video-progress #seek-tooltip{position:absolute}@media screen and (-webkit-min-device-pixel-ratio:0){#video-container .video-progress input[type=range]{-webkit-appearance:none;background-color:var(--youtube-red);overflow:hidden}#video-container .video-progress input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;color:var(--youtube-red);height:10px;margin-top:-1px}#video-container .video-progress input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--youtube-red);cursor:ew-resize;height:10px;width:10px}}#video-container .video-progress input[type=range]{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-moz-range-progress,#video-container .video-progress input[type=range]::-moz-range-track{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-ms-fill-lower,#video-container .video-progress input[type=range]::-ms-fill-upper{background-color:var(--youtube-red)}#video-container progress{-moz-appearance:none;-webkit-appearance:none;appearance:none;border-radius:2px;height:.5vh;pointer-events:none;position:absolute;top:0;width:100%}#video-container .buttons .video-control{align-items:center;background:none;border:2px solid #fff;border-radius:16px;color:#fff;display:flex;height:32px;justify-content:center;width:32px}#video-container .buttons .video-control i{color:#fff;line-height:16px}#video-container .buttons .video-control-paused{bottom:8px;left:1vw;position:absolute;z-index:1000}#video-container .buttons .video-control-muted{bottom:8px;position:absolute;right:5vw;z-index:1000}#video-container .buttons .video-control-maximized{bottom:8px;position:absolute;right:1vw;z-index:1000}#video-container progress::-webkit-progress-bar{background-color:var(--youtube-red);border-radius:2px}#video-container progress::-webkit-progress-value{background:#fff;border-radius:2px}#video-container progress::-moz-progress-bar{background:#fff;border:1px solid #fff}#video-container .seek{cursor:pointer;height:.5vh;margin:0;position:absolute;top:0;width:100%}#video-container .seek-tooltip{background-color:var(--youtube-red);color:#fff;content:attr(data-title);display:block;font-size:12px;font-weight:700;margin-left:5vw;padding:3px;position:absolute;top:10px}.playlist-item li{color:#fff}.kt-content.kt-grid__item.kt-grid__item--fluid.kt-grid.kt-grid--hor{background-color:#272c34}#kt_header_menu_wrapper{display:none}.kt-header__bottom{display:none!important}.player-wrapper{margin:auto;max-width:500px}.player-wrapper video{width:100%}ul{padding:0}ul li.playlist-item{background:#673ab7;cursor:pointer;list-style:none;margin-bottom:2px;padding:10px}ul li.playlist-item.selected{background-color:#ccc}body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] + template: "
\n \n \n \n \n \n
\n \n \n
AGORA
\n
\n
\n \n \n \n \n
\n
\n \n \"TV\n \n\n\n
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n", + styles: ["#video-container{background-color:#272c34;margin:0 auto;z-index:-1}#video-container vg-scrub-bar-current-time .background{background-color:red}#video-container .hidden{display:none}#video-container .show{display:block}#video-container .video-controls{background:rgba(0,0,0,.5);bottom:0;height:45px;left:0;position:absolute;right:0;transition:all .2s ease}#video-container .video-controls.hide{opacity:0;pointer-events:none}#video-container .video-progress{align-items:right;height:8.4px;position:relative}#video-container .video-progress #seek-tooltip{position:absolute}@media screen and (-webkit-min-device-pixel-ratio:0){#video-container .video-progress input[type=range]{-webkit-appearance:none;background-color:var(--youtube-red);overflow:hidden}#video-container .video-progress input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;color:var(--youtube-red);height:10px;margin-top:-1px}#video-container .video-progress input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--youtube-red);cursor:ew-resize;height:10px;width:10px}}#video-container .video-progress input[type=range]{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-moz-range-progress,#video-container .video-progress input[type=range]::-moz-range-track{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-ms-fill-lower,#video-container .video-progress input[type=range]::-ms-fill-upper{background-color:var(--youtube-red)}#video-container progress{-moz-appearance:none;-webkit-appearance:none;appearance:none;border-radius:2px;height:.5vh;pointer-events:none;position:absolute;top:0;width:100%}#video-container .buttons .video-control{align-items:center;background:none;border:2px solid #fff;border-radius:16px;color:#fff;display:flex;height:32px;justify-content:center;width:32px}#video-container .buttons .video-control i{color:#fff;line-height:16px}#video-container .buttons .video-control-paused{bottom:8px;left:1vw;position:absolute;z-index:1000}#video-container .buttons .video-control-muted{bottom:8px;position:absolute;right:5vw;z-index:1000}#video-container .buttons .video-control-maximized{bottom:8px;position:absolute;right:1vw;z-index:1000}#video-container progress::-webkit-progress-bar{background-color:var(--youtube-red);border-radius:2px}#video-container progress::-webkit-progress-value{background:#fff;border-radius:2px}#video-container progress::-moz-progress-bar{background:#fff;border:1px solid #fff}#video-container .seek{cursor:pointer;height:.5vh;margin:0;position:absolute;top:0;width:100%}#video-container .seek-tooltip{background-color:var(--youtube-red);color:#fff;content:attr(data-title);display:block;font-size:12px;font-weight:700;margin-left:5vw;padding:3px;position:absolute;top:10px}.playlist-item li{color:#fff}.kt-content.kt-grid__item.kt-grid__item--fluid.kt-grid.kt-grid--hor{background-color:#272c34}#kt_header_menu_wrapper{display:none}.kt-header__bottom{display:none!important}.player-wrapper{margin:auto;max-width:500px}.player-wrapper video{width:100%}ul{padding:0}ul li.playlist-item{background:#673ab7;cursor:pointer;list-style:none;margin-bottom:2px;padding:10px}ul li.playlist-item.selected{background-color:#ccc}body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);display:none;height:540px;margin-bottom:0;margin-right:0;margin-top:0;position:absolute;width:100%;z-index:0}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"] },] } ]; NgCastComponent.ctorParameters = () => [ diff --git a/dist/fesm2015/thinkam.net-ng-cast.js.map b/dist/fesm2015/thinkam.net-ng-cast.js.map index a494e6f..fa92902 100644 --- a/dist/fesm2015/thinkam.net-ng-cast.js.map +++ b/dist/fesm2015/thinkam.net-ng-cast.js.map @@ -1 +1 @@ -{"version":3,"file":"thinkam.net-ng-cast.js","sources":["../../shared/ng-cast.service.ts","../../dto/schedule-dto.ts","../../ng-cast.component.ts","../../ng.cast.module.ts","../../cast-videos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeCastPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n globalThis.CastPlayer.setupRemotePlayer();\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { TenantDto } from './tenant-dto';\n\nexport interface IScheduleDto {\n id: string | undefined;\n tenant: TenantDto | undefined;\n name: string | undefined;\n description: string | undefined;\n url: string | undefined;\n duration: number | undefined;\n actualStart: Date;\n realEnd?: Date | undefined;\n isActive: boolean | undefined;\n}\n\nexport class ScheduleDto implements IScheduleDto {\n id: string | undefined;\n tenant: TenantDto | undefined;\n name: string | undefined;\n description: string | undefined;\n url: string | undefined;\n duration: number | undefined;\n actualStart!: Date;\n realEnd?: Date | undefined;\n isActive: boolean | undefined;\n\n constructor(data?: IScheduleDto) {\n if (data) {\n for (let property in data) {\n if (data.hasOwnProperty(property)) {\n (this)[property] = (data)[property];\n }\n }\n }\n }\n\n static fromJS(data: any): ScheduleDto {\n data = typeof data === 'object' ? data : {};\n let result = new ScheduleDto();\n result.init(data);\n return result;\n }\n\n init(data?: any) {\n if (data) {\n this.id = data['id'];\n this.tenant = data['tenant'];\n this.name = data['name'];\n this.description = data['description'];\n this.url = data['url'];\n this.duration = data['duration'];\n this.actualStart = data['actualStart'];\n this.realEnd = data['realEnd'];\n this.isActive = data['isActive'];\n }\n }\n\n toJSON(data?: any) {\n data = typeof data === 'object' ? data : {};\n data['id'] = this.id;\n data['tenant'] = this.tenant;\n data['name'] = this.name;\n data['description'] = this.description;\n data['url'] = this.url;\n data['duration'] = this.duration;\n data['actualStart'] = this.actualStart;\n data['realEnd'] = this.realEnd;\n data['isActive'] = this.isActive;\n return data;\n }\n}\n","import { Component, Input, OnInit, ViewChild, ElementRef } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\nimport { VgDASH } from 'videogular2/compiled/src/streaming/vg-dash/vg-dash';\nimport { IDRMLicenseServer } from 'videogular2/compiled/src/streaming/streaming';\nimport { VgAPI, BitrateOption } from 'videogular2/compiled/core';\n\nimport { ScheduleDto } from './dto/schedule-dto';\n\nexport interface IMediaStream {\n type: 'vod' | 'dash';\n source: string;\n label: string;\n token?: string;\n licenseServers?: IDRMLicenseServer;\n}\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit {\n @ViewChild(VgDASH, { static: false }) vgDash!: VgDASH;\n @ViewChild('media', { static: false }) media!: ElementRef;\n\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() premium = false;\n @Input() srcImageOffline = '';\n\n @Input() currentStream: IMediaStream = {\n type: 'dash',\n label: 'DASH: Media Stream test',\n source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd'\n };\n\n api: VgAPI = new VgAPI();\n\n @Input() isDebug = false;\n\n @Input() paused = false;\n\n @Input() streams: IMediaStream[] = [\n {\n type: 'dash',\n label: 'DASH: Media Stream test',\n source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd'\n }\n ];\n\n @Input() playlist: Array = [];\n\n @Input() play = false;\n @Input() isHidden = false;\n @Input() isShow = true;\n\n @Input() currentIndex = 0;\n @Input() video: ScheduleDto = new ScheduleDto();\n @Input() appBaseUrl: String = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n this.currentStream = this.streams[0];\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n onPlayerReady(api: VgAPI) {\n this.api = api;\n\n this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this));\n }\n\n setBitrate(option: BitrateOption) {\n switch (this.currentStream.type) {\n case 'dash':\n this.vgDash.setBitrate(option);\n break;\n }\n }\n\n nextVideo() {\n this.currentIndex++;\n\n if (this.currentIndex === this.playlist.length) {\n this.currentIndex = 0;\n }\n\n this.video = this.playlist[this.currentIndex];\n }\n\n getPaused() {\n if (this.media && this.media.nativeElement) {\n this.paused = this.media.nativeElement.paused;\n return this.media.nativeElement.paused;\n } else {\n setTimeout(() => {\n return this.getPaused();\n }, 2000);\n }\n }\n\n pause(): void {\n this.media.nativeElement.pause();\n this.getPaused();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n tryAgain() {\n this.imageOffline = true;\n this.isHidden = true;\n console.log('loading...');\n\n setTimeout(() => {\n this.getVideos();\n }, 500);\n }\n\n getVideos(): void {\n if (this.playlist && this.playlist.length > 0) {\n this.imageOffline = false;\n this.video = this.playlist[this.currentIndex];\n\n this.getPosition(this.video);\n } else {\n this.video = new ScheduleDto();\n this.tryAgain();\n }\n }\n\n getPosition(result: ScheduleDto) {\n setTimeout(() => {\n let vid: any = document.getElementById('video_element');\n vid.load();\n\n const now = new Date();\n const currentTime = Math.abs(now.getTime() - new Date(this.video.actualStart).getTime());\n\n console.log('Temos no player: ' + result.url);\n console.log('Início em: ' + currentTime);\n\n this.video.url = result.url;\n vid['currentTime'] = currentTime / 1000;\n\n let promise = vid.play();\n if (promise !== undefined) {\n promise.then((_: any) => {\n // Autoplay started!\n console.log('Estamos ao vivo!');\n }).catch(() => {\n // Autoplay was prevented.\n // Show a \"Play\" button so that user can start playback.\n this.play = true;\n });\n }\n }, 1000);\n }\n\n getMuted(): boolean {\n return this.media && this.media.nativeElement && this.media.nativeElement.muted || false;\n }\n\n getMaximized(): boolean {\n return this.api && this.api.fsAPI && this.api.fsAPI.isFullscreen && this.api.fsAPI.isFullscreen || false;\n }\n\n toggleSound(): void {\n this.media.nativeElement.muted = !this.media.nativeElement.muted;\n }\n\n toggleMaximize(): void {\n this.api.fsAPI.toggleFullscreen(this.media);\n }\n\n showVideoControls(): void {\n this.isHidden = false;\n this.isShow = true;\n }\n\n hideVideoControls(): void {\n this.isHidden = true;\n this.isShow = false;\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\nimport { VgCoreModule } from 'videogular2/compiled/core';\nimport { VgControlsModule } from 'videogular2/compiled/controls';\nimport { VgStreamingModule } from 'videogular2/compiled/streaming';\nimport { VgBufferingModule } from 'videogular2/compiled/buffering';\nimport { VgOverlayPlayModule } from 'videogular2/compiled/overlay-play';\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule,\n VgCoreModule,\n VgControlsModule,\n VgStreamingModule,\n VgBufferingModule,\n VgOverlayPlayModule,\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = () => {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n if (typeof localPlayer.stop === \"function\")\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"thinkam.net-ng-cast.js","sources":["../../shared/ng-cast.service.ts","../../dto/schedule-dto.ts","../../ng-cast.component.ts","../../ng.cast.module.ts","../../cast-videos.js","../../thinkam.net-ng-cast.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { Subject } from 'rxjs';\n\ndeclare global {\n var CastPlayer: any;\n}\n\n@Injectable()\nexport class NgCastService {\n private cast: any;\n private currentMedia: any;\n private window: any = window;\n\n public status = {\n casting: false\n };\n\n constructor() {\n globalThis.CastPlayer.mediaJSON = {\n categories: []\n };\n }\n\n initializeCastApi() {\n this.cast = this.window['chrome'].cast;\n let sessionRequest = new this.cast.SessionRequest('4F8B3483');\n let apiConfig = new this.cast.ApiConfig(sessionRequest,\n () => { },\n (status: any) => { if (status === this.cast.ReceiverAvailability.AVAILABLE) { } }\n );\n let x = this.cast.initialize(apiConfig, this.onInitSuccess, this.onError);\n };\n\n onInitSuccess = function () {\n console.log('GCast initialization success');\n };\n\n onError = function (err: any) {\n console.log('GCast initialization failed', err);\n };\n\n discoverDevices = () => {\n let self: any = this;\n let subj = new Subject();\n this.cast.requestSession((s: any) => {\n self.session = s;\n self.setCasting(true);\n subj.next('CONNECTED');\n }, function (err: any) {\n self.setCasting(false);\n if (err.code === 'cancel') {\n self.session = undefined;\n subj.next('CANCEL');\n } else {\n console.error('Error selecting a cast device', err);\n }\n });\n return subj;\n };\n\n onMediaDiscovered = (categories: any[]) => {\n let script = window['document'].createElement('script');\n script.setAttribute('type', 'text/javascript');\n script.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1');\n window['document'].body.appendChild(script);\n\n globalThis.CastPlayer.mediaJSON.categories = categories;\n\n return globalThis.CastPlayer.addMediaContents();\n };\n\n initialize(mediaContents: any): void {\n if (mediaContents) {\n globalThis.CastPlayer.initializeUI();\n globalThis.CastPlayer.setupLocalPlayer();\n globalThis.CastPlayer.initializeCastPlayer();\n }\n }\n\n play = () => {\n this.currentMedia.play(null);\n };\n\n pause = () => {\n this.currentMedia.pause(null);\n };\n\n stop = () => {\n this.currentMedia.stop(null);\n };\n\n onMediaError = (err: any) => {\n console.error('Error launching media', err);\n };\n\n setCasting(value: any) {\n this.status.casting = value;\n globalThis.CastPlayer.setupRemotePlayer();\n }\n\n getStatus() {\n return this.status\n }\n}\n","import { TenantDto } from './tenant-dto';\n\nexport interface IScheduleDto {\n id: string | undefined;\n tenant: TenantDto | undefined;\n name: string | undefined;\n description: string | undefined;\n url: string | undefined;\n duration: number | undefined;\n actualStart: Date;\n realEnd?: Date | undefined;\n isActive: boolean | undefined;\n}\n\nexport class ScheduleDto implements IScheduleDto {\n id: string | undefined;\n tenant: TenantDto | undefined;\n name: string | undefined;\n description: string | undefined;\n url: string | undefined;\n duration: number | undefined;\n actualStart!: Date;\n realEnd?: Date | undefined;\n isActive: boolean | undefined;\n\n constructor(data?: IScheduleDto) {\n if (data) {\n for (let property in data) {\n if (data.hasOwnProperty(property)) {\n (this)[property] = (data)[property];\n }\n }\n }\n }\n\n static fromJS(data: any): ScheduleDto {\n data = typeof data === 'object' ? data : {};\n let result = new ScheduleDto();\n result.init(data);\n return result;\n }\n\n init(data?: any) {\n if (data) {\n this.id = data['id'];\n this.tenant = data['tenant'];\n this.name = data['name'];\n this.description = data['description'];\n this.url = data['url'];\n this.duration = data['duration'];\n this.actualStart = data['actualStart'];\n this.realEnd = data['realEnd'];\n this.isActive = data['isActive'];\n }\n }\n\n toJSON(data?: any) {\n data = typeof data === 'object' ? data : {};\n data['id'] = this.id;\n data['tenant'] = this.tenant;\n data['name'] = this.name;\n data['description'] = this.description;\n data['url'] = this.url;\n data['duration'] = this.duration;\n data['actualStart'] = this.actualStart;\n data['realEnd'] = this.realEnd;\n data['isActive'] = this.isActive;\n return data;\n }\n}\n","import { Component, Input, OnInit, ViewChild, ElementRef, AfterViewChecked } from '@angular/core';\n\nimport { NgCastService } from './shared/ng-cast.service';\n\nimport { VgDASH } from 'videogular2/compiled/src/streaming/vg-dash/vg-dash';\nimport { IDRMLicenseServer } from 'videogular2/compiled/src/streaming/streaming';\nimport { VgAPI, BitrateOption } from 'videogular2/compiled/core';\n\nimport { ScheduleDto } from './dto/schedule-dto';\n\nexport interface IMediaStream {\n type: 'vod' | 'dash';\n source: string;\n label: string;\n token?: string;\n licenseServers?: IDRMLicenseServer;\n}\n\n@Component({\n selector: 'ng-cast',\n templateUrl: './ng-cast.component.html',\n styleUrls: [\n './ng-cast.component.scss'\n ]\n})\nexport class NgCastComponent implements OnInit, AfterViewChecked {\n @ViewChild(VgDASH, { static: false }) vgDash!: VgDASH;\n @ViewChild('media', { static: false }) media!: ElementRef;\n\n castingStatus: any;\n window: any;\n\n @Input() videoImage = '';\n @Input() imageOffline = false;\n @Input() premium = false;\n @Input() srcImageOffline = '';\n\n @Input() currentStream: IMediaStream = {\n type: 'dash',\n label: 'DASH: Media Stream test',\n source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd'\n };\n\n api: VgAPI = new VgAPI();\n\n @Input() isDebug = false;\n\n @Input() paused!: boolean;\n\n @Input() streams: IMediaStream[] = [\n {\n type: 'dash',\n label: 'DASH: Media Stream test',\n source: 'http://livesim.dashif.org/livesim/testpic_2s/Manifest.mpd'\n }\n ];\n\n @Input() playlist: Array = [];\n\n @Input() play = false;\n @Input() isHidden = false;\n @Input() isShow = true;\n\n @Input() currentIndex = 0;\n @Input() video: ScheduleDto = new ScheduleDto();\n @Input() appBaseUrl: String = '';\n\n constructor(\n private ngCastService: NgCastService\n ) { }\n\n ngOnInit() {\n this.window = window;\n this.currentStream = this.streams[0];\n\n let ngCastService = this.ngCastService;\n this.window['__onGCastApiAvailable'] = function (isAvailable: boolean) {\n if (isAvailable) {\n ngCastService.initializeCastApi();\n }\n };\n\n this.castingStatus = this.ngCastService.getStatus();\n }\n\n ngAfterViewChecked() { \n setInterval(() => {\n this.getPaused();\n }, 500);\n }\n\n onPlayerReady(api: VgAPI) {\n this.api = api;\n\n this.api.getDefaultMedia().subscriptions.ended.subscribe(this.nextVideo.bind(this));\n }\n\n setBitrate(option: BitrateOption) {\n switch (this.currentStream.type) {\n case 'dash':\n this.vgDash.setBitrate(option);\n break;\n }\n }\n\n nextVideo() {\n this.currentIndex++;\n\n if (this.currentIndex === this.playlist.length) {\n this.currentIndex = 0;\n }\n\n this.video = this.playlist[this.currentIndex];\n }\n\n getPaused() {\n if (this.media && this.media.nativeElement) {\n this.paused = this.media.nativeElement.paused;\n return this.media.nativeElement.paused;\n } else {\n setTimeout(() => {\n return this.getPaused();\n }, 2000);\n }\n }\n\n pause(): void {\n this.media.nativeElement.pause();\n this.getPaused();\n }\n\n openSession() {\n this.ngCastService.discoverDevices();\n }\n\n closeSession() {\n this.ngCastService.discoverDevices();\n }\n\n tryAgain() {\n this.imageOffline = true;\n this.isHidden = true;\n console.log('loading...');\n\n setTimeout(() => {\n this.getVideos();\n }, 500);\n }\n\n getVideos(): void {\n if (this.playlist && this.playlist.length > 0) {\n this.imageOffline = false;\n this.video = this.playlist[this.currentIndex];\n\n this.getPosition(this.video);\n } else {\n this.video = new ScheduleDto();\n this.tryAgain();\n }\n }\n\n getPosition(result: ScheduleDto) {\n setTimeout(() => {\n let vid: any = document.getElementById('video_element');\n vid.load();\n\n const now = new Date();\n const currentTime = Math.abs(now.getTime() - new Date(this.video.actualStart).getTime());\n\n console.log('Temos no player: ' + result.url);\n console.log('Início em: ' + currentTime);\n\n this.video.url = result.url;\n vid['currentTime'] = currentTime / 1000;\n\n let promise = vid.play();\n if (promise !== undefined) {\n promise.then((_: any) => {\n // Autoplay started!\n console.log('Estamos ao vivo!');\n }).catch(() => {\n // Autoplay was prevented.\n // Show a \"Play\" button so that user can start playback.\n this.play = true;\n });\n }\n }, 1000);\n }\n\n getMuted(): boolean {\n return this.media && this.media.nativeElement && this.media.nativeElement.muted || false;\n }\n\n getMaximized(): boolean {\n return this.api && this.api.fsAPI && this.api.fsAPI.isFullscreen && this.api.fsAPI.isFullscreen || false;\n }\n\n toggleSound(): void {\n this.media.nativeElement.muted = !this.media.nativeElement.muted;\n }\n\n toggleMaximize(): void {\n this.api.fsAPI.toggleFullscreen(this.media);\n }\n\n showVideoControls(): void {\n this.isHidden = false;\n this.isShow = true;\n }\n\n hideVideoControls(): void {\n this.isHidden = true;\n this.isShow = false;\n }\n}\n","import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgCastComponent } from './ng-cast.component';\nimport { NgCastService } from './shared/ng-cast.service';\n\nimport { VgCoreModule } from 'videogular2/compiled/core';\nimport { VgControlsModule } from 'videogular2/compiled/controls';\nimport { VgStreamingModule } from 'videogular2/compiled/streaming';\nimport { VgBufferingModule } from 'videogular2/compiled/buffering';\nimport { VgOverlayPlayModule } from 'videogular2/compiled/overlay-play';\n\n@NgModule({\n schemas: [ CUSTOM_ELEMENTS_SCHEMA ],\n imports: [\n CommonModule,\n VgCoreModule,\n VgControlsModule,\n VgStreamingModule,\n VgBufferingModule,\n VgOverlayPlayModule,\n ],\n exports: [NgCastComponent],\n providers: [NgCastService],\n declarations: [NgCastComponent]\n})\nexport class NgCastModule { }\n","\"use strict\";\n\n/** @const {string} Media source root URL */\nconst MEDIA_SOURCE_ROOT = '';\n\n/**\n * Width of progress bar in pixel\n * @const\n */\nvar PROGRESS_BAR_WIDTH = 600;\n\n/** @const {number} Time in milliseconds for minimal progress update */\nvar TIMER_STEP = 1000;\n\n/** @const {number} Cast volume upon initial connection */\nvar DEFAULT_VOLUME = 0.5;\n\n/** @const {number} Height, in pixels, of volume bar */\nvar FULL_VOLUME_HEIGHT = 100;\n\n/** @enum {string} Constants of states for media for both local and remote playback */\nconst PLAYER_STATE = {\n // No media is loaded into the player. For remote playback, maps to\n // the PlayerState.IDLE state.\n IDLE: 'IDLE',\n LOADING: 'LOADING',\n // Player is in PLAY mode but not actively playing content. For remote\n // playback, maps to the PlayerState.BUFFERING state.\n BUFFERING: 'BUFFERING',\n // The media is loaded but not playing.\n LOADED: 'LOADED',\n // The media is playing. For remote playback, maps to the PlayerState.PLAYING state.\n PLAYING: 'PLAYING',\n // The media is paused. For remote playback, maps to the PlayerState.PAUSED state.\n PAUSED: 'PAUSED',\n STOPPED: 'STOPPED',\n ERROR: 'ERROR'\n};\n\n/**\n * Cast player object\n * Main variables:\n * - PlayerHandler object for handling media playback\n * - Cast player variables for controlling Cast mode media playback\n * - Current media variables for transition between Cast and local modes\n * - Current ad variables for controlling UI based on ad playback\n * - Current live variables for controlling UI based on ad playback\n * @struct @constructor\n */\nvar CastPlayer = function () {\n /** @type {PlayerHandler} Delegation proxy for media playback */\n this.playerHandler = new PlayerHandler(this);\n\n /** @type {PLAYER_STATE} A state for media playback */\n this.playerState = PLAYER_STATE.IDLE;\n\n /**\n * @type {PLAYER_STATE} Player state before switching between local and\n * remote playback.\n */\n this.playerStateBeforeSwitch = null;\n\n /* Cast player variables */\n /** @type {cast.framework.RemotePlayer} */\n this.remotePlayer = null;\n /** @type {cast.framework.RemotePlayerController} */\n this.remotePlayerController = null;\n\n /* Local+Remote player variables */\n /** @type {number} A number for current time in seconds. Maintained in media time. */\n this.currentMediaTime = 0;\n /**\n * @type {?number} A number for current duration in seconds. Maintained in media time.\n * Null if duration should not be shown.\n */\n this.mediaDuration = -1;\n\n /** @type {?number} A timer for tracking progress of media */\n this.timer = null;\n /** @type {function()} Listener for handling current time increments */\n this.incrementMediaTimeHandler = this.incrementMediaTime.bind(this);\n /** @type {function()} Listener to be added/removed for the seek action */\n this.seekMediaListener = this.seekMedia.bind(this);\n\n /* Local player variables */\n /** @type {number} A number for current media index */\n this.currentMediaIndex = 0;\n /** @type {?Object} media contents from JSON */\n this.mediaContents = null;\n /** @type {boolean} Fullscreen mode on/off */\n this.fullscreen = false;\n\n /* Remote Player variables */\n /** @type {?chrome.cast.media.MediaInfo} Current mediaInfo */\n this.mediaInfo = null;\n /* Ad variables */\n /**\n * @type {?number} The time in seconds when the break clip becomes skippable.\n * 5 means that the end user can skip this break clip after 5 seconds. If\n * negative or not defined, it means that the current break clip is not skippable.\n */\n this.whenSkippable = null;\n\n /* Live variables */\n /** @type {?chrome.cast.media.LiveSeekableRange} Seekable range for live content */\n this.liveSeekableRange = null;\n /** @type {boolean} Remote player is playing live content. */\n this.isLiveContent = false;\n\n this.mediaJSON = {\n 'categories': []\n };\n};\n\nCastPlayer.prototype.initializeCastPlayer = () => {\n var options = {};\n\n // Set the receiver application ID to your own (created in the\n // Google Cast Developer Console), or optionally\n // use the chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID\n options.receiverApplicationId = '4F8B3483';\n\n // Auto join policy can be one of the following three:\n // ORIGIN_SCOPED - Auto connect from same appId and page origin\n // TAB_AND_ORIGIN_SCOPED - Auto connect from same appId, page origin, and tab\n // PAGE_SCOPED - No auto connect\n options.autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED;\n\n cast.framework.CastContext.getInstance().setOptions(options);\n\n castPlayer.remotePlayer = new cast.framework.RemotePlayer();\n castPlayer.remotePlayerController = new cast.framework.RemotePlayerController(castPlayer.remotePlayer);\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED,\n castPlayer.switchPlayer.bind(castPlayer)\n );\n};\n\n/**\n * Switch between the remote and local players.\n */\nCastPlayer.prototype.switchPlayer = () => {\n castPlayer.stopProgressTimer();\n castPlayer.resetVolumeSlider();\n castPlayer.playerHandler.stop();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n if (cast && cast.framework) {\n if (castPlayer.remotePlayer.isConnected) {\n castPlayer.setupRemotePlayer();\n return;\n }\n }\n castPlayer.setupLocalPlayer();\n};\n\n/**\n * PlayerHandler\n *\n * This is a handler through which the application will interact\n * with both the RemotePlayer and LocalPlayer. Combining these two into\n * one interface is one approach to the dual-player nature of a Cast\n * Chrome application. Otherwise, the state of the RemotePlayer can be\n * queried at any time to decide whether to interact with the local\n * or remote players.\n *\n * To set the player used, implement the following methods for a target object\n * and call setTarget(target).\n *\n * Methods to implement:\n * - play()\n * - pause()\n * - stop()\n * - seekTo(time)\n * - load(mediaIndex)\n * - isMediaLoaded(mediaIndex)\n * - prepareToPlay()\n * - getMediaDuration()\n * - getCurrentMediaTime()\n * - setVolume(volumeSliderPosition)\n * - mute()\n * - unMute()\n * - isMuted()\n * - updateDisplay()\n * - updateCurrentTimeDisplay()\n * - updateDurationDisplay()\n * - setTimeString(element, time)\n */\nvar PlayerHandler = function (castPlayer) {\n this.target = {};\n\n this.setTarget = function (target) {\n this.target = target;\n };\n\n this.play = function () {\n if (castPlayer.playerState !== PLAYER_STATE.PLAYING &&\n castPlayer.playerState !== PLAYER_STATE.PAUSED &&\n castPlayer.playerState !== PLAYER_STATE.LOADED) {\n this.load(castPlayer.currentMediaIndex);\n return;\n }\n\n this.target.play();\n castPlayer.playerState = PLAYER_STATE.PLAYING;\n document.getElementById('play').style.display = 'none';\n document.getElementById('pause').style.display = 'block';\n this.updateDisplayMessage();\n };\n\n this.updateDisplayMessage = function () {\n this.target.updateDisplayMessage();\n }\n\n this.pause = function () {\n this.target.pause();\n castPlayer.playerState = PLAYER_STATE.PAUSED;\n document.getElementById('play').style.display = 'block';\n document.getElementById('pause').style.display = 'none';\n };\n\n this.stop = function () {\n castPlayer.playerState = PLAYER_STATE.IDLE;\n this.target.stop();\n };\n\n this.load = function (mediaIndex = null) {\n if (!mediaIndex) {\n mediaIndex = castPlayer.currentMediaIndex;\n }\n castPlayer.playerState = PLAYER_STATE.BUFFERING;\n this.target.load(mediaIndex);\n };\n\n /**\n * Check if media has been loaded on the target player.\n * @param {number?} mediaIndex The desired media index. If null, verify if\n * any media is loaded.\n */\n this.isMediaLoaded = function (mediaIndex) {\n return this.target.isMediaLoaded(mediaIndex);\n };\n\n /**\n * Called after media has been successfully loaded and is ready to start playback.\n * When local, will start playing the video, start the timer, and update the UI.\n * When remote, will set the UI to PLAYING and start the timer to update the\n * UI based on remote playback.\n */\n this.prepareToPlay = function () {\n castPlayer.mediaDuration = this.getMediaDuration();\n castPlayer.playerHandler.updateDurationDisplay();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplay();\n };\n\n this.loaded = function() {\n castPlayer.currentMediaDuration = this.getMediaDuration();\n castPlayer.updateMediaDuration();\n castPlayer.playerState = PLAYER_STATE.LOADED;\n if (castPlayer.currentMediaTime > 0) {\n this.seekTo(castPlayer.currentMediaTime);\n }\n this.play();\n castPlayer.startProgressTimer();\n this.updateDisplayMessage();\n };\n\n this.getCurrentMediaTime = function () {\n return this.target.getCurrentMediaTime();\n };\n\n this.getMediaDuration = function () {\n return this.target.getMediaDuration();\n };\n\n this.updateDisplay = function () {\n // Update local variables\n this.currentMediaTime = this.target.getCurrentMediaTime();\n this.mediaDuration = this.target.getMediaDuration();\n\n this.target.updateDisplay();\n };\n\n this.updateCurrentTimeDisplay = function () {\n this.target.updateCurrentTimeDisplay();\n };\n\n /**\n * Determines the correct time string (media or clock) and sets it for the given element.\n */\n this.setTimeString = function (element, time) {\n this.target.setTimeString(element, time);\n };\n\n this.setVolume = function (volumeSliderPosition) {\n this.target.setVolume(volumeSliderPosition);\n };\n\n this.mute = function () {\n this.target.mute();\n document.getElementById('audio_on').style.display = 'none';\n document.getElementById('audio_off').style.display = 'block';\n };\n\n this.unMute = function () {\n this.target.unMute();\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n };\n\n this.isMuted = function () {\n return this.target.isMuted();\n };\n\n this.seekTo = function (time) {\n this.target.seekTo(time);\n };\n};\n\n/**\n * Set the PlayerHandler target to use the video-element player\n */\nCastPlayer.prototype.setupLocalPlayer = () => {\n var localPlayer = document.getElementById('video_element');\n localPlayer.addEventListener(\n 'loadeddata', castPlayer.onMediaLoadedLocally.bind(castPlayer));\n\n // This object will implement PlayerHandler callbacks with localPlayer\n var playerTarget = {};\n\n playerTarget.play = () => {\n localPlayer.play();\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'none';\n localPlayer.style.display = 'block';\n };\n\n playerTarget.pause = function () {\n localPlayer.pause();\n };\n\n playerTarget.stop = function () {\n if (typeof localPlayer.stop === \"function\")\n localPlayer.stop();\n };\n\n playerTarget.load = function (mediaIndex) {\n localPlayer.src =\n castPlayer.mediaContents[mediaIndex]['sources'][0];\n localPlayer.load();\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function () {\n return localPlayer.currentTime;\n };\n\n playerTarget.getMediaDuration = function () {\n return localPlayer.duration;\n };\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'none';\n document.getElementById('playerstatebg').style.display = 'none';\n document.getElementById('video_image_overlay').style.display = 'none';\n };\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n localPlayer.volume = volumeSliderPosition < FULL_VOLUME_HEIGHT ?\n volumeSliderPosition / FULL_VOLUME_HEIGHT : 1;\n var p = document.getElementById('audio_bg_level');\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n };\n\n playerTarget.mute = function () {\n localPlayer.muted = true;\n };\n\n playerTarget.unMute = function () {\n localPlayer.muted = false;\n };\n\n playerTarget.isMuted = function () {\n return localPlayer.muted;\n };\n\n playerTarget.seekTo = function (time) {\n localPlayer.currentTime = time;\n };\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n castPlayer.playerHandler.setVolume(DEFAULT_VOLUME * FULL_VOLUME_HEIGHT);\n\n castPlayer.showFullscreenButton();\n\n if (castPlayer.currentMediaTime > 0) {\n castPlayer.playerHandler.play();\n }\n};\n\n/**\n * Set the PlayerHandler target to use the remote player\n * Add event listeners for player changes which may occur outside sender app.\n */\nCastPlayer.prototype.setupRemotePlayer = function () {\n var castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n // Add event listeners for player changes which may occur outside sender app\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.playerHandler.pause();\n } else {\n castPlayer.playerHandler.play();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.IS_MUTED_CHANGED,\n function() {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n } else {\n castPlayer.playerHandler.unMute();\n }\n }.bind(castPlayer)\n );\n\n castPlayer.remotePlayerController.addEventListener(\n cast.framework.RemotePlayerEventType.VOLUME_LEVEL_CHANGED,\n function() {\n var newVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = newVolume + 'px';\n p.style.marginTop = -newVolume + 'px';\n }.bind(castPlayer)\n );\n\n // castPlayer object will implement PlayerHandler callbacks with\n // remotePlayerController, and makes necessary UI updates specific\n // to remote playback\n var playerTarget = {};\n\n playerTarget.play = function () {\n if (castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n\n var vi = document.getElementById('video_image');\n vi.style.display = 'block';\n var localPlayer = document.getElementById('video_element');\n localPlayer.style.display = 'none';\n }.bind(castPlayer);\n\n playerTarget.pause = function () {\n if (!castPlayer.remotePlayer.isPaused) {\n castPlayer.remotePlayerController.playOrPause();\n }\n }.bind(castPlayer);\n\n playerTarget.stop = function () {\n castPlayer.remotePlayerController.stop();\n }.bind(castPlayer);\n\n playerTarget.load = function (mediaIndex) {\n console.log('Loading...' + castPlayer.mediaContents[mediaIndex]['title']);\n var mediaInfo = new chrome.cast.media.MediaInfo(\n castPlayer.mediaContents[mediaIndex]['sources'][0], 'video/mp4');\n\n mediaInfo.metadata = new chrome.cast.media.GenericMediaMetadata();\n mediaInfo.metadata.metadataType = chrome.cast.media.MetadataType.GENERIC;\n mediaInfo.metadata.title = castPlayer.mediaContents[mediaIndex]['title'];\n mediaInfo.metadata.images = [\n {'url': MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb']}];\n\n var request = new chrome.cast.media.LoadRequest(mediaInfo);\n castSession.loadMedia(request).then(\n castPlayer.playerHandler.loaded.bind(castPlayer.playerHandler),\n function (errorCode) {\n castPlayer.playerState = PLAYER_STATE.ERROR;\n console.log('Remote media load error: ' +\n CastPlayer.getErrorMessage(errorCode));\n }.bind(castPlayer));\n }.bind(castPlayer);\n\n playerTarget.getCurrentMediaTime = function() {\n return castPlayer.remotePlayer.currentTime;\n }.bind(castPlayer);\n\n playerTarget.getMediaDuration = function() {\n return castPlayer.remotePlayer.duration;\n }.bind(castPlayer);\n\n playerTarget.updateDisplayMessage = function () {\n document.getElementById('playerstate').style.display = 'block';\n document.getElementById('playerstatebg').style.display = 'block';\n document.getElementById('video_image_overlay').style.display = 'block';\n document.getElementById('playerstate').innerHTML =\n castPlayer.mediaContents[ castPlayer.currentMediaIndex]['title'] + ' ' +\n castPlayer.playerState + ' on ' + castSession.getCastDevice().friendlyName;\n }.bind(castPlayer);\n\n playerTarget.setVolume = function (volumeSliderPosition) {\n // Add resistance to avoid loud volume\n var currentVolume = castPlayer.remotePlayer.volumeLevel;\n var p = document.getElementById('audio_bg_level');\n if (volumeSliderPosition < FULL_VOLUME_HEIGHT) {\n var vScale = castPlayer.currentVolume * FULL_VOLUME_HEIGHT;\n if (volumeSliderPosition > vScale) {\n volumeSliderPosition = vScale + (pos - vScale) / 2;\n }\n p.style.height = volumeSliderPosition + 'px';\n p.style.marginTop = -volumeSliderPosition + 'px';\n currentVolume = volumeSliderPosition / FULL_VOLUME_HEIGHT;\n } else {\n currentVolume = 1;\n }\n castPlayer.remotePlayer.volumeLevel = currentVolume;\n castPlayer.remotePlayerController.setVolumeLevel();\n }.bind(castPlayer);\n\n playerTarget.mute = function () {\n if (!castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.unMute = function () {\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.remotePlayerController.muteOrUnmute();\n }\n }.bind(castPlayer);\n\n playerTarget.isMuted = function() {\n return castPlayer.remotePlayer.isMuted;\n }.bind(castPlayer);\n\n playerTarget.seekTo = function (time) {\n castPlayer.remotePlayer.currentTime = time;\n castPlayer.remotePlayerController.seek();\n }.bind(castPlayer);\n\n castPlayer.playerHandler.setTarget(playerTarget);\n\n // Setup remote player volume right on setup\n // The remote player may have had a volume set from previous playback\n if (castPlayer.remotePlayer.isMuted) {\n castPlayer.playerHandler.mute();\n }\n var currentVolume = castPlayer.remotePlayer.volumeLevel * FULL_VOLUME_HEIGHT;\n var p = document.getElementById('audio_bg_level');\n p.style.height = currentVolume + 'px';\n p.style.marginTop = -currentVolume + 'px';\n\n castPlayer.hideFullscreenButton();\n\n castPlayer.playerHandler.play();\n};\n\n/**\n * Callback when media is loaded in local player\n */\nCastPlayer.prototype.onMediaLoadedLocally = function () {\n var localPlayer = document.getElementById('video_element');\n localPlayer.currentTime = castPlayer.currentMediaTime;\n\n castPlayer.playerHandler.loaded();\n};\n\n/**\n * Select a media content\n * @param {number} mediaIndex A number for media index\n */\nCastPlayer.prototype.selectMedia = function (mediaIndex) {\n console.log('Media index selected: ' + mediaIndex);\n\n castPlayer.currentMediaIndex = mediaIndex;\n // Clear currentMediaInfo when playing content from the sender.\n castPlayer.playerHandler.currentMediaInfo = undefined;\n\n // Set video image\n var vi = document.getElementById('video_image');\n vi.src = MEDIA_SOURCE_ROOT + castPlayer.mediaContents[mediaIndex]['thumb'];\n\n // Reset progress bar\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = '0px';\n var progress = document.getElementById('progress');\n progress.style.width = '0px';\n\n let seekable_window = document.getElementById('seekable_window');\n let unseekable_overlay = document.getElementById('unseekable_overlay');\n seekable_window.style.width = PROGRESS_BAR_WIDTH;\n unseekable_overlay.style.width = '0px';\n\n // Stop timer and reset time displays\n castPlayer.stopProgressTimer();\n castPlayer.currentMediaTime = 0;\n castPlayer.playerHandler.setTimeString(document.getElementById('currentTime'), 0);\n castPlayer.playerHandler.setTimeString(document.getElementById('duration'), 0);\n\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.play();\n};\n\n/**\n * Media seek function\n * @param {Event} event An event object from seek\n */\nCastPlayer.prototype.seekMedia = function (event) {\n if (castPlayer.mediaDuration == null || (cast.framework.CastContext.getInstance().getCurrentSession() && !castPlayer.remotePlayer.canSeek)) {\n console.log('Error - Not seekable');\n return;\n }\n\n if (castPlayer.isLiveContent && !castPlayer.liveSeekableRange) {\n console.log('Live content has no seekable range.')\n return;\n }\n\n var position = parseInt(event.offsetX, 10);\n var pi = document.getElementById('progress_indicator');\n var progress = document.getElementById('progress');\n let seekTime = 0;\n let pp = 0;\n let pw = 0;\n if (event.currentTarget.id == 'progress_indicator') {\n seekTime = parseInt(castPlayer.currentMediaTime + castPlayer.mediaDuration * position /\n PROGRESS_BAR_WIDTH, 10);\n pp = parseInt(pi.style.marginLeft, 10) + position;\n pw = parseInt(progress.style.width, 10) + position;\n } else {\n seekTime = parseInt(position * castPlayer.mediaDuration / PROGRESS_BAR_WIDTH, 10);\n pp = position;\n pw = position;\n }\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING ||\n castPlayer.playerState === PLAYER_STATE.PAUSED) {\n castPlayer.currentMediaTime = seekTime;\n progress.style.width = pw + 'px';\n pi.style.marginLeft = pp + 'px';\n }\n\n if (castPlayer.isLiveContent) {\n seekTime += castPlayer.mediaInfo.metadata.sectionStartTimeInMedia;\n }\n\n castPlayer.playerHandler.seekTo(seekTime);\n};\n\n/**\n * Set current player volume\n * @param {Event} mouseEvent\n */\nCastPlayer.prototype.setVolume = function (mouseEvent) {\n var p = document.getElementById('audio_bg_level');\n var pos = 0;\n if (mouseEvent.currentTarget.id === 'audio_bg_track') {\n pos = FULL_VOLUME_HEIGHT - parseInt(mouseEvent.offsetY, 10);\n } else {\n pos = parseInt(p.clientHeight, 10) - parseInt(mouseEvent.offsetY, 10);\n }\n castPlayer.playerHandler.setVolume(pos);\n};\n\n/**\n * Starts the timer to increment the media progress bar\n */\nCastPlayer.prototype.startProgressTimer = function () {\n castPlayer.stopProgressTimer();\n\n // Start progress timer\n castPlayer.timer = setInterval(castPlayer.incrementMediaTimeHandler, TIMER_STEP);\n};\n\n/**\n * Stops the timer to increment the media progress bar\n */\nCastPlayer.prototype.stopProgressTimer = function () {\n if (castPlayer.timer) {\n clearInterval(castPlayer.timer);\n castPlayer.timer = null;\n }\n};\n\n/**\n * Increment media current time depending on remote or local playback\n */\nCastPlayer.prototype.incrementMediaTime = () => {\n // First sync with the current player's time\n castPlayer.currentMediaTime = castPlayer.playerHandler.getCurrentMediaTime();\n castPlayer.currentMediaDuration = castPlayer.playerHandler.getMediaDuration();\n\n if (castPlayer.playerState === PLAYER_STATE.PLAYING) {\n if (castPlayer.currentMediaTime < castPlayer.currentMediaDuration) {\n castPlayer.currentMediaTime += 1;\n castPlayer.updateProgressBarByTimer();\n } else {\n castPlayer.endPlayback();\n }\n }\n};\n\n/**\n * Update progress bar and currentTime based on timer\n */\nCastPlayer.prototype.updateProgressBarByTimer = function () {\n var p = document.getElementById('progress');\n if (isNaN(parseInt(p.style.width, 10))) {\n p.style.width = 0;\n }\n if (castPlayer.currentMediaDuration > 0) {\n var pp = Math.floor(\n PROGRESS_BAR_WIDTH * castPlayer.currentMediaTime / castPlayer.currentMediaDuration);\n }\n\n p.style.width = pp + 'px';\n var pi = document.getElementById('progress_indicator');\n pi.style.marginLeft = -21 - PROGRESS_BAR_WIDTH + pp + 'px';\n\n if (pp >= PROGRESS_BAR_WIDTH) {\n castPlayer.endPlayback();\n }\n};\n\n/**\n * End playback. Called when media ends.\n */\nCastPlayer.prototype.endPlayback = function () {\n castPlayer.currentMediaTime = 0;\n castPlayer.stopProgressTimer();\n castPlayer.playerState = PLAYER_STATE.IDLE;\n castPlayer.playerHandler.updateDisplay();\n\n let play = document.getElementById('play');\n if (play && play.style && play.display)\n play.style.display = 'block';\n\n let pause = document.getElementById('pause');\n if (pause && pause.style && pause.style.display)\n pause.style.display = 'none';\n};\n\n/**\n * @param {?number} timestamp Linux timestamp\n * @return {?string} media time string. Null if time is invalid.\n */\nCastPlayer.prototype.getMediaTimeString = function (timestamp) {\n if (timestamp == undefined || timestamp == null) {\n return null;\n }\n\n let isNegative = false;\n if (timestamp < 0) {\n isNegative = true;\n timestamp *= -1;\n }\n\n let hours = Math.floor(timestamp / 3600);\n let minutes = Math.floor((timestamp - (hours * 3600)) / 60);\n let seconds = Math.floor(timestamp - (hours * 3600) - (minutes * 60));\n\n if (hours < 10) hours = '0' + hours;\n if (minutes < 10) minutes = '0' + minutes;\n if (seconds < 10) seconds = '0' + seconds;\n\n return (isNegative ? '-' : '') + hours + ':' + minutes + ':' + seconds;\n};\n\n/**\n * @param {number} timestamp Linux timestamp\n * @return {?string} ClockTime string. Null if time is invalid.\n */\nCastPlayer.prototype.getClockTimeString = function (timestamp) {\n if (!timestamp) return \"0:00:00\";\n\n let date = new Date(timestamp * 1000);\n let hours = date.getHours();\n let minutes = date.getMinutes();\n let seconds = date.getSeconds();\n let ampm = hours >= 12 ? 'PM' : 'AM';\n hours = hours % 12;\n // Hour '0' should be '12'\n hours = hours ? hours : 12;\n minutes = ('0' + minutes).slice(-2);\n seconds = ('0' + seconds).slice(-2);\n let clockTime = hours + ':' + minutes + ':' + seconds + ' ' + ampm;\n return clockTime;\n};\n\n/**\n * Updates Ad markers in UI\n */\nCastPlayer.prototype.updateAdMarkers = function () {\n let castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n if (!castSession) return;\n\n let media = castSession.getMediaSession();\n if (!media) return;\n\n let mediaInfo = media.media;\n if (!mediaInfo) return;\n\n let breaks = mediaInfo.breaks;\n let contentDuration = mediaInfo.duration;\n\n if (!breaks) {\n return;\n }\n\n for (var i = 0; i < breaks.length; i++) {\n let adBreak = breaks[i];\n\n // Server-side stitched Ads (embedded) are skipped when the position is beyond\n // the duration, so they shouldn't be shown with an ad marker on the UI.\n if (adBreak.position > contentDuration && adBreak.isEmbedded) {\n continue;\n }\n\n // Place marker if not already set in position\n if (!document.getElementById('ad' + adBreak.position)) {\n var div = document.getElementById('progress')\n div.innerHTML += '
';\n }\n }\n};\n\n/**\n * Remove Ad markers in UI\n */\nCastPlayer.prototype.removeAdMarkers = function () {\n document.querySelectorAll('.adMarker').forEach(function (adMarker) {\n adMarker.remove();\n });\n};\n\n/**\n * Position of the ad marker from the margin\n */\nCastPlayer.prototype.adPositionToMargin = function (position, contentDuration) {\n // Post-roll\n if (position == -1) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Client stitched Ads (not embedded) beyond the duration, will play at the\n // end of the content.\n if (position > contentDuration) {\n return PROGRESS_BAR_WIDTH;\n }\n\n // Convert Ad position to margin\n return (PROGRESS_BAR_WIDTH * position) / contentDuration;\n};\n\n/**\n * Handle BREAK_CLIP_ID_CHANGED event\n */\nCastPlayer.prototype.onBreakClipIdChanged = function () {\n // Hide skip button when switching to a new breakClip\n let skip = document.getElementById('skip');\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n};\n\n/**\n * Disable progress bar if playing a break.\n */\nCastPlayer.prototype.isPlayingBreak = function (isPlayingBreak) {\n castPlayer.enableProgressBar(!isPlayingBreak);\n};\n\n/**\n * Handle WHEN_SKIPPABLE_CHANGED event\n */\nCastPlayer.prototype.onWhenSkippableChanged = function (whenSkippable) {\n castPlayer.whenSkippable = whenSkippable;\n};\n\n/**\n * Handle CURRENT_BREAK_CLIP_TIME_CHANGED event\n */\nCastPlayer.prototype.onCurrentBreakClipTimeChanged = function (currentBreakClipTime) {\n let skip = document.getElementById('skip');\n\n // Unskippable\n if (castPlayer.whenSkippable == undefined || castPlayer.whenSkippable < 0) {\n // Hide skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n // Skippable\n else if (castPlayer.whenSkippable !== undefined || currentBreakClipTime >= castPlayer.whenSkippable) {\n // Show skip button \n if (skip && skip.style && skip.style.display)\n skip.style.display = 'block';\n }\n // Not ready to be skipped\n else {\n // Hide skip button\n if (skip && skip.style && skip.style.display)\n skip.style.display = 'none';\n }\n};\n\n/**\n * Skip the current Ad\n */\nCastPlayer.prototype.skipAd = function () {\n castPlayer.remotePlayerController.skipAd();\n}\n\n/**\n * Enable/disable progress bar\n */\nCastPlayer.prototype.enableProgressBar = function (enable) {\n let progress = document.getElementById('progress');\n let progress_indicator = document.getElementById('progress_indicator');\n let seekable_window = document.getElementById('seekable_window');\n\n if (enable) {\n // Enable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_progress.png')\";\n progress.style.cursor = \"pointer\";\n seekable_window.style.cursor = \"pointer\";\n progress_indicator.style.cursor = \"pointer\";\n progress_indicator.draggable = true;\n\n // Add listeners\n progress.addEventListener('click', castPlayer.seekMediaListener);\n seekable_window.addEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.addEventListener('dragend', castPlayer.seekMediaListener);\n } else {\n // Disable UI\n progress.style.backgroundImage = \"url('./assets/imagefiles/timeline_bg_buffer.png')\";\n progress.style.cursor = \"default\";\n seekable_window.style.cursor = \"default\";\n progress_indicator.style.cursor = \"default\";\n progress_indicator.draggable = false;\n\n // Remove listeners\n progress.removeEventListener('click', castPlayer.seekMediaListener);\n seekable_window.removeEventListener('click', castPlayer.seekMediaListener);\n progress_indicator.removeEventListener('dragend', castPlayer.seekMediaListener);\n }\n}\n\n/**\n * Updates media duration text in UI\n */\nCastPlayer.prototype.updateMediaDuration = function() {\n document.getElementById('duration').innerHTML =\n CastPlayer.getDurationString(castPlayer.currentMediaDuration);\n};\n\n/**\n * @param {number} durationInSec\n * @return {string}\n */\nCastPlayer.getDurationString = function(durationInSec) {\n var durationString = '' + Math.floor(durationInSec % 60);\n var durationInMin = Math.floor(durationInSec / 60);\n if (durationInMin === 0) {\n return durationString;\n }\n durationString = (durationInMin % 60) + ':' + durationString;\n var durationInHour = Math.floor(durationInMin / 60);\n if (durationInHour === 0) {\n return durationString;\n }\n return durationInHour + ':' + durationString;\n};\n\n/**\n * Request full screen mode\n */\nCastPlayer.prototype.requestFullScreen = function () {\n // Supports most browsers and their versions\n var element = document.getElementById('video_element');\n var requestMethod =\n element['requestFullScreen'] || element['webkitRequestFullScreen'];\n\n if (requestMethod) {\n // Native full screen.\n requestMethod.call(element);\n console.log('Requested fullscreen');\n }\n};\n\n/**\n * Exit full screen mode\n */\nCastPlayer.prototype.cancelFullScreen = function () {\n // Supports most browsers and their versions.\n var requestMethod =\n document['cancelFullScreen'] || document['webkitCancelFullScreen'];\n\n if (requestMethod) {\n requestMethod.call(document);\n }\n};\n\n/**\n * Exit fullscreen mode by escape\n */\nCastPlayer.prototype.fullscreenChangeHandler = function () {\n castPlayer.fullscreen = !castPlayer.fullscreen;\n};\n\n/**\n * Show expand/collapse fullscreen button\n */\nCastPlayer.prototype.showFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (castPlayer.fullscreen) {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'block';\n } else {\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'block';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n }\n};\n\n/**\n * Hide expand/collapse fullscreen button\n */\nCastPlayer.prototype.hideFullscreenButton = function () {\n let fullscreen_expand = document.getElementById('fullscreen_expand');\n let fullscreen_collapse = document.getElementById('fullscreen_collapse');\n\n if (fullscreen_expand && fullscreen_expand.style && fullscreen_expand.style.display)\n fullscreen_expand.style.display = 'none';\n\n if (fullscreen_collapse && fullscreen_collapse.style && fullscreen_collapse.style.display)\n fullscreen_collapse.style.display = 'none';\n};\n\n/**\n * Show the media control\n */\nCastPlayer.prototype.showMediaControl = function () {\n let media_control = document.getElementById('media_control');\n if (media_control && media_control.style && media_control.style.opacity)\n media_control.style.opacity = 0.7;\n};\n\n/**\n * Hide the media control\n */\nCastPlayer.prototype.hideMediaControl = function () {\n if (typeof cast !== 'undefined') {\n let context = cast.framework.CastContext.getInstance();\n if (context && context.getCurrentSession()) {\n // Do not hide controls during an active cast session.\n document.getElementById('media_control').style.opacity = 0.7;\n } else {\n document.getElementById('media_control').style.opacity = 0;\n }\n }\n};\n\n/**\n * Show the volume slider\n */\nCastPlayer.prototype.showVolumeSlider = function () {\n if (!castPlayer.playerHandler.isMuted()) {\n document.getElementById('audio_bg').style.opacity = 1;\n document.getElementById('audio_bg_track').style.opacity = 1;\n document.getElementById('audio_bg_level').style.opacity = 1;\n document.getElementById('audio_indicator').style.opacity = 1;\n }\n};\n\n/**\n * Hide the volume slider\n */\nCastPlayer.prototype.hideVolumeSlider = function () {\n document.getElementById('audio_bg').style.opacity = 0;\n document.getElementById('audio_bg_track').style.opacity = 0;\n document.getElementById('audio_bg_level').style.opacity = 0;\n document.getElementById('audio_indicator').style.opacity = 0;\n};\n\n/**\n * Reset the volume slider\n */\nCastPlayer.prototype.resetVolumeSlider = function () {\n var volumeTrackHeight = document.getElementById('audio_bg_track').clientHeight;\n var defaultVolumeSliderHeight = DEFAULT_VOLUME * volumeTrackHeight;\n document.getElementById('audio_bg_level').style.height =\n defaultVolumeSliderHeight + 'px';\n document.getElementById('audio_on').style.display = 'block';\n document.getElementById('audio_off').style.display = 'none';\n};\n\n/**\n * Initialize UI components and add event listeners\n */\nCastPlayer.prototype.initializeUI = () => {\n // Set initial values for title, subtitle, and description\n document.getElementById('media_title').innerHTML =\n castPlayer.mediaContents[0]['title'];\n document.getElementById('media_subtitle').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['subtitle'];\n document.getElementById('media_desc').innerHTML =\n castPlayer.mediaContents[castPlayer.currentMediaIndex]['description'];\n\n // Add event handlers to UI components\n document.getElementById('progress_bg').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress').addEventListener(\n 'click', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('progress_indicator').addEventListener(\n 'dragend', castPlayer.seekMedia.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'click', castPlayer.playerHandler.mute.bind(castPlayer.playerHandler));\n document.getElementById('audio_off').addEventListener(\n 'click', castPlayer.playerHandler.unMute.bind(castPlayer.playerHandler));\n document.getElementById('audio_bg').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'mouseover', castPlayer.showVolumeSlider.bind(castPlayer));\n document.getElementById('audio_bg_level').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg_track').addEventListener(\n 'click', castPlayer.setVolume.bind(castPlayer));\n document.getElementById('audio_bg').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('audio_on').addEventListener(\n 'mouseout', castPlayer.hideVolumeSlider.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('main_video').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseover', castPlayer.showMediaControl.bind(castPlayer));\n document.getElementById('media_control').addEventListener(\n 'mouseout', castPlayer.hideMediaControl.bind(castPlayer));\n document.getElementById('fullscreen_expand').addEventListener(\n 'click', castPlayer.requestFullScreen.bind(castPlayer));\n document.getElementById('fullscreen_collapse').addEventListener(\n 'click', castPlayer.cancelFullScreen.bind(castPlayer));\n document.addEventListener(\n 'fullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n document.addEventListener(\n 'webkitfullscreenchange', castPlayer.fullscreenChangeHandler.bind(castPlayer), false);\n\n // Enable play/pause buttons\n document.getElementById('play').addEventListener(\n 'click', castPlayer.playerHandler.play.bind(castPlayer.playerHandler));\n document.getElementById('pause').addEventListener(\n 'click', castPlayer.playerHandler.pause.bind(castPlayer.playerHandler));\n document.getElementById('progress_indicator').draggable = true;\n};\n\n/**\n * Add video thumbnails div's to UI for media JSON contents\n */\nCastPlayer.prototype.addVideoThumbs = function () {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n var ni = document.getElementById('carousel');\n var newdiv = null;\n var divIdName = null;\n for (var i = 0; i < castPlayer.mediaContents.length; i++) {\n newdiv = document.createElement('div');\n divIdName = 'thumb' + i + 'Div';\n newdiv.setAttribute('id', divIdName);\n newdiv.setAttribute('class', 'thumb');\n newdiv.innerHTML =\n '';\n newdiv.addEventListener('click', castPlayer.selectMedia.bind(castPlayer, i));\n ni.appendChild(newdiv);\n }\n }\n};\n\nCastPlayer.prototype.addMediaContents = () => {\n if (typeof castPlayer.mediaJSON !== 'undefined' && castPlayer.mediaJSON['categories'] && castPlayer.mediaJSON['categories'].length > 0) {\n castPlayer.mediaContents = castPlayer.mediaJSON['categories'][0]['videos'];\n return castPlayer.mediaContents;\n } else {\n return null;\n }\n};\n\n/**\n * Makes human-readable message from chrome.cast.Error\n * @param {chrome.cast.Error} error\n * @return {string} error message\n */\nCastPlayer.getErrorMessage = function (error) {\n switch (error.code) {\n case chrome.cast.ErrorCode.API_NOT_INITIALIZED:\n return 'The API is not initialized.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CANCEL:\n return 'The operation was canceled by the user' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.CHANNEL_ERROR:\n return 'A channel to the receiver is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.EXTENSION_MISSING:\n return 'The Cast extension is not available.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.INVALID_PARAMETER:\n return 'The parameters to the operation were not valid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.RECEIVER_UNAVAILABLE:\n return 'No receiver was compatible with the session request.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.SESSION_ERROR:\n return 'A session could not be created, or a session was invalid.' +\n (error.description ? ' :' + error.description : '');\n case chrome.cast.ErrorCode.TIMEOUT:\n return 'The operation timed out.' +\n (error.description ? ' :' + error.description : '');\n default:\n return error;\n }\n};\n\nvar castPlayer = new CastPlayer();\nwindow['__onGCastApiAvailable'] = function (isAvailable) {\n if (isAvailable) {\n castPlayer.initializeCastPlayer();\n }\n};\n\nwindow.CastPlayer = castPlayer;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {NgCastComponent as ɵa} from './ng-cast.component';"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/ng-cast.component.d.ts b/dist/ng-cast.component.d.ts index 8d15d3c..427a1bb 100644 --- a/dist/ng-cast.component.d.ts +++ b/dist/ng-cast.component.d.ts @@ -1,4 +1,4 @@ -import { OnInit, ElementRef } from '@angular/core'; +import { OnInit, ElementRef, AfterViewChecked } from '@angular/core'; import { NgCastService } from './shared/ng-cast.service'; import { VgDASH } from 'videogular2/compiled/src/streaming/vg-dash/vg-dash'; import { IDRMLicenseServer } from 'videogular2/compiled/src/streaming/streaming'; @@ -11,7 +11,7 @@ export interface IMediaStream { token?: string; licenseServers?: IDRMLicenseServer; } -export declare class NgCastComponent implements OnInit { +export declare class NgCastComponent implements OnInit, AfterViewChecked { private ngCastService; vgDash: VgDASH; media: ElementRef; @@ -35,6 +35,7 @@ export declare class NgCastComponent implements OnInit { appBaseUrl: String; constructor(ngCastService: NgCastService); ngOnInit(): void; + ngAfterViewChecked(): void; onPlayerReady(api: VgAPI): void; setBitrate(option: BitrateOption): void; nextVideo(): void; diff --git a/dist/package.json b/dist/package.json index dd225f9..d393c2c 100644 --- a/dist/package.json +++ b/dist/package.json @@ -1,7 +1,7 @@ { "$schema": "./node_modules/ng-packagr/package.schema.json", "name": "@thinkam.net/ng-cast", - "version": "0.4.2", + "version": "0.4.5", "description": "Broadcast media on your TV from your Angular app", "main": "bundles/thinkam.net-ng-cast.umd.js", "repository": { diff --git a/dist/thinkam.net-ng-cast.metadata.json b/dist/thinkam.net-ng-cast.metadata.json index b7b4c0a..f08b6e8 100644 --- a/dist/thinkam.net-ng-cast.metadata.json +++ b/dist/thinkam.net-ng-cast.metadata.json @@ -1 +1 @@ -{"__symbolic":"module","version":4,"metadata":{"NgCastModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":11,"character":1},"arguments":[{"schemas":[{"__symbolic":"reference","module":"@angular/core","name":"CUSTOM_ELEMENTS_SCHEMA","line":12,"character":13}],"imports":[{"__symbolic":"reference","module":"@angular/common","name":"CommonModule","line":14,"character":4},{"__symbolic":"reference","module":"videogular2/compiled/core","name":"VgCoreModule","line":15,"character":4},{"__symbolic":"reference","module":"videogular2/compiled/controls","name":"VgControlsModule","line":16,"character":4},{"__symbolic":"reference","module":"videogular2/compiled/streaming","name":"VgStreamingModule","line":17,"character":4},{"__symbolic":"reference","module":"videogular2/compiled/buffering","name":"VgBufferingModule","line":18,"character":4},{"__symbolic":"reference","module":"videogular2/compiled/overlay-play","name":"VgOverlayPlayModule","line":19,"character":4}],"exports":[{"__symbolic":"reference","name":"ɵa"}],"providers":[{"__symbolic":"reference","name":"NgCastService"}],"declarations":[{"__symbolic":"reference","name":"ɵa"}]}]}],"members":{}},"NgCastService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":8,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor"}],"initializeCastApi":[{"__symbolic":"method"}],"initialize":[{"__symbolic":"method"}],"setCasting":[{"__symbolic":"method"}],"getStatus":[{"__symbolic":"method"}]}},"ɵa":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":18,"character":1},"arguments":[{"selector":"ng-cast","template":"
\n \n \n \n \n \n
\n \n \n
AGORA
\n
\n
\n \n \n \n \n
\n
\n \n \"TV\n \n\n\n
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n","styles":["#video-container{background-color:#272c34;margin:0 auto;z-index:-1}#video-container vg-scrub-bar-current-time .background{background-color:red}#video-container .hidden{display:none}#video-container .show{display:block}#video-container .video-controls{background:rgba(0,0,0,.5);bottom:0;height:45px;left:0;position:absolute;right:0;transition:all .2s ease}#video-container .video-controls.hide{opacity:0;pointer-events:none}#video-container .video-progress{align-items:right;height:8.4px;position:relative}#video-container .video-progress #seek-tooltip{position:absolute}@media screen and (-webkit-min-device-pixel-ratio:0){#video-container .video-progress input[type=range]{-webkit-appearance:none;background-color:var(--youtube-red);overflow:hidden}#video-container .video-progress input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;color:var(--youtube-red);height:10px;margin-top:-1px}#video-container .video-progress input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--youtube-red);cursor:ew-resize;height:10px;width:10px}}#video-container .video-progress input[type=range]{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-moz-range-progress,#video-container .video-progress input[type=range]::-moz-range-track{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-ms-fill-lower,#video-container .video-progress input[type=range]::-ms-fill-upper{background-color:var(--youtube-red)}#video-container progress{-moz-appearance:none;-webkit-appearance:none;appearance:none;border-radius:2px;height:.5vh;pointer-events:none;position:absolute;top:0;width:100%}#video-container .buttons .video-control{align-items:center;background:none;border:2px solid #fff;border-radius:16px;color:#fff;display:flex;height:32px;justify-content:center;width:32px}#video-container .buttons .video-control i{color:#fff;line-height:16px}#video-container .buttons .video-control-paused{bottom:8px;left:1vw;position:absolute;z-index:1000}#video-container .buttons .video-control-muted{bottom:8px;position:absolute;right:5vw;z-index:1000}#video-container .buttons .video-control-maximized{bottom:8px;position:absolute;right:1vw;z-index:1000}#video-container progress::-webkit-progress-bar{background-color:var(--youtube-red);border-radius:2px}#video-container progress::-webkit-progress-value{background:#fff;border-radius:2px}#video-container progress::-moz-progress-bar{background:#fff;border:1px solid #fff}#video-container .seek{cursor:pointer;height:.5vh;margin:0;position:absolute;top:0;width:100%}#video-container .seek-tooltip{background-color:var(--youtube-red);color:#fff;content:attr(data-title);display:block;font-size:12px;font-weight:700;margin-left:5vw;padding:3px;position:absolute;top:10px}.playlist-item li{color:#fff}.kt-content.kt-grid__item.kt-grid__item--fluid.kt-grid.kt-grid--hor{background-color:#272c34}#kt_header_menu_wrapper{display:none}.kt-header__bottom{display:none!important}.player-wrapper{margin:auto;max-width:500px}.player-wrapper video{width:100%}ul{padding:0}ul li.playlist-item{background:#673ab7;cursor:pointer;list-style:none;margin-bottom:2px;padding:10px}ul li.playlist-item.selected{background-color:#ccc}body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);margin-right:0;margin-top:0;position:absolute;z-index:0}#video_element,#video_image_overlay{display:none;height:540px;margin-bottom:0;width:100%}#video_element{background-color:#000;margin-right:auto;margin-top:20px}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"]}]}],"members":{"vgDash":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":26,"character":3},"arguments":[{"__symbolic":"reference","module":"videogular2/compiled/src/streaming/vg-dash/vg-dash","name":"VgDASH","line":26,"character":13},{"static":false}]}]}],"media":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":27,"character":3},"arguments":["media",{"static":false}]}]}],"videoImage":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":32,"character":3}}]}],"imageOffline":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":33,"character":3}}]}],"premium":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":34,"character":3}}]}],"srcImageOffline":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":35,"character":3}}]}],"currentStream":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":37,"character":3}}]}],"isDebug":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":45,"character":3}}]}],"paused":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":47,"character":3}}]}],"streams":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":49,"character":3}}]}],"playlist":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":57,"character":3}}]}],"play":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":59,"character":3}}]}],"isHidden":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":60,"character":3}}]}],"isShow":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":61,"character":3}}]}],"currentIndex":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":63,"character":3}}]}],"video":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":64,"character":3}}]}],"appBaseUrl":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":65,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"NgCastService"}]}],"ngOnInit":[{"__symbolic":"method"}],"onPlayerReady":[{"__symbolic":"method"}],"setBitrate":[{"__symbolic":"method"}],"nextVideo":[{"__symbolic":"method"}],"getPaused":[{"__symbolic":"method"}],"pause":[{"__symbolic":"method"}],"openSession":[{"__symbolic":"method"}],"closeSession":[{"__symbolic":"method"}],"tryAgain":[{"__symbolic":"method"}],"getVideos":[{"__symbolic":"method"}],"getPosition":[{"__symbolic":"method"}],"getMuted":[{"__symbolic":"method"}],"getMaximized":[{"__symbolic":"method"}],"toggleSound":[{"__symbolic":"method"}],"toggleMaximize":[{"__symbolic":"method"}],"showVideoControls":[{"__symbolic":"method"}],"hideVideoControls":[{"__symbolic":"method"}]}}},"origins":{"NgCastModule":"./ng.cast.module","NgCastService":"./shared/ng-cast.service","ɵa":"./ng-cast.component"},"importAs":"@thinkam.net/ng-cast"} \ No newline at end of file +{"__symbolic":"module","version":4,"metadata":{"NgCastModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":11,"character":1},"arguments":[{"schemas":[{"__symbolic":"reference","module":"@angular/core","name":"CUSTOM_ELEMENTS_SCHEMA","line":12,"character":13}],"imports":[{"__symbolic":"reference","module":"@angular/common","name":"CommonModule","line":14,"character":4},{"__symbolic":"reference","module":"videogular2/compiled/core","name":"VgCoreModule","line":15,"character":4},{"__symbolic":"reference","module":"videogular2/compiled/controls","name":"VgControlsModule","line":16,"character":4},{"__symbolic":"reference","module":"videogular2/compiled/streaming","name":"VgStreamingModule","line":17,"character":4},{"__symbolic":"reference","module":"videogular2/compiled/buffering","name":"VgBufferingModule","line":18,"character":4},{"__symbolic":"reference","module":"videogular2/compiled/overlay-play","name":"VgOverlayPlayModule","line":19,"character":4}],"exports":[{"__symbolic":"reference","name":"ɵa"}],"providers":[{"__symbolic":"reference","name":"NgCastService"}],"declarations":[{"__symbolic":"reference","name":"ɵa"}]}]}],"members":{}},"NgCastService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":8,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor"}],"initializeCastApi":[{"__symbolic":"method"}],"initialize":[{"__symbolic":"method"}],"setCasting":[{"__symbolic":"method"}],"getStatus":[{"__symbolic":"method"}]}},"ɵa":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":18,"character":1},"arguments":[{"selector":"ng-cast","template":"
\n \n \n \n \n \n
\n \n \n
AGORA
\n
\n
\n \n \n \n \n
\n
\n \n \"TV\n \n\n\n
\n
\n
IDLE
\n
IDLE
\n \n
\n \n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
00:00:00
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n\n
\n
\n\n\"TV\n","styles":["#video-container{background-color:#272c34;margin:0 auto;z-index:-1}#video-container vg-scrub-bar-current-time .background{background-color:red}#video-container .hidden{display:none}#video-container .show{display:block}#video-container .video-controls{background:rgba(0,0,0,.5);bottom:0;height:45px;left:0;position:absolute;right:0;transition:all .2s ease}#video-container .video-controls.hide{opacity:0;pointer-events:none}#video-container .video-progress{align-items:right;height:8.4px;position:relative}#video-container .video-progress #seek-tooltip{position:absolute}@media screen and (-webkit-min-device-pixel-ratio:0){#video-container .video-progress input[type=range]{-webkit-appearance:none;background-color:var(--youtube-red);overflow:hidden}#video-container .video-progress input[type=range]::-webkit-slider-runnable-track{-webkit-appearance:none;color:var(--youtube-red);height:10px;margin-top:-1px}#video-container .video-progress input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--youtube-red);cursor:ew-resize;height:10px;width:10px}}#video-container .video-progress input[type=range]{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-moz-range-progress,#video-container .video-progress input[type=range]::-moz-range-track{background-color:var(--youtube-red)}#video-container .video-progress input[type=range]::-ms-fill-lower,#video-container .video-progress input[type=range]::-ms-fill-upper{background-color:var(--youtube-red)}#video-container progress{-moz-appearance:none;-webkit-appearance:none;appearance:none;border-radius:2px;height:.5vh;pointer-events:none;position:absolute;top:0;width:100%}#video-container .buttons .video-control{align-items:center;background:none;border:2px solid #fff;border-radius:16px;color:#fff;display:flex;height:32px;justify-content:center;width:32px}#video-container .buttons .video-control i{color:#fff;line-height:16px}#video-container .buttons .video-control-paused{bottom:8px;left:1vw;position:absolute;z-index:1000}#video-container .buttons .video-control-muted{bottom:8px;position:absolute;right:5vw;z-index:1000}#video-container .buttons .video-control-maximized{bottom:8px;position:absolute;right:1vw;z-index:1000}#video-container progress::-webkit-progress-bar{background-color:var(--youtube-red);border-radius:2px}#video-container progress::-webkit-progress-value{background:#fff;border-radius:2px}#video-container progress::-moz-progress-bar{background:#fff;border:1px solid #fff}#video-container .seek{cursor:pointer;height:.5vh;margin:0;position:absolute;top:0;width:100%}#video-container .seek-tooltip{background-color:var(--youtube-red);color:#fff;content:attr(data-title);display:block;font-size:12px;font-weight:700;margin-left:5vw;padding:3px;position:absolute;top:10px}.playlist-item li{color:#fff}.kt-content.kt-grid__item.kt-grid__item--fluid.kt-grid.kt-grid--hor{background-color:#272c34}#kt_header_menu_wrapper{display:none}.kt-header__bottom{display:none!important}.player-wrapper{margin:auto;max-width:500px}.player-wrapper video{width:100%}ul{padding:0}ul li.playlist-item{background:#673ab7;cursor:pointer;list-style:none;margin-bottom:2px;padding:10px}ul li.playlist-item.selected{background-color:#ccc}body{background-color:#f2f2f2;font-family:Roboto,OpenSans,Verdana,Georgia,Serif}#msg{-webkit-transition:opacity 0 2s;color:#fff;display:none;font-size:90%;font-weight:400;margin-left:200px;transition:opacity 0 2s}#top_header_bar{background-image:url(/assets/imagefiles/header_bg-top.png);background-repeat:repeat-x;height:10px;margin:0;width:100%}#top_header{background-image:url(/assets/imagefiles/header_bg.png);height:71px;z-index:1000}#footer,#top_header{background-repeat:repeat-x;float:left;margin:0;width:100%}#footer{background-image:url(/assets/imagefiles/footer_bg.png);height:81px}#copyright{width:300px}#copyright,#footer_content{color:#fff;float:left;font-size:13px;margin:10px}#footer_content{width:400px}#footer_content_link{color:#fff}#footer_language{color:#fff;float:right;font-size:13px;margin:10px;width:200px}#logo{background-image:url(/assets/imagefiles/logo.png);float:left;height:71px;margin:10px 25px 0;width:201px}.header_tab{-moz-transition:all .6s ease-in-out;-o-transition:all .6s ease-in-out;-webkit-transition:all .6s ease-in-out;float:left;font-family:Roboto,OpenSans;font-size:20px;font-weight:700;height:31px;margin-top:10px;padding:20px}#title_text{text-align:center;width:100%}#main_video{float:left;width:100%}#video_image{height:536px;margin-bottom:0;margin-right:auto;margin-top:20px;width:100%}#video_image_overlay{background:linear-gradient(0deg,rgba(0,0,0,.9),transparent 72%,transparent);display:none;height:540px;margin-bottom:0;margin-right:0;margin-top:0;position:absolute;width:100%;z-index:0}#media_info{background-color:#dde0e5;clear:both;color:#000;display:block;float:left;height:116px;margin-top:10px;opacity:.9;padding:10px;width:100%}#media_title{font-size:30px;font-weight:700;margin:0 10px 0 0}#media_subtitle,#media_title{float:left;font-family:Roboto,Open Sans,Verdana,Georgia,Serif;padding:0}#media_subtitle{font-size:18px;margin:13px 0 0 30px}#media_desc{float:left;font-size:12px;margin:5px}#media_control,#media_desc{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;width:100%}#media_control{-webkit-transition:opacity 1s;background-color:#000;height:60px;opacity:.7;padding:0;position:absolute;top:595px;transition:opacity 1s;z-index:1000}#media_control:hover{opacity:.7}#play{background-image:url(/assets/imagefiles/play.png);float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#play:hover{background-image:url(/assets/imagefiles/play-hover.png)}#play:press{background-image:url(/assets/imagefiles/play-press.png)}#pause{background-image:url(/assets/imagefiles/pause.png);display:none;float:left;height:40px;margin:10px 20px 10px 10px;width:65px}#pause:hover{background-image:url(/assets/imagefiles/pause-hover.png)}.button{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:100%;margin:5px}.volume{margin-left:8px;width:60px}#muteText{margin-left:3px;width:30px}.muteButton{font-family:Roboto,Open Sans,Verdana,Georgia,Serif;font-size:110%}.imageIcon{padding:3px 0 0;width:25px}#progress{background-image:url(/assets/imagefiles/timeline_bg_progress.png);width:1px;z-index:10}#progress,#progress_indicator{background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 0 10px -620px}#progress_indicator{background-image:url(/assets/imagefiles/timeline_indicator.png);width:6px;z-index:1000}#progress_bg{background-image:url(/assets/imagefiles/timeline_bg_track.png);background-repeat:repeat-x;cursor:pointer;float:left;height:36px;margin:20px 20px 10px 0;width:600px}#castbutton{background-color:#000;border:none;float:right;height:32px;margin:10px 6px 14px 0;opacity:.7;outline:none;width:40px}#castbutton:hover{--connected-color:#fff;--disconnected-color:#fff}#audio_off{background-image:url(/assets/imagefiles/audio_off.png);display:none}#audio_off,#audio_on{float:right;height:32px;margin:10px 4px 10px 0;width:32px}#audio_on{background-image:url(/assets/imagefiles/audio_on.png);display:block}#audio_bg{background-image:url(/assets/imagefiles/audio_bg.png);height:124px;margin:-115px 8px -10px 0;opacity:.1;width:41px;z-index:10}#audio_bg,#audio_bg_track{display:block;float:right;position:relative}#audio_bg_track{background-image:url(/assets/imagefiles/audio_bg_track.png);height:100px;margin:-100px 20px -30px 0;opacity:0;width:16px;z-index:1000}#audio_indicator{background-image:url(/assets/imagefiles/audio_indicator.png);display:none;height:5px}#audio_bg_level,#audio_indicator{float:right;margin:-50px 20px -30px 0;opacity:0;position:relative;width:16px;z-index:1000}#audio_bg_level{background-image:url(/assets/imagefiles/audio_bg_level.png);display:block;height:50px}#fullscreen_expand{background-image:url(/assets/imagefiles/fullscreen_expand.png);display:block}#fullscreen_collapse,#fullscreen_expand{cursor:pointer;float:right;height:32px;margin:10px 20px 10px 0;width:32px}#fullscreen_collapse{background-image:url(/assets/imagefiles/fullscreen_collapse.png);display:none}#duration{color:#fff;display:block;float:right;height:32px;margin:18px 15px 10px;width:60px}div.imageSub{position:relative}div.imageSub img{z-index:1}div.imageSub div{bottom:0;left:0;padding:0;position:absolute;right:0}div.imageSub div.blackbg{-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)\";background-color:#000;color:#000;filter:alpha(opacity=50);opacity:.5;z-index:2000}div.imageSub div.blackbg,div.imageSub div.label{bottom:60px;display:none;font-size:120%;height:30px;left:300px;padding:10px;width:400px}div.imageSub div.label{color:#fff;z-index:3000}#carousel{margin:20px 10px 10px 40px;width:990px}.thumb{cursor:pointer;float:left;margin:10px 10px 10px 0}.thumbnail{height:127px;margin-right:10px;width:225px}.vertical{-webkit-transform:rotate(90deg)}"]}]}],"members":{"vgDash":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":26,"character":3},"arguments":[{"__symbolic":"reference","module":"videogular2/compiled/src/streaming/vg-dash/vg-dash","name":"VgDASH","line":26,"character":13},{"static":false}]}]}],"media":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":27,"character":3},"arguments":["media",{"static":false}]}]}],"videoImage":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":32,"character":3}}]}],"imageOffline":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":33,"character":3}}]}],"premium":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":34,"character":3}}]}],"srcImageOffline":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":35,"character":3}}]}],"currentStream":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":37,"character":3}}]}],"isDebug":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":45,"character":3}}]}],"paused":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":47,"character":3}}]}],"streams":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":49,"character":3}}]}],"playlist":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":57,"character":3}}]}],"play":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":59,"character":3}}]}],"isHidden":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":60,"character":3}}]}],"isShow":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":61,"character":3}}]}],"currentIndex":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":63,"character":3}}]}],"video":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":64,"character":3}}]}],"appBaseUrl":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":65,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"NgCastService"}]}],"ngOnInit":[{"__symbolic":"method"}],"ngAfterViewChecked":[{"__symbolic":"method"}],"onPlayerReady":[{"__symbolic":"method"}],"setBitrate":[{"__symbolic":"method"}],"nextVideo":[{"__symbolic":"method"}],"getPaused":[{"__symbolic":"method"}],"pause":[{"__symbolic":"method"}],"openSession":[{"__symbolic":"method"}],"closeSession":[{"__symbolic":"method"}],"tryAgain":[{"__symbolic":"method"}],"getVideos":[{"__symbolic":"method"}],"getPosition":[{"__symbolic":"method"}],"getMuted":[{"__symbolic":"method"}],"getMaximized":[{"__symbolic":"method"}],"toggleSound":[{"__symbolic":"method"}],"toggleMaximize":[{"__symbolic":"method"}],"showVideoControls":[{"__symbolic":"method"}],"hideVideoControls":[{"__symbolic":"method"}]}}},"origins":{"NgCastModule":"./ng.cast.module","NgCastService":"./shared/ng-cast.service","ɵa":"./ng-cast.component"},"importAs":"@thinkam.net/ng-cast"} \ No newline at end of file diff --git a/ng-cast.component.html b/ng-cast.component.html index 846e626..97c73cb 100644 --- a/ng-cast.component.html +++ b/ng-cast.component.html @@ -9,7 +9,7 @@ (mouseleave)="hideVideoControls()" (mousestop)="hideVideoControls()"> -