@clickview/curator 1.101.0-rc.5 → 1.101.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/.vite/manifest.json +214 -214
  2. package/dist/Assets/js/dist/scripts/{DRFvgQ8W2.chunk.js → BKQIzKcF2.chunk.js} +2 -2
  3. package/dist/Assets/js/dist/scripts/{DRFvgQ8W2.chunk.js.map → BKQIzKcF2.chunk.js.map} +1 -1
  4. package/dist/Assets/js/dist/scripts/{DVVpmgqo.chunk.js → BOrAaHLK.chunk.js} +2 -2
  5. package/dist/Assets/js/dist/scripts/{DVVpmgqo.chunk.js.map → BOrAaHLK.chunk.js.map} +1 -1
  6. package/dist/Assets/js/dist/scripts/{BhSjbB8b.chunk.js → COH92JF5.chunk.js} +2 -2
  7. package/dist/Assets/js/dist/scripts/{BhSjbB8b.chunk.js.map → COH92JF5.chunk.js.map} +1 -1
  8. package/dist/Assets/js/dist/scripts/{DjPcCTgD.chunk.js → CR-5nCWm.chunk.js} +2 -2
  9. package/dist/Assets/js/dist/scripts/{DjPcCTgD.chunk.js.map → CR-5nCWm.chunk.js.map} +1 -1
  10. package/dist/Assets/js/dist/scripts/{DWI3MPMB.chunk.js → CqZqlJSF.chunk.js} +2 -2
  11. package/dist/Assets/js/dist/scripts/{DWI3MPMB.chunk.js.map → CqZqlJSF.chunk.js.map} +1 -1
  12. package/dist/Assets/js/dist/scripts/{6Xv7Rh4u.chunk.js → CzCUe0Ej.chunk.js} +2 -2
  13. package/dist/Assets/js/dist/scripts/{6Xv7Rh4u.chunk.js.map → CzCUe0Ej.chunk.js.map} +1 -1
  14. package/dist/Assets/js/dist/scripts/DOdn0XmW2.chunk.js +2 -0
  15. package/dist/Assets/js/dist/scripts/{D6kT_5BE2.chunk.js.map → DOdn0XmW2.chunk.js.map} +1 -1
  16. package/dist/Assets/js/dist/scripts/{UFmS4XTi.chunk.js → DTUkmChD.chunk.js} +2 -2
  17. package/dist/Assets/js/dist/scripts/{UFmS4XTi.chunk.js.map → DTUkmChD.chunk.js.map} +1 -1
  18. package/dist/Assets/js/dist/scripts/{mnL4Dbfb.chunk.js → DW7-la-i.chunk.js} +2 -2
  19. package/dist/Assets/js/dist/scripts/{mnL4Dbfb.chunk.js.map → DW7-la-i.chunk.js.map} +1 -1
  20. package/dist/Assets/js/dist/scripts/{DRewBr6v.chunk.js → Dhnl-PB5.chunk.js} +2 -2
  21. package/dist/Assets/js/dist/scripts/{DRewBr6v.chunk.js.map → Dhnl-PB5.chunk.js.map} +1 -1
  22. package/dist/Assets/js/dist/scripts/{DQKCtEam.chunk.js → DuU4GBw5.chunk.js} +2 -2
  23. package/dist/Assets/js/dist/scripts/{DQKCtEam.chunk.js.map → DuU4GBw5.chunk.js.map} +1 -1
  24. package/dist/Assets/js/dist/scripts/{4RooerDO2.chunk.js → LmwQmHZz2.chunk.js} +2 -2
  25. package/dist/Assets/js/dist/scripts/{4RooerDO2.chunk.js.map → LmwQmHZz2.chunk.js.map} +1 -1
  26. package/dist/Assets/js/dist/scripts/{app-BZJms7pb.js → app-DHtN6XkT.js} +3 -3
  27. package/dist/Assets/js/dist/scripts/{app-BZJms7pb.js.map → app-DHtN6XkT.js.map} +1 -1
  28. package/dist/Assets/js/dist/scripts/{B-n4bfSb.chunk.js → eKSK4iyn.chunk.js} +2 -2
  29. package/dist/Assets/js/dist/scripts/{B-n4bfSb.chunk.js.map → eKSK4iyn.chunk.js.map} +1 -1
  30. package/dist/Assets/js/dist/scripts/{CZpBv6pj.chunk.js → esASf9N4.chunk.js} +2 -2
  31. package/dist/Assets/js/dist/scripts/{CZpBv6pj.chunk.js.map → esASf9N4.chunk.js.map} +1 -1
  32. package/dist/bundles.json +1 -1
  33. package/dist/en.json +1 -1
  34. package/package.json +1 -1
  35. package/dist/Assets/js/dist/scripts/D6kT_5BE2.chunk.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"6Xv7Rh4u.chunk.js","names":[],"sources":["../../../../../../player/src/plugins/clip-plugin/clip-plugin.ts","../../../../../../../libs/shared/src/enums/ShareActivityStatus.ts","../../../../../../player/src/plugins/activity-status-plugin/components/activity-status-button.ts","../../../../../../player/src/plugins/activity-status-plugin/activity-status-plugin.ts","../../../../../../player/src/plugins/loop-video-plugin/components/loop-video-menu-item.ts","../../../../../../player/src/plugins/loop-video-plugin/loop-video-plugin.ts","../../../../../../player/src/plugins/next-video-plugin/components/up-next/up-next.scss","../../../../../../player/src/plugins/next-video-plugin/components/up-next/up-next.tsx","../../../../../../player/src/components/next-video-menu-item/next-video-menu-item.ts","../../../../../../player/src/plugins/next-video-plugin/next-video-plugin.ts"],"sourcesContent":["import videojs, { VideoJsPlayer } from 'video.js';\n\nconst Plugin = videojs.getPlugin('plugin');\n\n/**\n * TODO:\n * The value below is set quite high to compensate for the ridiculous amount of drift that can occur\n * when casting to a Vivi device. This is a temporary fix until we can get Vivi to fix the issue on their end.\n */\nconst CLIP_SEEK_DRIFT_IN_SECONDS = 10;\n\nexport interface ClipPluginOptions {\n startTime: number;\n endTime: number;\n}\n\nexport class ClipPlugin extends Plugin {\n private _clipStart: number;\n private _clipEnd: number;\n private _isEnded: boolean;\n\n private playerEndedFn: () => boolean;\n private playerDurationFn: (seconds?: number) => number;\n private playerCurrentTimeFn: (seconds?: number, ...args: any[]) => number;\n private playerbufferedFn: () => TimeRanges;\n\n constructor(player: VideoJsPlayer, options: ClipPluginOptions) {\n super(player);\n\n // validate clip start/end\n if (options.startTime === undefined) {\n throw Error('Invalid clip start');\n }\n\n if (options.endTime === undefined) {\n throw Error('Invalid clip end');\n }\n\n if (options.startTime > options.endTime) {\n throw Error('Clip start cannot be greater than clip end');\n }\n\n this._clipStart = parseFloat(options.startTime.toPrecision(4));\n this._clipEnd = parseFloat(options.endTime.toPrecision(4));\n\n // save old player functions\n this.playerEndedFn = this.player.ended.bind(player);\n this.playerDurationFn = this.player.duration.bind(player);\n this.playerCurrentTimeFn = this.player.currentTime.bind(player);\n this.playerbufferedFn = this.player.buffered.bind(player);\n\n // overwrite the base player function with our new fancy ones\n this.player.ended = this.ended.bind(this);\n this.player.duration = this.duration.bind(this);\n this.player.currentTime = this.currentTime.bind(this);\n this.player.buffered = this.buffered.bind(this);\n\n this.initialize();\n\n this.player.ready(() => {\n // manually trigger a duation change since we have a new duration from the clip\n this.player.trigger('durationchange');\n });\n }\n\n /**\n * Ensure that the clip start is not greater than the total video duration\n */\n public get clipStart(): number {\n const videoDuration = this.playerDurationFn();\n\n if (this._clipStart > videoDuration)\n return videoDuration;\n\n return this._clipStart;\n }\n\n /**\n * Ensure that the clip end is not greater than the total video duration\n */\n public get clipEnd(): number {\n const videoDuration = this.playerDurationFn();\n\n // The video duration may not have been determined yet, so we can't do\n // any clamping right now..\n if (videoDuration <= 0)\n return this._clipEnd;\n\n // Clamp the clip end to the video duration\n if (this._clipEnd > videoDuration)\n return videoDuration;\n\n return this._clipEnd;\n }\n\n public dispose(): void {\n this.player.off('timeupdate', this.onTimeUpdate);\n this.player.off('play', this.onPlay);\n\n // put the original functions back\n this.player.ended = this.playerEndedFn;\n this.player.duration = this.playerDurationFn;\n this.player.currentTime = this.playerCurrentTimeFn;\n this.player.buffered = this.playerbufferedFn;\n\n // trigger another durationchange since the duration will now go back to the original\n this.player.trigger('durationchange');\n\n super.dispose();\n }\n\n private initialize(): void {\n this.onTimeUpdate = this.onTimeUpdate.bind(this);\n this.onPlay = this.onPlay.bind(this);\n\n this.player.on('timeupdate', this.onTimeUpdate);\n this.player.on('play', this.onPlay);\n }\n\n private onPlay(): void {\n // if we try to play but the clip has ended, go back to the start\n if (this._isEnded) {\n this.player.currentTime(0);\n }\n }\n\n private onTimeUpdate(): void {\n const currentTime = this.getCurrentTime(false);\n\n // check ended\n if (currentTime > this.clipEnd) {\n if (!this._isEnded) {\n this.player.pause();\n this.player.trigger('ended');\n \n this._isEnded = true;\n }\n\n return;\n }\n\n this._isEnded = false;\n\n // ensure video is playing from the correct clip start (taking into account some seek drift)\n if (currentTime < (this.clipStart - CLIP_SEEK_DRIFT_IN_SECONDS)) {\n this.playerCurrentTimeFn(this.clipStart, true);\n }\n }\n\n private ended(): boolean {\n return this.getCurrentTime(false) > this.clipEnd;\n }\n\n private duration(seconds?: number): number {\n // set the underlying player duration (and cache) if it hasn't been set already\n if (seconds && seconds > 0) {\n const existingDuration = this.playerDurationFn();\n\n if (existingDuration)\n console.info('The duration of the player has already been set. This is a no-op.');\n else\n this.playerDurationFn(seconds);\n }\n \n return this.clipEnd - this.clipStart;\n }\n\n private currentTime(seconds?: number, ...args: any[]): number {\n if (typeof seconds !== 'number') {\n return this.getCurrentTime(true);\n }\n\n const correctedSeconds = seconds + this.clipStart;\n\n this.playerCurrentTimeFn(correctedSeconds, ...args);\n\n return;\n }\n\n /**\n * Gets the current time of the video and updates the videojs currentTime cache\n * @param clipTime Set to true to return the current time in the context of a clip\n */\n private getCurrentTime(clipTime: boolean): number {\n const playerCurrentTime = this.playerCurrentTimeFn();\n let time = 0;\n\n if (playerCurrentTime >= this.clipStart) {\n time = playerCurrentTime - this.clipStart;\n }\n\n // ensure that the videojs currentTime cache reflects our fake time\n this.player.getCache().currentTime = time;\n\n if (clipTime)\n return time;\n\n return playerCurrentTime;\n }\n\n private buffered(): TimeRanges {\n const buff = this.playerbufferedFn();\n const ranges = [];\n\n for (let i = 0; i < buff.length; i++) {\n ranges[i] = [\n Math.max(0, buff.start(i) - this.clipStart),\n Math.min(Math.max(0, buff.end(i) - this.clipStart), this.player.duration())\n ];\n }\n\n return videojs.createTimeRanges(ranges as any);\n }\n}\n\nvideojs.registerPlugin('clipPlugin', ClipPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n clipPlugin(options: ClipPluginOptions): void;\n }\n}\n","export enum ShareActivityStatus {\n None = 'None',\n Complete = 'Complete',\n Incomplete = 'Incomplete'\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\n\nconst Button = videojs.getComponent('Button');\n\nimport './activity-status-button.scss';\n\ninterface ActivityStatusButtonOptions extends videojs.ComponentOptions {\n activityStatus: ShareActivityStatus;\n clickHandler: () => void;\n}\n\nexport class ActivityStatusButton extends Button {\n public options_: ActivityStatusButtonOptions;\n public controlText_: string;\n\n constructor(player: VideoJsPlayer, options: ActivityStatusButtonOptions) {\n super(player, options);\n\n this.update();\n }\n\n public update(): void {\n if (this.options_.activityStatus === ShareActivityStatus.Complete)\n this.addClass('cv-activity-completed');\n else\n this.removeClass('cv-activity-completed');\n }\n\n public handleClick(...args: any[]) {\n this.options_.activityStatus = this.getToggledActivityStatus();\n\n this.update();\n if (this.options_.clickHandler) {\n this.options_.clickHandler.call(this, args);\n }\n }\n\n public buildCSSClass(): string {\n return 'cv-activity-status-button';\n }\n\n private getToggledActivityStatus(): ShareActivityStatus {\n if (this.options_.activityStatus === ShareActivityStatus.None\n || this.options_.activityStatus === ShareActivityStatus.Incomplete) {\n return ShareActivityStatus.Complete;\n }\n\n if (this.options_.activityStatus === ShareActivityStatus.Complete) {\n return ShareActivityStatus.Incomplete;\n }\n }\n}\n\nActivityStatusButton.prototype.controlText_ = 'Complete';\n","import videojs from 'video.js';\n\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\n\nimport { ActivityStatusButton } from 'projects/player/plugins/activity-status-plugin/components/activity-status-button';\n\nconst Plugin = videojs.getPlugin('plugin');\n\nclass ActivityStatusPlugin extends Plugin {\n private activityStatus: ShareActivityStatus;\n private onToggleStatus: () => void;\n private button: ActivityStatusButton;\n\n public setActivityStatus(activityStatus: ShareActivityStatus, onToggleStatus: () => void): void {\n if (activityStatus === this.activityStatus)\n return;\n\n this.activityStatus = activityStatus;\n this.onToggleStatus = onToggleStatus;\n\n this.player.ready(() => {\n this.renderActivityStatusButton();\n });\n }\n\n // Remove old button and render new button when activity status is different from previous status\n private renderActivityStatusButton(): void {\n if (this.button) {\n this.player.removeChild(this.button);\n }\n\n this.button = new ActivityStatusButton(this.player, {\n activityStatus: this.activityStatus,\n clickHandler: this.onToggleStatus\n });\n\n this.player.addChild(this.button);\n }\n}\n\nvideojs.registerPlugin('activityStatusPlugin', ActivityStatusPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n activityStatusPlugin(): ActivityStatusPlugin;\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport './loop-video-menu-item.scss';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\nexport class LoopVideoMenuItem extends MenuItem {\n private toggleEl: Element;\n\n /**\n * Because we want to bind our listener in createEl\n * and createEl runs in super. We store if we've bounud\n * our handler, so we only call bind once and \n * the call to removeEventListener will still work\n */\n private handlerBound: boolean;\n\n constructor(player: VideoJsPlayer, options: videojs.ComponentOptions) {\n super(player, options);\n\n this.onLoopVideoChange = this.onLoopVideoChange.bind(this);\n\n this.player_.on('cv:loopvideo', this.onLoopVideoChange);\n\n this.onLoopVideoChange(null, this.player_.loopVideoPlugin().loop());\n }\n\n private onLoopVideoChange(_: any, enabled: boolean): void {\n enabled ? this.toggleOn() : this.toggleOff();\n }\n\n public handleToggle(): void {\n const loop = this.player_.loopVideoPlugin().loop();\n\n this.player_.loopVideoPlugin().loop(!loop);\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\n }\n\n /**\n * Because we extend MenuItem which will close the menu by default\n * we need to halt the event propogation here\n */\n public handleClick(event: videojs.EventTarget.Event): void {\n event.stopImmediatePropagation();\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): HTMLLIElement {\n /**\n * Bind our event listener only once\n * see the comment where handlerBound is defined\n */\n if (!this.handlerBound) {\n this.handleToggle = this.handleToggle.bind(this);\n this.handlerBound = true;\n }\n\n if (this.toggleEl)\n this.toggleEl.removeEventListener('click', this.handleToggle);\n\n this.toggleEl = videojs.dom.createEl('div', {\n className: `custom-toggle custom-toggle-info toggle-option float-end`,\n innerHTML: '<span class=\"handle\"></span></div>'\n });\n this.toggleEl.addEventListener('click', this.handleToggle);\n\n const innerHTML = `\n <span class=\"vjs-menu-item-text\">Loop video</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item cv-loop-video-toggle',\n innerHTML\n }, attributes);\n\n /**\n * Indexing into the child this way is only safe to do because\n * we know that the el only has two children\n */\n el.children[1].appendChild(this.toggleEl);\n\n return el;\n }\n\n public dispose(): void {\n this.player_.off('cv:loopvideo', this.onLoopVideoChange);\n super.dispose();\n }\n}\n\nvideojs.registerComponent('LoopVideoMenuItem', LoopVideoMenuItem);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\n\nimport 'projects/player/plugins/loop-video-plugin/components/loop-video-menu-item';\n\nconst Plugin = videojs.getPlugin('plugin');\nconst LoopVideoMenuItem = videojs.getComponent('LoopVideoMenuItem') as unknown as typeof videojs.MenuItem;\n\ninterface LoopVideoPluginOptions {\n allowLoop: boolean;\n}\n\nclass LoopVideoPlugin extends Plugin {\n constructor(player: VideoJsPlayer, options: LoopVideoPluginOptions) {\n super(player);\n\n // Button must be added after ctor finishes, otherwise subsequent calls to\n // this.player.loopVideoPlugin() will try make a new plugin - Sha\n if (options.allowLoop)\n this.player.ready(() => this.addButton());\n\n this.onEnded = this.onEnded.bind(this);\n this.player.on('ended', this.onEnded);\n }\n\n private addButton(): void {\n /**\n * Check additionalItemOrder in cog-button.ts if you need to change the order. - Sha\n */\n const cogButton = this.player.getChild('collapserator')?.getChild('cogButton') as CogButton;\n cogButton.addItem({ ctor: LoopVideoMenuItem, name: 'LoopVideoMenuItem' });\n }\n\n private onEnded(): void {\n // turns out the regular loop functionality doesn't work with clips.\n // this call will just do nothing for videos - Sha\n if (this.player.loop())\n this.player.play();\n }\n\n public loop(enabled: boolean): void;\n public loop(): boolean ;\n public loop(enabled?: boolean): any {\n if (typeof enabled !== 'boolean')\n return this.player.loop();\n\n if (enabled)\n this.player.nextVideoPlugin?.()?.setShouldPlayNext(false, false);\n\n this.player.trigger('cv:loopvideo', enabled);\n this.player.loop(enabled);\n }\n\n public dispose(): void {\n this.player.off('ended', this.onEnded);\n super.dispose();\n }\n}\n\nvideojs.registerPlugin('loopVideoPlugin', LoopVideoPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n loopVideoPlugin(options?: LoopVideoPluginOptions): LoopVideoPlugin;\n }\n}\n","// This file is using some horrid valuies\n// It needs to be re-written this was just quickly thrown together\n// to show something at retro - Sha\n\n.video-js {\n .cv-up-next-container {\n position: absolute;\n bottom: 1.5em;\n color: $white;\n padding: 0.8em;\n width: 19em;\n border-radius: 0.3333em;\n background: $menu-bg;\n right: 1.5em;\n font-size: 1.5em;\n z-index: 6;\n }\n\n .cv-cancel-up-next {\n position: absolute;\n top: 0;\n right: 0.4em;\n font-size: 2em;\n }\n\n .cv-up-next-image {\n padding-bottom: 56.25%;\n background-size: contain;\n border-radius: 0.3333em;\n background-color: linear-gradient(to right, $gray-300, $gray-100);\n }\n\n .cv-up-next-heading {\n color: $white;\n padding-bottom: 0.6em;\n }\n\n .cv-up-next-title {\n color: $white;\n padding-top: 0.6em;\n }\n}","import * as React from 'react';\nimport videojs, { VideoJsPlayer } from 'video.js';\n\nimport { NextVideo } from 'projects/player/interfaces/NextVideo';\nimport { getReactComponent } from 'projects/player/react/react-component';\n\nimport './up-next.scss';\n\ninterface UpNextProps {\n player: VideoJsPlayer;\n nextVideo: NextVideo;\n onPlayNext: () => void;\n onCancel: () => void;\n}\n\nfunction UpNext(props: UpNextProps): JSX.Element {\n const [ timeRemaining, setTimeRemaining ] = React.useState(5);\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n setTimeRemaining(prev => prev - 1);\n }, 1000);\n\n return () => {\n clearInterval(timer);\n };\n }, []);\n\n React.useEffect(() => {\n if (timeRemaining === 0)\n props.onPlayNext();\n }, [timeRemaining]);\n\n if (!props.nextVideo || !props.onPlayNext)\n return <></>;\n\n const roundedTimeRemaining = Math.ceil(timeRemaining);\n const secondsString = roundedTimeRemaining === 1 ? 'second' : 'seconds';\n\n return (\n <>\n <div className='cv-up-next-container'>\n <div className='cv-cancel-up-next cursor-pointer' role='button' onClick={props.onCancel}>&times;</div>\n <div className='cv-up-next-heading'>Up next in {roundedTimeRemaining} {secondsString}:</div>\n <div\n className='cv-up-next-image cursor-pointer'\n onClick={props.onPlayNext}\n style={{\n backgroundImage: `url(${props.nextVideo?.thumbnailUrl})`\n }}\n ></div>\n <div className='cv-up-next-title'>{props.nextVideo.name}</div>\n </div>\n </>\n );\n}\n\nvideojs.registerComponent(\n 'UpNext',\n getReactComponent(\n (player: VideoJsPlayer, options: UpNextProps) => <UpNext player={player} {...options} />\n )\n);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport './next-video-menu-item.scss';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\nclass NextVideoMenuItem extends MenuItem {\n private toggleEl: Element;\n\n /**\n * Because we want to bind our listener in createEl\n * and createEl runs in super. We store if we've bounud\n * our handler, so we only call bind once and \n * the call to removeEventListener will still work\n */\n private handlerBound: boolean;\n\n constructor(player: VideoJsPlayer, options: videojs.ComponentOptions) {\n super(player, options);\n\n this.bindListeners();\n\n if (this.player_.nextVideoPlugin().getShouldPlayNext())\n this.toggleOn();\n }\n\n private bindListeners(): void {\n this.onPlayNextChange = this.onPlayNextChange.bind(this);\n\n this.player_.on('cv:playnext', this.onPlayNextChange);\n }\n\n public handleToggle(): void {\n const shouldPlayNext = this.player_.nextVideoPlugin().getShouldPlayNext();\n\n this.player_.nextVideoPlugin().setShouldPlayNext(!shouldPlayNext, true);\n }\n\n private onPlayNextChange(_: any, enabled: boolean): void {\n enabled ? this.toggleOn() : this.toggleOff();\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\n }\n\n /**\n * Because we extend MenuItem which will close the menu by default\n * we need to halt the event propogation here\n */\n public handleClick(event: videojs.EventTarget.Event): void {\n event.stopImmediatePropagation();\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): HTMLLIElement {\n /**\n * Bind our event listener only once\n * see the comment where handlerBound is defined\n */\n if (!this.handlerBound) {\n this.handleToggle = this.handleToggle.bind(this);\n this.handlerBound = true;\n }\n\n if (this.toggleEl)\n this.toggleEl.removeEventListener('click', this.handleToggle);\n\n this.toggleEl = videojs.dom.createEl('div', {\n className: `custom-toggle custom-toggle-info toggle-option float-end`,\n innerHTML: '<span class=\"handle\"></span></div>'\n });\n this.toggleEl.addEventListener('click', this.handleToggle);\n\n const innerHTML = `\n <span class=\"vjs-menu-item-text\">Play next video</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item cv-play-next-toggle',\n innerHTML\n }, attributes);\n\n /**\n * Indexing into the child this way is only safe to do because\n * we know that the el only has two children\n */\n el.children[1].appendChild(this.toggleEl);\n\n return el;\n }\n\n public dispose(): void {\n this.player_.off('cv:playnext', this.onPlayNextChange);\n super.dispose();\n }\n}\n\nvideojs.registerComponent('NextVideoMenuItem', NextVideoMenuItem);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\nimport { NextVideo } from 'projects/player/interfaces/NextVideo';\nimport { TrackHelper } from 'projects/player/utils/track-helper';\n\nimport 'projects/player/plugins/next-video-plugin/components/up-next/up-next';\nimport 'projects/player/components/next-video-menu-item/next-video-menu-item';\n\nconst TEST = 'cv-persisttest';\nconst PLAY_NEXT = 'cv-play-next-video';\n\nconst Plugin = videojs.getPlugin('plugin');\nconst NextVideoMenuItem = videojs.getComponent('NextVideoMenuItem') as unknown as typeof videojs.MenuItem;\n\nclass NextVideoPlugin extends Plugin {\n private shouldPlayNextVideo: boolean;\n private hasLocalStorage: boolean;\n private nextVideoMenuItem: typeof videojs.MenuItem;\n\n private upNextRendered: boolean;\n\n private nextVideo: NextVideo;\n private callback: () => void;\n \n constructor(player: VideoJsPlayer) {\n super(player);\n\n this.setShouldPlayNext = this.setShouldPlayNext.bind(this);\n this.getShouldPlayNext = this.getShouldPlayNext.bind(this);\n this.getChapterTrack = this.getChapterTrack.bind(this);\n this.onTimeUpdate = this.onTimeUpdate.bind(this);\n\n this.hasLocalStorage = this.testHasLocalStorage();\n\n this.shouldPlayNextVideo = false;\n\n if (this.hasLocalStorage) {\n const item = window.localStorage.getItem(PLAY_NEXT);\n this.shouldPlayNextVideo = item === 'true';\n }\n\n player.ready(() => {\n this.initialize();\n });\n }\n \n private initialize(): void {\n if ((this.player as any).isDisposed())\n return;\n \n this.bindListeners();\n }\n\n private getChapterTrack(): TextTrack {\n return TrackHelper.getTrack(this.player, 'chapters', null);\n }\n\n public setNextVideo(nextVideo: NextVideo, playNext: boolean, callback: () => void): void {\n this.nextVideo = nextVideo;\n this.callback = callback;\n\n if (playNext)\n this.setShouldPlayNext(true);\n\n /**\n * Check additionalItemOrder in cog-button.ts if you need to change the order. - Sha\n */\n const cogButton = this.player.getChild('collapserator')?.getChild('cogButton') as CogButton;\n cogButton.addItem({ ctor: NextVideoMenuItem, name: 'NextVideoMenuItem' });\n }\n\n public getShouldPlayNext(): boolean {\n return this.shouldPlayNextVideo;\n }\n\n public setShouldPlayNext(val: boolean, persist?: boolean): void {\n this.shouldPlayNextVideo = val;\n this.player.trigger('cv:playnext', val);\n\n if (this.hasLocalStorage && persist)\n window.localStorage.setItem(PLAY_NEXT, val.toString());\n\n if (val)\n this.player.loopVideoPlugin().loop(false);\n }\n\n private bindListeners(): void {\n this.player.on('timeupdate', this.onTimeUpdate);\n }\n\n public dispose(): void {\n this.player.off('timeupdate', this.onTimeUpdate);\n\n this.hideUpNext();\n\n super.dispose();\n }\n\n private onTimeUpdate(): void {\n /**\n * Do nothing when in picture in picture.\n * TODO: Figure out how next video should work for PiP\n */\n if (this.player.pictureInPicture && this.player.isInPictureInPicture())\n return;\n\n if (!this.getShouldPlayNext()) {\n this.hideUpNext();\n return;\n }\n\n /*\n * Always hide the up-next tile if the video is not at the end\n */\n if (this.upNextRendered && this.player.currentTime() < this.player.duration()) {\n this.hideUpNext();\n return;\n }\n\n /*\n * Show the up-next tile when the video has finished\n */\n if (this.player.ended()) {\n this.showUpNext();\n }\n }\n\n private showUpNext(): void {\n if (this.upNextRendered)\n return;\n\n this.upNextRendered = true;\n\n this.player.addChild('UpNext', {\n nextVideo: this.nextVideo,\n onPlayNext: this.callback,\n onCancel: () => {\n this.hideUpNext();\n this.setShouldPlayNext(false);\n }\n });\n }\n\n private hideUpNext(): void {\n if (!this.upNextRendered)\n return;\n\n this.upNextRendered = false;\n\n const upNext = this.player.getChild('UpNext');\n\n if (upNext) {\n this.player.removeChild(upNext);\n upNext.dispose();\n }\n }\n\n private testHasLocalStorage(): boolean {\n try {\n window.localStorage.setItem(TEST, 'persistPlayNext');\n window.localStorage.removeItem(TEST);\n return true;\n } catch {\n return false;\n }\n }\n}\n\nvideojs.registerPlugin('nextVideoPlugin', NextVideoPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n nextVideoPlugin(): NextVideoPlugin;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CzCUe0Ej.chunk.js","names":[],"sources":["../../../../../../player/src/plugins/clip-plugin/clip-plugin.ts","../../../../../../../libs/shared/src/enums/ShareActivityStatus.ts","../../../../../../player/src/plugins/activity-status-plugin/components/activity-status-button.ts","../../../../../../player/src/plugins/activity-status-plugin/activity-status-plugin.ts","../../../../../../player/src/plugins/loop-video-plugin/components/loop-video-menu-item.ts","../../../../../../player/src/plugins/loop-video-plugin/loop-video-plugin.ts","../../../../../../player/src/plugins/next-video-plugin/components/up-next/up-next.scss","../../../../../../player/src/plugins/next-video-plugin/components/up-next/up-next.tsx","../../../../../../player/src/components/next-video-menu-item/next-video-menu-item.ts","../../../../../../player/src/plugins/next-video-plugin/next-video-plugin.ts"],"sourcesContent":["import videojs, { VideoJsPlayer } from 'video.js';\n\nconst Plugin = videojs.getPlugin('plugin');\n\n/**\n * TODO:\n * The value below is set quite high to compensate for the ridiculous amount of drift that can occur\n * when casting to a Vivi device. This is a temporary fix until we can get Vivi to fix the issue on their end.\n */\nconst CLIP_SEEK_DRIFT_IN_SECONDS = 10;\n\nexport interface ClipPluginOptions {\n startTime: number;\n endTime: number;\n}\n\nexport class ClipPlugin extends Plugin {\n private _clipStart: number;\n private _clipEnd: number;\n private _isEnded: boolean;\n\n private playerEndedFn: () => boolean;\n private playerDurationFn: (seconds?: number) => number;\n private playerCurrentTimeFn: (seconds?: number, ...args: any[]) => number;\n private playerbufferedFn: () => TimeRanges;\n\n constructor(player: VideoJsPlayer, options: ClipPluginOptions) {\n super(player);\n\n // validate clip start/end\n if (options.startTime === undefined) {\n throw Error('Invalid clip start');\n }\n\n if (options.endTime === undefined) {\n throw Error('Invalid clip end');\n }\n\n if (options.startTime > options.endTime) {\n throw Error('Clip start cannot be greater than clip end');\n }\n\n this._clipStart = parseFloat(options.startTime.toPrecision(4));\n this._clipEnd = parseFloat(options.endTime.toPrecision(4));\n\n // save old player functions\n this.playerEndedFn = this.player.ended.bind(player);\n this.playerDurationFn = this.player.duration.bind(player);\n this.playerCurrentTimeFn = this.player.currentTime.bind(player);\n this.playerbufferedFn = this.player.buffered.bind(player);\n\n // overwrite the base player function with our new fancy ones\n this.player.ended = this.ended.bind(this);\n this.player.duration = this.duration.bind(this);\n this.player.currentTime = this.currentTime.bind(this);\n this.player.buffered = this.buffered.bind(this);\n\n this.initialize();\n\n this.player.ready(() => {\n // manually trigger a duation change since we have a new duration from the clip\n this.player.trigger('durationchange');\n });\n }\n\n /**\n * Ensure that the clip start is not greater than the total video duration\n */\n public get clipStart(): number {\n const videoDuration = this.playerDurationFn();\n\n if (this._clipStart > videoDuration)\n return videoDuration;\n\n return this._clipStart;\n }\n\n /**\n * Ensure that the clip end is not greater than the total video duration\n */\n public get clipEnd(): number {\n const videoDuration = this.playerDurationFn();\n\n // The video duration may not have been determined yet, so we can't do\n // any clamping right now..\n if (videoDuration <= 0)\n return this._clipEnd;\n\n // Clamp the clip end to the video duration\n if (this._clipEnd > videoDuration)\n return videoDuration;\n\n return this._clipEnd;\n }\n\n public dispose(): void {\n this.player.off('timeupdate', this.onTimeUpdate);\n this.player.off('play', this.onPlay);\n\n // put the original functions back\n this.player.ended = this.playerEndedFn;\n this.player.duration = this.playerDurationFn;\n this.player.currentTime = this.playerCurrentTimeFn;\n this.player.buffered = this.playerbufferedFn;\n\n // trigger another durationchange since the duration will now go back to the original\n this.player.trigger('durationchange');\n\n super.dispose();\n }\n\n private initialize(): void {\n this.onTimeUpdate = this.onTimeUpdate.bind(this);\n this.onPlay = this.onPlay.bind(this);\n\n this.player.on('timeupdate', this.onTimeUpdate);\n this.player.on('play', this.onPlay);\n }\n\n private onPlay(): void {\n // if we try to play but the clip has ended, go back to the start\n if (this._isEnded) {\n this.player.currentTime(0);\n }\n }\n\n private onTimeUpdate(): void {\n const currentTime = this.getCurrentTime(false);\n\n // check ended\n if (currentTime > this.clipEnd) {\n if (!this._isEnded) {\n this.player.pause();\n this.player.trigger('ended');\n \n this._isEnded = true;\n }\n\n return;\n }\n\n this._isEnded = false;\n\n // ensure video is playing from the correct clip start (taking into account some seek drift)\n if (currentTime < (this.clipStart - CLIP_SEEK_DRIFT_IN_SECONDS)) {\n this.playerCurrentTimeFn(this.clipStart, true);\n }\n }\n\n private ended(): boolean {\n return this.getCurrentTime(false) > this.clipEnd;\n }\n\n private duration(seconds?: number): number {\n // set the underlying player duration (and cache) if it hasn't been set already\n if (seconds && seconds > 0) {\n const existingDuration = this.playerDurationFn();\n\n if (existingDuration)\n console.info('The duration of the player has already been set. This is a no-op.');\n else\n this.playerDurationFn(seconds);\n }\n \n return this.clipEnd - this.clipStart;\n }\n\n private currentTime(seconds?: number, ...args: any[]): number {\n if (typeof seconds !== 'number') {\n return this.getCurrentTime(true);\n }\n\n const correctedSeconds = seconds + this.clipStart;\n\n this.playerCurrentTimeFn(correctedSeconds, ...args);\n\n return;\n }\n\n /**\n * Gets the current time of the video and updates the videojs currentTime cache\n * @param clipTime Set to true to return the current time in the context of a clip\n */\n private getCurrentTime(clipTime: boolean): number {\n const playerCurrentTime = this.playerCurrentTimeFn();\n let time = 0;\n\n if (playerCurrentTime >= this.clipStart) {\n time = playerCurrentTime - this.clipStart;\n }\n\n // ensure that the videojs currentTime cache reflects our fake time\n this.player.getCache().currentTime = time;\n\n if (clipTime)\n return time;\n\n return playerCurrentTime;\n }\n\n private buffered(): TimeRanges {\n const buff = this.playerbufferedFn();\n const ranges = [];\n\n for (let i = 0; i < buff.length; i++) {\n ranges[i] = [\n Math.max(0, buff.start(i) - this.clipStart),\n Math.min(Math.max(0, buff.end(i) - this.clipStart), this.player.duration())\n ];\n }\n\n return videojs.createTimeRanges(ranges as any);\n }\n}\n\nvideojs.registerPlugin('clipPlugin', ClipPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n clipPlugin(options: ClipPluginOptions): void;\n }\n}\n","export enum ShareActivityStatus {\n None = 'None',\n Complete = 'Complete',\n Incomplete = 'Incomplete'\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\n\nconst Button = videojs.getComponent('Button');\n\nimport './activity-status-button.scss';\n\ninterface ActivityStatusButtonOptions extends videojs.ComponentOptions {\n activityStatus: ShareActivityStatus;\n clickHandler: () => void;\n}\n\nexport class ActivityStatusButton extends Button {\n public options_: ActivityStatusButtonOptions;\n public controlText_: string;\n\n constructor(player: VideoJsPlayer, options: ActivityStatusButtonOptions) {\n super(player, options);\n\n this.update();\n }\n\n public update(): void {\n if (this.options_.activityStatus === ShareActivityStatus.Complete)\n this.addClass('cv-activity-completed');\n else\n this.removeClass('cv-activity-completed');\n }\n\n public handleClick(...args: any[]) {\n this.options_.activityStatus = this.getToggledActivityStatus();\n\n this.update();\n if (this.options_.clickHandler) {\n this.options_.clickHandler.call(this, args);\n }\n }\n\n public buildCSSClass(): string {\n return 'cv-activity-status-button';\n }\n\n private getToggledActivityStatus(): ShareActivityStatus {\n if (this.options_.activityStatus === ShareActivityStatus.None\n || this.options_.activityStatus === ShareActivityStatus.Incomplete) {\n return ShareActivityStatus.Complete;\n }\n\n if (this.options_.activityStatus === ShareActivityStatus.Complete) {\n return ShareActivityStatus.Incomplete;\n }\n }\n}\n\nActivityStatusButton.prototype.controlText_ = 'Complete';\n","import videojs from 'video.js';\n\nimport { ShareActivityStatus } from 'libs/shared/enums/ShareActivityStatus';\n\nimport { ActivityStatusButton } from 'projects/player/plugins/activity-status-plugin/components/activity-status-button';\n\nconst Plugin = videojs.getPlugin('plugin');\n\nclass ActivityStatusPlugin extends Plugin {\n private activityStatus: ShareActivityStatus;\n private onToggleStatus: () => void;\n private button: ActivityStatusButton;\n\n public setActivityStatus(activityStatus: ShareActivityStatus, onToggleStatus: () => void): void {\n if (activityStatus === this.activityStatus)\n return;\n\n this.activityStatus = activityStatus;\n this.onToggleStatus = onToggleStatus;\n\n this.player.ready(() => {\n this.renderActivityStatusButton();\n });\n }\n\n // Remove old button and render new button when activity status is different from previous status\n private renderActivityStatusButton(): void {\n if (this.button) {\n this.player.removeChild(this.button);\n }\n\n this.button = new ActivityStatusButton(this.player, {\n activityStatus: this.activityStatus,\n clickHandler: this.onToggleStatus\n });\n\n this.player.addChild(this.button);\n }\n}\n\nvideojs.registerPlugin('activityStatusPlugin', ActivityStatusPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n activityStatusPlugin(): ActivityStatusPlugin;\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport './loop-video-menu-item.scss';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\nexport class LoopVideoMenuItem extends MenuItem {\n private toggleEl: Element;\n\n /**\n * Because we want to bind our listener in createEl\n * and createEl runs in super. We store if we've bounud\n * our handler, so we only call bind once and \n * the call to removeEventListener will still work\n */\n private handlerBound: boolean;\n\n constructor(player: VideoJsPlayer, options: videojs.ComponentOptions) {\n super(player, options);\n\n this.onLoopVideoChange = this.onLoopVideoChange.bind(this);\n\n this.player_.on('cv:loopvideo', this.onLoopVideoChange);\n\n this.onLoopVideoChange(null, this.player_.loopVideoPlugin().loop());\n }\n\n private onLoopVideoChange(_: any, enabled: boolean): void {\n enabled ? this.toggleOn() : this.toggleOff();\n }\n\n public handleToggle(): void {\n const loop = this.player_.loopVideoPlugin().loop();\n\n this.player_.loopVideoPlugin().loop(!loop);\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\n }\n\n /**\n * Because we extend MenuItem which will close the menu by default\n * we need to halt the event propogation here\n */\n public handleClick(event: videojs.EventTarget.Event): void {\n event.stopImmediatePropagation();\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): HTMLLIElement {\n /**\n * Bind our event listener only once\n * see the comment where handlerBound is defined\n */\n if (!this.handlerBound) {\n this.handleToggle = this.handleToggle.bind(this);\n this.handlerBound = true;\n }\n\n if (this.toggleEl)\n this.toggleEl.removeEventListener('click', this.handleToggle);\n\n this.toggleEl = videojs.dom.createEl('div', {\n className: `custom-toggle custom-toggle-info toggle-option float-end`,\n innerHTML: '<span class=\"handle\"></span></div>'\n });\n this.toggleEl.addEventListener('click', this.handleToggle);\n\n const innerHTML = `\n <span class=\"vjs-menu-item-text\">Loop video</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item cv-loop-video-toggle',\n innerHTML\n }, attributes);\n\n /**\n * Indexing into the child this way is only safe to do because\n * we know that the el only has two children\n */\n el.children[1].appendChild(this.toggleEl);\n\n return el;\n }\n\n public dispose(): void {\n this.player_.off('cv:loopvideo', this.onLoopVideoChange);\n super.dispose();\n }\n}\n\nvideojs.registerComponent('LoopVideoMenuItem', LoopVideoMenuItem);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\n\nimport 'projects/player/plugins/loop-video-plugin/components/loop-video-menu-item';\n\nconst Plugin = videojs.getPlugin('plugin');\nconst LoopVideoMenuItem = videojs.getComponent('LoopVideoMenuItem') as unknown as typeof videojs.MenuItem;\n\ninterface LoopVideoPluginOptions {\n allowLoop: boolean;\n}\n\nclass LoopVideoPlugin extends Plugin {\n constructor(player: VideoJsPlayer, options: LoopVideoPluginOptions) {\n super(player);\n\n // Button must be added after ctor finishes, otherwise subsequent calls to\n // this.player.loopVideoPlugin() will try make a new plugin - Sha\n if (options.allowLoop)\n this.player.ready(() => this.addButton());\n\n this.onEnded = this.onEnded.bind(this);\n this.player.on('ended', this.onEnded);\n }\n\n private addButton(): void {\n /**\n * Check additionalItemOrder in cog-button.ts if you need to change the order. - Sha\n */\n const cogButton = this.player.getChild('collapserator')?.getChild('cogButton') as CogButton;\n cogButton.addItem({ ctor: LoopVideoMenuItem, name: 'LoopVideoMenuItem' });\n }\n\n private onEnded(): void {\n // turns out the regular loop functionality doesn't work with clips.\n // this call will just do nothing for videos - Sha\n if (this.player.loop())\n this.player.play();\n }\n\n public loop(enabled: boolean): void;\n public loop(): boolean ;\n public loop(enabled?: boolean): any {\n if (typeof enabled !== 'boolean')\n return this.player.loop();\n\n if (enabled)\n this.player.nextVideoPlugin?.()?.setShouldPlayNext(false, false);\n\n this.player.trigger('cv:loopvideo', enabled);\n this.player.loop(enabled);\n }\n\n public dispose(): void {\n this.player.off('ended', this.onEnded);\n super.dispose();\n }\n}\n\nvideojs.registerPlugin('loopVideoPlugin', LoopVideoPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n loopVideoPlugin(options?: LoopVideoPluginOptions): LoopVideoPlugin;\n }\n}\n","// This file is using some horrid valuies\n// It needs to be re-written this was just quickly thrown together\n// to show something at retro - Sha\n\n.video-js {\n .cv-up-next-container {\n position: absolute;\n bottom: 1.5em;\n color: $white;\n padding: 0.8em;\n width: 19em;\n border-radius: 0.3333em;\n background: $menu-bg;\n right: 1.5em;\n font-size: 1.5em;\n z-index: 6;\n }\n\n .cv-cancel-up-next {\n position: absolute;\n top: 0;\n right: 0.4em;\n font-size: 2em;\n }\n\n .cv-up-next-image {\n padding-bottom: 56.25%;\n background-size: contain;\n border-radius: 0.3333em;\n background-color: linear-gradient(to right, $gray-300, $gray-100);\n }\n\n .cv-up-next-heading {\n color: $white;\n padding-bottom: 0.6em;\n }\n\n .cv-up-next-title {\n color: $white;\n padding-top: 0.6em;\n }\n}","import * as React from 'react';\nimport videojs, { VideoJsPlayer } from 'video.js';\n\nimport { NextVideo } from 'projects/player/interfaces/NextVideo';\nimport { getReactComponent } from 'projects/player/react/react-component';\n\nimport './up-next.scss';\n\ninterface UpNextProps {\n player: VideoJsPlayer;\n nextVideo: NextVideo;\n onPlayNext: () => void;\n onCancel: () => void;\n}\n\nfunction UpNext(props: UpNextProps): JSX.Element {\n const [ timeRemaining, setTimeRemaining ] = React.useState(5);\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n setTimeRemaining(prev => prev - 1);\n }, 1000);\n\n return () => {\n clearInterval(timer);\n };\n }, []);\n\n React.useEffect(() => {\n if (timeRemaining === 0)\n props.onPlayNext();\n }, [timeRemaining]);\n\n if (!props.nextVideo || !props.onPlayNext)\n return <></>;\n\n const roundedTimeRemaining = Math.ceil(timeRemaining);\n const secondsString = roundedTimeRemaining === 1 ? 'second' : 'seconds';\n\n return (\n <>\n <div className='cv-up-next-container'>\n <div className='cv-cancel-up-next cursor-pointer' role='button' onClick={props.onCancel}>&times;</div>\n <div className='cv-up-next-heading'>Up next in {roundedTimeRemaining} {secondsString}:</div>\n <div\n className='cv-up-next-image cursor-pointer'\n onClick={props.onPlayNext}\n style={{\n backgroundImage: `url(${props.nextVideo?.thumbnailUrl})`\n }}\n ></div>\n <div className='cv-up-next-title'>{props.nextVideo.name}</div>\n </div>\n </>\n );\n}\n\nvideojs.registerComponent(\n 'UpNext',\n getReactComponent(\n (player: VideoJsPlayer, options: UpNextProps) => <UpNext player={player} {...options} />\n )\n);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport './next-video-menu-item.scss';\n\nconst MenuItem = videojs.getComponent('MenuItem');\n\nclass NextVideoMenuItem extends MenuItem {\n private toggleEl: Element;\n\n /**\n * Because we want to bind our listener in createEl\n * and createEl runs in super. We store if we've bounud\n * our handler, so we only call bind once and \n * the call to removeEventListener will still work\n */\n private handlerBound: boolean;\n\n constructor(player: VideoJsPlayer, options: videojs.ComponentOptions) {\n super(player, options);\n\n this.bindListeners();\n\n if (this.player_.nextVideoPlugin().getShouldPlayNext())\n this.toggleOn();\n }\n\n private bindListeners(): void {\n this.onPlayNextChange = this.onPlayNextChange.bind(this);\n\n this.player_.on('cv:playnext', this.onPlayNextChange);\n }\n\n public handleToggle(): void {\n const shouldPlayNext = this.player_.nextVideoPlugin().getShouldPlayNext();\n\n this.player_.nextVideoPlugin().setShouldPlayNext(!shouldPlayNext, true);\n }\n\n private onPlayNextChange(_: any, enabled: boolean): void {\n enabled ? this.toggleOn() : this.toggleOff();\n }\n\n private toggleOn(): void {\n videojs.dom.addClass(this.toggleEl, 'on');\n }\n\n private toggleOff(): void {\n videojs.dom.removeClass(this.toggleEl, 'on');\n }\n\n /**\n * Because we extend MenuItem which will close the menu by default\n * we need to halt the event propogation here\n */\n public handleClick(event: videojs.EventTarget.Event): void {\n event.stopImmediatePropagation();\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): HTMLLIElement {\n /**\n * Bind our event listener only once\n * see the comment where handlerBound is defined\n */\n if (!this.handlerBound) {\n this.handleToggle = this.handleToggle.bind(this);\n this.handlerBound = true;\n }\n\n if (this.toggleEl)\n this.toggleEl.removeEventListener('click', this.handleToggle);\n\n this.toggleEl = videojs.dom.createEl('div', {\n className: `custom-toggle custom-toggle-info toggle-option float-end`,\n innerHTML: '<span class=\"handle\"></span></div>'\n });\n this.toggleEl.addEventListener('click', this.handleToggle);\n\n const innerHTML = `\n <span class=\"vjs-menu-item-text\">Play next video</span>\n <span class=\"cv-toggle-container\"></span>`;\n\n const el = super.createEl(tagName, {\n className: 'vjs-menu-item cv-cog-menu-item cv-play-next-toggle',\n innerHTML\n }, attributes);\n\n /**\n * Indexing into the child this way is only safe to do because\n * we know that the el only has two children\n */\n el.children[1].appendChild(this.toggleEl);\n\n return el;\n }\n\n public dispose(): void {\n this.player_.off('cv:playnext', this.onPlayNextChange);\n super.dispose();\n }\n}\n\nvideojs.registerComponent('NextVideoMenuItem', NextVideoMenuItem);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport { CogButton } from 'projects/player/components/cog-button/cog-button';\nimport { NextVideo } from 'projects/player/interfaces/NextVideo';\nimport { TrackHelper } from 'projects/player/utils/track-helper';\n\nimport 'projects/player/plugins/next-video-plugin/components/up-next/up-next';\nimport 'projects/player/components/next-video-menu-item/next-video-menu-item';\n\nconst TEST = 'cv-persisttest';\nconst PLAY_NEXT = 'cv-play-next-video';\n\nconst Plugin = videojs.getPlugin('plugin');\nconst NextVideoMenuItem = videojs.getComponent('NextVideoMenuItem') as unknown as typeof videojs.MenuItem;\n\nclass NextVideoPlugin extends Plugin {\n private shouldPlayNextVideo: boolean;\n private hasLocalStorage: boolean;\n private nextVideoMenuItem: typeof videojs.MenuItem;\n\n private upNextRendered: boolean;\n\n private nextVideo: NextVideo;\n private callback: () => void;\n \n constructor(player: VideoJsPlayer) {\n super(player);\n\n this.setShouldPlayNext = this.setShouldPlayNext.bind(this);\n this.getShouldPlayNext = this.getShouldPlayNext.bind(this);\n this.getChapterTrack = this.getChapterTrack.bind(this);\n this.onTimeUpdate = this.onTimeUpdate.bind(this);\n\n this.hasLocalStorage = this.testHasLocalStorage();\n\n this.shouldPlayNextVideo = false;\n\n if (this.hasLocalStorage) {\n const item = window.localStorage.getItem(PLAY_NEXT);\n this.shouldPlayNextVideo = item === 'true';\n }\n\n player.ready(() => {\n this.initialize();\n });\n }\n \n private initialize(): void {\n if ((this.player as any).isDisposed())\n return;\n \n this.bindListeners();\n }\n\n private getChapterTrack(): TextTrack {\n return TrackHelper.getTrack(this.player, 'chapters', null);\n }\n\n public setNextVideo(nextVideo: NextVideo, playNext: boolean, callback: () => void): void {\n this.nextVideo = nextVideo;\n this.callback = callback;\n\n if (playNext)\n this.setShouldPlayNext(true);\n\n /**\n * Check additionalItemOrder in cog-button.ts if you need to change the order. - Sha\n */\n const cogButton = this.player.getChild('collapserator')?.getChild('cogButton') as CogButton;\n cogButton.addItem({ ctor: NextVideoMenuItem, name: 'NextVideoMenuItem' });\n }\n\n public getShouldPlayNext(): boolean {\n return this.shouldPlayNextVideo;\n }\n\n public setShouldPlayNext(val: boolean, persist?: boolean): void {\n this.shouldPlayNextVideo = val;\n this.player.trigger('cv:playnext', val);\n\n if (this.hasLocalStorage && persist)\n window.localStorage.setItem(PLAY_NEXT, val.toString());\n\n if (val)\n this.player.loopVideoPlugin().loop(false);\n }\n\n private bindListeners(): void {\n this.player.on('timeupdate', this.onTimeUpdate);\n }\n\n public dispose(): void {\n this.player.off('timeupdate', this.onTimeUpdate);\n\n this.hideUpNext();\n\n super.dispose();\n }\n\n private onTimeUpdate(): void {\n /**\n * Do nothing when in picture in picture.\n * TODO: Figure out how next video should work for PiP\n */\n if (this.player.pictureInPicture && this.player.isInPictureInPicture())\n return;\n\n if (!this.getShouldPlayNext()) {\n this.hideUpNext();\n return;\n }\n\n /*\n * Always hide the up-next tile if the video is not at the end\n */\n if (this.upNextRendered && this.player.currentTime() < this.player.duration()) {\n this.hideUpNext();\n return;\n }\n\n /*\n * Show the up-next tile when the video has finished\n */\n if (this.player.ended()) {\n this.showUpNext();\n }\n }\n\n private showUpNext(): void {\n if (this.upNextRendered)\n return;\n\n this.upNextRendered = true;\n\n this.player.addChild('UpNext', {\n nextVideo: this.nextVideo,\n onPlayNext: this.callback,\n onCancel: () => {\n this.hideUpNext();\n this.setShouldPlayNext(false);\n }\n });\n }\n\n private hideUpNext(): void {\n if (!this.upNextRendered)\n return;\n\n this.upNextRendered = false;\n\n const upNext = this.player.getChild('UpNext');\n\n if (upNext) {\n this.player.removeChild(upNext);\n upNext.dispose();\n }\n }\n\n private testHasLocalStorage(): boolean {\n try {\n window.localStorage.setItem(TEST, 'persistPlayNext');\n window.localStorage.removeItem(TEST);\n return true;\n } catch {\n return false;\n }\n }\n}\n\nvideojs.registerPlugin('nextVideoPlugin', NextVideoPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n nextVideoPlugin(): NextVideoPlugin;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as e,ln as t,r as n}from"./BlDu0qdC.chunk.js";import{c as r}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as i}from"./Dky2FRAZ.chunk.js";import{t as a}from"./BJlEATFT.chunk.js";import{t as o}from"./C-KuBn_h.chunk.js";import{t as s}from"./DOntBv0G.chunk.js";import{c,i as l,t as u}from"./ZWXQm8ZX.chunk.js";import{n as d,t as f}from"./C0g24IgE.chunk.js";import{r as p,t as m}from"./BZzcezvm2.chunk.js";import{t as h}from"./BPLykIUZ.chunk.js";import{t as g}from"./Dxf39xUf.chunk.js";import{t as _}from"./mu0dRjvG.chunk.js";import{t as v}from"./o9SGrxYm2.chunk.js";var y=t(e()),b={listContainer:`_listContainer_7fk7e_1`},x=n();function S(){let e=d(),{errors:t,touched:n}=c(),r=p.getCustomFormControlClassName(t,n,`name`);return(0,x.jsxs)(l,{children:[(0,x.jsx)(a.Label,{htmlFor:`name`,children:`Name`}),(0,x.jsxs)(`div`,{className:`input-group`,children:[(0,x.jsx)(m,{type:`text`,name:`name`,id:`name`,placeholder:`Name your new workbench list`,autoFocus:!0,value:e.values.name,className:r}),(0,x.jsx)(g,{isNew:!0,submitText:`Create and add`,variant:`outline-dark`,className:`border border-secondary`}),(0,x.jsx)(u,{name:`name`,children:e=>(0,x.jsx)(a.Control.Feedback,{type:`invalid`,children:e})})]})]})}function C(e){let{workingLists:t,isInWorkingList:n,createWorkingList:a,addToWorkingList:c,removeFromWorkingList:l}=_(),[u,d]=y.useState(!1),p=r(h.video(e.objectId));y.useEffect(()=>{t?.length||a(`My workbench`)},[t]);function m(t){n(e.objectId,t)?l(e.objectId,t,p.data.name):c(e.objectId,t,p.data.name)}function g({name:t},n){a(t,[e.objectId]),n({reset:!0}),d(!1)}return(0,x.jsx)(o,{title:`Add to your workbench`,closePopup:e.closePopup,showLoadingSpinner:!p.data,children:!!p.data&&(0,x.jsxs)(x.Fragment,{children:[(0,x.jsxs)(`div`,{className:`${b.listContainer} pb-3`,children:[(0,x.jsxs)(`p`,{children:[`Select a workbench list to add `,(0,x.jsx)(`strong`,{children:p.data.name}),` to:`]}),t.map(t=>(0,x.jsxs)(`div`,{className:`d-flex align-items-center pb-1`,children:[(0,x.jsx)(s,{id:t.id,onChange:()=>m(t.id),checked:n(e.objectId,t.id)}),(0,x.jsx)(`div`,{className:`fw-semibold cursor-pointer`,onClick:()=>m(t.id),children:t.name})]},t.id))]}),(0,x.jsx)(`div`,{className:`border-top pt-3 px-3 mx-n3`,children:u?(0,x.jsx)(f,{initialValues:{name:``},validationSchema:v,onSubmit:g,children:(0,x.jsx)(S,{})}):(0,x.jsx)(i,{variant:`link`,className:`text-info p-0`,onClick:()=>d(!0),children:`Create a new list`})})]})})}export{C as AddToWorkbenchView};
2
+ //# sourceMappingURL=DOdn0XmW2.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"D6kT_5BE2.chunk.js","names":[],"sources":["../../../../../src/apps/workbench/views/add-to-workbench/add-to-workbench.module.scss","../../../../../src/apps/workbench/views/add-to-workbench/AddToWorkbenchView.tsx"],"sourcesContent":[":local {\n .listContainer {\n min-height: 10rem;\n }\n}","import React from 'react';\nimport { Button, Form } from 'react-bootstrap';\nimport { ErrorMessage, Form as FormikForm, useFormikContext } from 'formik';\n\nimport { Flight } from 'libs/common/react/index';\n\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { FieldWrapper } from 'libs/shared/components/forms/form-field/FormField';\nimport { FormSubmissionOptions, FormWrapper, useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupViewProps, Video } from 'libs/shared/interfaces';\nimport { FormHelper } from 'libs/shared/utils/FormHelper';\n\nimport { VideoRequests } from 'apps/videos/flight-requests/CuratorVideoRequests';\nimport { WorkingListForm } from 'apps/workbench/components/edit-workbench/EditWorkbench';\nimport { useWorkingList } from 'apps/workbench/hooks/useWorkingList';\n\nimport { WorkbenchValidationSchema } from './WorkbenchValidationSchema';\n\nimport styles from './add-to-workbench.module.scss';\n\nfunction CreateWorkbenchFormDetails(): React.ReactElement {\n const formikProps = useFormikContextWrapper<WorkingListForm>();\n const { errors, touched } = useFormikContext<WorkingListForm>();\n const className = FormHelper.getCustomFormControlClassName(errors, touched, 'name');\n \n return (\n <FormikForm>\n <Form.Label htmlFor='name'>\n Name\n </Form.Label>\n <div className='input-group'>\n <FieldWrapper\n type='text'\n name='name'\n id='name'\n placeholder='Name your new workbench list'\n autoFocus\n value={formikProps.values.name}\n className={className}\n />\n <FormButtons\n isNew={true}\n submitText='Create and add'\n variant='outline-dark'\n className='border border-secondary'\n />\n <ErrorMessage name='name'>\n {(errorMessage: string) => <Form.Control.Feedback type='invalid'>{errorMessage}</Form.Control.Feedback>}\n </ErrorMessage>\n </div>\n </FormikForm>\n );\n}\n\ninterface AddToWorkbenchViewProps extends PopupViewProps {\n objectId: string;\n}\n\nexport function AddToWorkbenchView(props: AddToWorkbenchViewProps): JSX.Element {\n const {\n workingLists,\n isInWorkingList,\n createWorkingList,\n addToWorkingList,\n removeFromWorkingList\n } = useWorkingList();\n\n const [ showCreateList, setShowCreateList ] = React.useState(false);\n\n const video = Flight.useBasicFetch<Video>(VideoRequests.video(props.objectId));\n\n React.useEffect(() => {\n if (!workingLists?.length)\n createWorkingList('My workbench');\n }, [workingLists]);\n\n function onToggleCheckbox(listId: string): void {\n if (isInWorkingList(props.objectId, listId))\n removeFromWorkingList(props.objectId, listId, video.data.name);\n else\n addToWorkingList(props.objectId, listId, video.data.name);\n }\n\n function onCreateList(\n { name }: WorkingListForm,\n onDone: (options?: FormSubmissionOptions<WorkingListForm>) => void\n ): void {\n createWorkingList(name, [props.objectId]);\n onDone({ reset: true });\n setShowCreateList(false);\n }\n\n return (\n <Popup title='Add to your workbench' closePopup={props.closePopup} showLoadingSpinner={!video.data}>\n {!!video.data && (\n <>\n <div className={`${styles.listContainer} pb-3`}>\n <p>\n Select a workbench list to add <strong>{video.data.name}</strong> to:\n </p>\n {workingLists.map(list => {\n return (\n <div key={list.id} className='d-flex align-items-center pb-1'>\n <Checkbox\n id={list.id}\n onChange={() => onToggleCheckbox(list.id)}\n checked={isInWorkingList(props.objectId, list.id)}\n />\n\n <div className='fw-semibold cursor-pointer' onClick={() => onToggleCheckbox(list.id)}>\n {list.name}\n </div>\n </div>\n );\n })}\n </div>\n\n <div className='border-top pt-3 px-3 mx-n3'>\n {showCreateList ? (\n <FormWrapper<WorkingListForm>\n initialValues={{ name: '' }}\n validationSchema={WorkbenchValidationSchema}\n onSubmit={onCreateList}\n >\n <CreateWorkbenchFormDetails />\n </FormWrapper>\n ) : (\n <Button variant='link' className='text-info p-0' onClick={() => setShowCreateList(true)}>\n Create a new list\n </Button>\n )}\n </div>\n </>\n )}\n </Popup>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DOdn0XmW2.chunk.js","names":[],"sources":["../../../../../src/apps/workbench/views/add-to-workbench/add-to-workbench.module.scss","../../../../../src/apps/workbench/views/add-to-workbench/AddToWorkbenchView.tsx"],"sourcesContent":[":local {\n .listContainer {\n min-height: 10rem;\n }\n}","import React from 'react';\nimport { Button, Form } from 'react-bootstrap';\nimport { ErrorMessage, Form as FormikForm, useFormikContext } from 'formik';\n\nimport { Flight } from 'libs/common/react/index';\n\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { FieldWrapper } from 'libs/shared/components/forms/form-field/FormField';\nimport { FormSubmissionOptions, FormWrapper, useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupViewProps, Video } from 'libs/shared/interfaces';\nimport { FormHelper } from 'libs/shared/utils/FormHelper';\n\nimport { VideoRequests } from 'apps/videos/flight-requests/CuratorVideoRequests';\nimport { WorkingListForm } from 'apps/workbench/components/edit-workbench/EditWorkbench';\nimport { useWorkingList } from 'apps/workbench/hooks/useWorkingList';\n\nimport { WorkbenchValidationSchema } from './WorkbenchValidationSchema';\n\nimport styles from './add-to-workbench.module.scss';\n\nfunction CreateWorkbenchFormDetails(): React.ReactElement {\n const formikProps = useFormikContextWrapper<WorkingListForm>();\n const { errors, touched } = useFormikContext<WorkingListForm>();\n const className = FormHelper.getCustomFormControlClassName(errors, touched, 'name');\n \n return (\n <FormikForm>\n <Form.Label htmlFor='name'>\n Name\n </Form.Label>\n <div className='input-group'>\n <FieldWrapper\n type='text'\n name='name'\n id='name'\n placeholder='Name your new workbench list'\n autoFocus\n value={formikProps.values.name}\n className={className}\n />\n <FormButtons\n isNew={true}\n submitText='Create and add'\n variant='outline-dark'\n className='border border-secondary'\n />\n <ErrorMessage name='name'>\n {(errorMessage: string) => <Form.Control.Feedback type='invalid'>{errorMessage}</Form.Control.Feedback>}\n </ErrorMessage>\n </div>\n </FormikForm>\n );\n}\n\ninterface AddToWorkbenchViewProps extends PopupViewProps {\n objectId: string;\n}\n\nexport function AddToWorkbenchView(props: AddToWorkbenchViewProps): JSX.Element {\n const {\n workingLists,\n isInWorkingList,\n createWorkingList,\n addToWorkingList,\n removeFromWorkingList\n } = useWorkingList();\n\n const [ showCreateList, setShowCreateList ] = React.useState(false);\n\n const video = Flight.useBasicFetch<Video>(VideoRequests.video(props.objectId));\n\n React.useEffect(() => {\n if (!workingLists?.length)\n createWorkingList('My workbench');\n }, [workingLists]);\n\n function onToggleCheckbox(listId: string): void {\n if (isInWorkingList(props.objectId, listId))\n removeFromWorkingList(props.objectId, listId, video.data.name);\n else\n addToWorkingList(props.objectId, listId, video.data.name);\n }\n\n function onCreateList(\n { name }: WorkingListForm,\n onDone: (options?: FormSubmissionOptions<WorkingListForm>) => void\n ): void {\n createWorkingList(name, [props.objectId]);\n onDone({ reset: true });\n setShowCreateList(false);\n }\n\n return (\n <Popup title='Add to your workbench' closePopup={props.closePopup} showLoadingSpinner={!video.data}>\n {!!video.data && (\n <>\n <div className={`${styles.listContainer} pb-3`}>\n <p>\n Select a workbench list to add <strong>{video.data.name}</strong> to:\n </p>\n {workingLists.map(list => {\n return (\n <div key={list.id} className='d-flex align-items-center pb-1'>\n <Checkbox\n id={list.id}\n onChange={() => onToggleCheckbox(list.id)}\n checked={isInWorkingList(props.objectId, list.id)}\n />\n\n <div className='fw-semibold cursor-pointer' onClick={() => onToggleCheckbox(list.id)}>\n {list.name}\n </div>\n </div>\n );\n })}\n </div>\n\n <div className='border-top pt-3 px-3 mx-n3'>\n {showCreateList ? (\n <FormWrapper<WorkingListForm>\n initialValues={{ name: '' }}\n validationSchema={WorkbenchValidationSchema}\n onSubmit={onCreateList}\n >\n <CreateWorkbenchFormDetails />\n </FormWrapper>\n ) : (\n <Button variant='link' className='text-info p-0' onClick={() => setShowCreateList(true)}>\n Create a new list\n </Button>\n )}\n </div>\n </>\n )}\n </Popup>\n );\n}\n"],"mappings":"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"}
@@ -229,7 +229,7 @@ ${$f(e)}`),t.map&&!t.map.bytes&&(this.logger_(`going to request init segment.`),
229
229
  fill='currentColor'
230
230
  />
231
231
  </svg>
232
- `,Mh=class extends kh{constructor(e,t){super(e,t)}createEl(){let e=Ah.prototype.createEl.call(this,`button`,{className:this.buildCSSClass()},{type:`button`,title:this.controlText_});return e.innerHTML=jh,this.createControlTextEl(e),e}handleClick(e){e.stopPropagation(),e.preventDefault(),this.options_?.onClick&&this.options_.onClick()}buildCSSClass(){return`cv-remove-video-button`}};X.registerComponent(`removeVideoButton`,Mh),Mh.prototype.controlText_=`Remove from watch history`;var Nh=function(e){return e.Default=`play`,e.Hover=`hover`,e}({}),Ph=X.getPlugin(`plugin`),Fh=`cv-preview-mode`,Ih=`cv-force-16-9`,Lh=class extends Ph{constructor(e,t){super(e),this.hasSeeked=!1,this.buttonAdded=!1,this.mode=null,this.defaultDisplayMode=`normal`,this.onQualityReady=null,t?.defaultDisplayMode&&(this.defaultDisplayMode=t.defaultDisplayMode),t?.startTime&&(this.startTime=t.startTime),this.onSeek=this.onSeek.bind(this),this.player.one(`seeking`,this.onSeek)}onSeek(){this.hasSeeked=!0}dispose(){this.cleanupQualityListener(),this.player.off(`seeking`,this.onSeek),super.dispose()}getMode(){return this.mode}isHovering(){return this.mode===`hover`}setPlayerMode(e,t,n){this.player.trigger(`flushprogress`);let r=this.mode;if(this.mode=e,e===`hover`){this.buttonAdded||this.addButtons(t,n),this.player.addClass(Fh),this.applyAspectRatioFix(),this.enableSubtitles(),this.mute(),this.setLowQuality(),this.removeActivityTimeout(),this.player.trigger(`resize`);return}r===`hover`&&(this.applyDefaultModeLayout(),this.player.removeClass(Fh),this.player.removeClass(Ih),this.disableSubtitles(),this.unmute(),this.cleanupQualityListener(),this.restorePreviousQuality(),this.restoreActivityTimeout(),this.player.trigger(`resize`),this.hasSeeked||=(this.player.currentTime(this.startTime??0),!1))}applyDefaultModeLayout(){let e=this.player.usingPlugin?.(`theatreModePlugin`);this.defaultDisplayMode===`theatre`?(e&&this.player.theatreModePlugin()?.toggleTheatreMode(!0),this.player.fill(!0)):(e&&this.player.theatreModePlugin()?.toggleTheatreMode(!1),this.player.fluid(!0))}applyAspectRatioFix(){let e=()=>{let e=this.player.videoWidth(),t=this.player.videoHeight();if(e>0&&t>0){let n=e/t;Math.abs(n-16/9)<.01||this.player.addClass(Ih)}};this.player.readyState()>=1?e():this.player.one(`loadedmetadata`,e)}addButtons(e,t){let n=new Eh(this.player),r=new Oh(this.player,{onClickHandler:e}),i=new Mh(this.player,{onClick:t});t&&s.isFunction(t)&&this.player.addChild(i),this.player.addChild(n),this.player.addChild(r),this.buttonAdded=!0}enableSubtitles(){this.player.dataLoaded(()=>this.player.persistSubtitleSettingsPlugin().previewModeSubtitles())}disableSubtitles(){this.player.dataLoaded(()=>this.player.persistSubtitleSettingsPlugin().applyUserPreferences())}mute(){this.player.ready(()=>{this.player.persistVolumePlugin().disable(),this.player.muted(!0)})}unmute(){this.player.ready(()=>{this.player.persistVolumePlugin().applyUserPreferences(),this.player.persistVolumePlugin().enable()})}setLowQuality(){this.player.dataLoaded(()=>{this.mode===`hover`&&(this.player.persistQualitySettingsPlugin().disable(),this.cleanupQualityListener(),this.onQualityReady=()=>{this.mode===`hover`&&this.player.qualityManager().selectLowest()},this.player.on(`quality-levels-changed`,this.onQualityReady),this.player.qualityManager().selectLowest())})}cleanupQualityListener(){this.onQualityReady&&=(this.player.off(`quality-levels-changed`,this.onQualityReady),null)}restorePreviousQuality(){this.player.dataLoaded(()=>{this.player.persistQualitySettingsPlugin().applyUserPreferences(),this.player.persistQualitySettingsPlugin().enable()})}removeActivityTimeout(){this.player.cache_.inactivityTimeout=this.player.options_.inactivityTimeout,this.player.options_.inactivityTimeout=0}restoreActivityTimeout(){this.player.options_.inactivityTimeout=this.player.cache_.inactivityTimeout}};X.registerPlugin(`playerModePlugin`,Lh);function Rh(e,t){for(let n of e)if(n.quality<=t)return n;return e[e.length-1]}var zh=`cv-persisttest`,Q={hasLocalStorage:()=>{try{return window.localStorage.setItem(zh,`cv-player-storage-test`),window.localStorage.removeItem(zh),!0}catch{return!1}},get:e=>window.localStorage.getItem(e),set:(e,t)=>{window.localStorage.setItem(e,t)},remove:e=>{window.localStorage.removeItem(e)}},Bh=`cvplayer-playback-quality:v2`,Vh=`cvplayer-localcache-playback-quality:v2`,Hh=`cvplayer-dash-playback-quality:v1`,Uh=`auto`,Wh=480*60*1e3;function Gh(e){return e?Vh:Bh}var Kh={hasStoredPreference(){return Q.hasLocalStorage()?!!(Q.get(`cvplayer-playback-quality:v2`)||Q.get(`cvplayer-localcache-playback-quality:v2`)||Q.get(`cvplayer-dash-playback-quality:v1`)):!1},storeProgressive(e,t){Q.hasLocalStorage()&&Q.set(Gh(t),e.toString())},resolveProgressive(e,t=!1){let n=t?e?.playbackQualityLocalCache:e?.playbackQuality,r=(Q.hasLocalStorage()?Q.get(Gh(t)):null)||n||e?.playbackQualityFallback;if(!r)return null;let i=parseInt(r);return isNaN(i)?null:i},resolveDash(){if(!Q.hasLocalStorage())return Uh;let e=Q.get(Hh);if(!e)return Uh;try{let t=JSON.parse(e);if(typeof t?.quality==`number`&&typeof t?.expiresAt==`number`&&t.expiresAt>Date.now())return t.quality}catch{}return Uh},storeDashLock(e){if(!Q.hasLocalStorage())return;let t={quality:e,expiresAt:Date.now()+Wh};Q.set(Hh,JSON.stringify(t))},clearDashLock(){Q.hasLocalStorage()&&Q.remove(Hh)}};function qh(e,t){let n=e.currentTime(),r=!e.paused(),i=e.hasStarted();e.src(t);let a=()=>{e.off(`error`,o),e.currentTime()!==n&&e.currentTime(n),r&&e.play()?.catch(()=>void 0),i&&e.hasStarted(!0)},o=()=>e.off(`loadedmetadata`,a);e.one(`loadedmetadata`,a),e.one(`error`,o)}var Jh=`application/dash+xml`,Yh={sortFilesByQuality(e){return{...e,progressive:[...e.progressive].sort((e,t)=>t.quality-e.quality)}},getSignedDashUrl(e,t){let n=e.manifests?.dashUrl;if(n)return`${n}?viewKey=${t}`},getDashSource(e,t,n){let r=Yh.getSignedDashUrl(e,t);if(r)return{src:r,type:Jh,useBandwidthFromLocalStorage:!n}},getDefaultProgressiveFile(e,t,n){let r=n?.playbackQuality??Kh.resolveProgressive(t,!!n);return r===null?e.progressive[0]:Rh(e.progressive,r)},planSources(e){let t=Yh.getDashSource(e.files,e.viewKey,e.activeLocalCache),n=Yh.getDefaultProgressiveFile(e.files,e.settings,e.activeLocalCache),r=[];return t&&r.push(t),n&&r.push({src:n.url,type:n.mimeType}),{sources:r,defaultFile:n}},applyFile(e,t){qh(e,{src:t.url,type:t.mimeType})}};function Xh(e){return Qh(e)?.BANDWIDTH}function Zh(e){return Qh(e)?.CODECS}function Qh(e){return(e.tech?.(!0))?.vhs?.playlistController_?.mediaTypes_?.AUDIO?.activePlaylistLoader?.media?.()?.attributes}function $h(e){let t=e.isFullscreen?.()??!1,n=e.usingPlugin?.(`playerModePlugin`)?e.playerModePlugin()?.isHovering?.()??!1:!1,r=e.usingPlugin?.(`theatreModePlugin`)?e.theatreModePlugin()?.getTheatreMode?.()??!1:!1;return t?`fullscreen`:n?`hover`:r?`theatre`:`default`}var eg=`segment-metadata`,tg={getTrack(e){return nh.getTrack(e,`metadata`,eg)??null},isTrack(e){return e?.kind===`metadata`&&e.label===eg},getOnScreenSegment(e){let t=tg.getTrack(e);if(!t?.cues?.length)return null;let n=t.activeCues;return n?.length?n[n.length-1].value??null:null}};function ng(e){return tg.getOnScreenSegment(e)?.codecs||(e.tech?.(!0))?.vhs?.playlists?.media?.()?.attributes?.CODECS}var rg=1e3*60*60*8,ig=class{constructor(e){this.options=e,this.initialize()}logStream(){let e=`v:${this.options.videoId}`,t=this.getPlayerMetrics();p.cacheExists(e)||(this.collectionApiClient.log({type:_.WebPlayerStream,actionContext:this.getActionContext(),data:{...this.getAnalyticsData(),player:t},eventVersion:g.V3}),p&&p.cacheSet(e,null,300))}logVideoProgress(e,t,n){let r=this.getAnalyticsData(),i=this.getPlayerMetrics(),a=n?_.PreviewStreamProgress:_.StreamProgress,o=e.map(e=>({type:a,actionContext:this.getActionContext(),data:{...r,player:i,progress:e},eventVersion:g.V2}));for(let e of t)o.push({type:_.StreamBuffering,actionContext:this.getActionContext(),data:{...r,player:i,buffering:e},eventVersion:g.V2});this.collectionApiClient.log(o)}logUserAction(e,t){let n={...this.getAnalyticsData(),...e},r={...this.getActionContext(),...t};this.collectionApiClient.log({type:t.actionType,data:n,actionContext:r,eventVersion:t.eventVersion||g.V2})}getAnalyticsData(){let e={video:{id:this.options.videoId},flags:{isUsingLocalCache:this.options.isUsingLocalCache,isQualityUserPreference:Kh.hasStoredPreference(),isAutoQuality:this.options.player.qualityManager?.()?.isAuto()??!1},...this.options.additionalAnalyticsData||{}};this.options.shareId&&(e.video.shareId=this.options.shareId);let t=this.getEntityType();return t===S.Interactive?e.interactive={id:+this.options.mediaId}:t===S.Clip&&(e.clip={id:+this.options.mediaId}),e}initialize(){this.setupCollectionApiClient(),O.lockWindowSession(this.options.userId,rg),this.options.player.one(`dispose`,()=>O.unlockWindowSession(this.options.userId))}setupCollectionApiClient(){this.collectionApiClient=new D({productName:`player.web`,productVersion:this.options.productVersion,regionName:this.options.regionName,collectionApiUrls:this.options.collectionApiUrls,collectionApiClientId:this.options.collectionApiClientId,getUser:()=>this.getCurrentUser(),shouldLog:k.shouldLog,formatData:k.formatData})}async getCurrentUser(){return{id:this.options.userId,customerId:this.options.customerId,sessionId:this.options.authSessionId}}getActionContext(){return{entity:this.getEntityType(),location:this.getLocationContext(),productArea:void 0,descriptor:this.options.isEmbedded?T.Embedded:void 0,workflowPhase:void 0}}getEntityType(){switch(this.options.mediaType){case`MasterVideo`:return S.Video;case`MasterInteractive`:return S.Interactive;case`MasterClip`:return S.Clip}}getLocationContext(){switch(this.options.playerType){case`player`:return m.Player;case`interactive-player`:return m.InteractivePlayer;case`create-clip-player`:return m.CreateClipPlayer}}getPlayerMetrics(){let e=this.options.player,t=e.qualityManager?.()?.getActive();return{mode:$h(e),width:e.currentWidth(),height:e.currentHeight(),quality:t?.quality?.toString(),qualityLabel:t?.displayName,preset:t?.preset,tech:e.techName_,playbackType:e.currentType?.()===`application/dash+xml`?`dash`:`progressive`,videoCodec:ng(e),audioBitrate:Xh(e),audioCodec:Zh(e)}}},ag=class extends Error{constructor(e,t){super(t?.title||`Ajax error`),this.url=e,this.response=t}},og=new class{constructor(){this.tokens={gateway:null}}async get(e,t){return await this.parseResponse(await fetch(e,{method:`GET`,mode:`cors`,headers:this.getHeaders(t)}))}async delete(e,t){await fetch(e,{method:`DELETE`,headers:this.getHeaders(t)})}async post(e,t,n,r=!0){let i=await fetch(e,{method:`POST`,headers:this.getHeaders(n),body:t,mode:`cors`});if(r)return await this.parseResponse(i)}async put(e,t,n,r=!0){let i=await fetch(e,{method:`PUT`,headers:this.getHeaders(n),body:t,mode:`cors`});if(r)return await this.parseResponse(i)}setToken(e,t){this.tokens[e]=t}hasToken(e){return!!this.tokens[e]}getHeaders(e={}){let t={"Content-Type":`application/json`};return this.tokens[e.tokenName]&&(t.authorization=`Bearer ${this.tokens[e.tokenName]}`),t}async parseResponse(e){if(e.status===404)return null;if(!e.ok){let t;try{t=await e.json()}catch{throw new ag(e.url)}finally{throw new ag(e.url,t)}}return await e.json()}},sg=n(t(((e,t)=>{function n(e){if(e&&typeof e==`object`){var t=e.which||e.keyCode||e.charCode;t&&(e=t)}if(typeof e==`number`)return o[e];var n=String(e),a=r[n.toLowerCase()];if(a)return a;var a=i[n.toLowerCase()];if(a)return a;if(n.length===1)return n.charCodeAt(0)}n.isEventKey=function(e,t){if(e&&typeof e==`object`){var n=e.which||e.keyCode||e.charCode;if(n==null)return!1;if(typeof t==`string`){var a=r[t.toLowerCase()];if(a)return a===n;var a=i[t.toLowerCase()];if(a)return a===n}else if(typeof t==`number`)return t===n;return!1}},e=t.exports=n;var r=e.code=e.codes={backspace:8,tab:9,enter:13,shift:16,ctrl:17,alt:18,"pause/break":19,"caps lock":20,esc:27,space:32,"page up":33,"page down":34,end:35,home:36,left:37,up:38,right:39,down:40,insert:45,delete:46,command:91,"left command":91,"right command":93,"numpad *":106,"numpad +":107,"numpad -":109,"numpad .":110,"numpad /":111,"num lock":144,"scroll lock":145,"my computer":182,"my calculator":183,";":186,"=":187,",":188,"-":189,".":190,"/":191,"`":192,"[":219,"\\":220,"]":221,"'":222},i=e.aliases={windows:91,"⇧":16,"⌥":18,"⌃":17,"⌘":91,ctl:17,control:17,option:18,pause:19,break:19,caps:20,return:13,escape:27,spc:32,spacebar:32,pgup:33,pgdn:34,ins:45,del:46,cmd:91};for(a=97;a<123;a++)r[String.fromCharCode(a)]=a-32;for(var a=48;a<58;a++)r[a-48]=a;for(a=1;a<13;a++)r[`f`+a]=a+111;for(a=0;a<10;a++)r[`numpad `+a]=a+96;var o=e.names=e.title={};for(a in r)o[r[a]]=a;for(var s in i)r[s]=i[s]}))());function cg(e){document[e.fsApi_.fullscreenEnabled]&&(e.isFullscreen()?e.exitFullscreen():e.requestFullscreen())}function lg(e){let t=e.theatreModePlugin().getTheatreMode();e.theatreModePlugin().toggleTheatreMode(!t,{shouldLog:!0})}function ug(e){let t=e.volume(),n=e.lastVolume_();if(t===0){let t=n<.1?.1:n;e.volume(t),e.muted(!1)}else e.muted(!e.muted())}function dg(e){e.paused()?e.play():e.pause()}function fg(e,t){e.currentTime(e.currentTime()+t)}function pg(e,t){t>0&&e.muted()&&e.muted(!1),e.volume(e.volume()+t)}function mg(e){let t=e.target;return t.tagName.toLowerCase()===`video`||!![`video-js`,`vjs-tech`].find(e=>t.classList.contains(e))}var hg={f:cg,m:ug,k:dg,space:dg,t:lg,left:e=>fg(e,-5),right:e=>fg(e,5),j:e=>fg(e,-10),l:e=>fg(e,10),up:e=>pg(e,.05),down:e=>pg(e,-.05)};function gg(e,t,n){if(e.ctrlKey||e.metaKey||e.altKey)return;let r=(0,sg.default)(e),i=[`up`,`down`].includes(r);if(i&&!e.shiftKey||!i&&e.shiftKey||r===`t`&&!n.allowTheatreMode||r===`f`&&!n.allowFullscreen||!hg[r])return;hg[r](t,e);let a=mg(e),o=[`space`].includes(r);(a||o)&&(e.preventDefault(),e.stopPropagation())}var _g=function(e){return e.PhysicallyChapteredVideo=`physically-chaptered-video`,e}({}),vg={name:`@clickview/player`,version:`1.54.0-rc.2`,description:`ClickView Player`,main:`dist/player-app.js`,type:`module`,scripts:{"type-check":`tsc --noEmit`,"build-app":`node ../../../node_modules/vite/bin/vite.js build --config vite.config.app.ts`,"build-styles":`node ../../../node_modules/vite/bin/vite.js build --config vite.config.styles.ts`,build:`npm run type-check && npm run build-player && npm run build-interactive-player`,"build-player":`node ../../../node_modules/vite/bin/vite.js build --config vite.player.config.ts`,"build-interactive-player":`node ../../../node_modules/vite/bin/vite.js build --config vite.interactive-player.config.ts`,"build-font":`cross-env NODE_ENV=development npm run start`,test:`jest`,"test-watch":`jest --watch`,"test-harness":`npm run build && node ../../../node_modules/vite/bin/vite.js --config vite.test-harness.config.ts`},repository:{type:`git`,url:`https://gitlab.cvinternal.net/front-end/clickview`},author:`Matt Trengrove, Cameron Hill, Shale Kuzmanovski`,license:`ISC`,devDependencies:{"@clickview/player-font":`0.0.17`,"@types/chromecast-caf-sender":`1.0.3`,"@types/cropperjs":`1.3.0`,"@types/draft-js":`0.10.44`,"@types/node-polyglot":`0.4.34`,"@types/react-draft-wysiwyg":`1.13.1`,"@types/signalr-no-jquery":`0.1.3`,"@types/simplebar":`5.1.1`,"@types/video.js":`7.3.58`,jest:`29.6.4`,"ts-jest":`29.1.1`,"vite-plugin-mkcert":`1.17.12`},dependencies:{"@microsoft/signalr":`5.0.2`,"@types/react-canvas-draw":`1.2.1`,cropperjs:`1.5.6`,"draft-convert":`2.1.10`,"draft-js":`0.11.7`,keycode:`2.2.0`,"node-polyglot":`2.3.0`,"react-canvas-draw":`1.2.1`,"react-draft-wysiwyg":`1.15.0`,"react-textarea-autosize":`8.3.2`,"signalr-no-jquery":`0.2.0`,simplebar:`5.3.0`,"simplebar-react":`2.3.0`,"video.js":`8.20.0`}},yg=class{constructor(e){this.controller=null,this.logger=X.log.createLogger(`quality`),this.player=e}setController(e){this.controller?.dispose(),this.controller=e,this.notifyLevelsChanged(),e?.getSelected()&&this.notifyQualityChanged(`system`)}getController(){return this.controller}getLevels(){return this.controller?.getLevels()??[]}getSelected(){return this.controller?.getSelected()??null}getActive(){return this.controller?.getActive()??null}select(e,t){this.controller?.select(e,t)}selectPreferred(e){let t=Rh(this.getLevels(),e);t&&this.select(t.id)}selectLowest(){let e=this.getLevels(),t=e[e.length-1];t&&this.select(t.id)}supportsAuto(){return this.controller?.supportsAuto()??!1}isAuto(){return this.controller?.isAuto()??!1}selectAuto(e){this.controller?.selectAuto(e)}notifyLevelsChanged(){let e=this.getLevels();this.logger.debug(`Levels changed: ${e.map(e=>e.displayName).join(`, `)||`none`}`),this.player.trigger(`quality-levels-changed`),this.player.trigger(`cv-updatecog`),this.player.trigger(`resizemenus`)}notifyQualityChanged(e){let t=this.getSelected();this.logger.debug(`Quality changed to ${t?.displayName??`none`} (origin: ${e})`),this.player.trigger(`quality-changed`,{origin:e}),this.player.trigger(`cv-quality-change`,t?.id)}dispose(){this.controller?.dispose(),this.controller=null}},bg=new WeakMap;function xg(){let e=bg.get(this);if(e)return e;let t=new yg(this);return bg.set(this,t),this.one(`dispose`,()=>{t.dispose(),bg.delete(this)}),t}X.registerPlugin(`qualityManager`,xg);var Sg={SMALL:450,MEDIUM:650},Cg=X.getPlugin(`plugin`),wg=class extends Cg{constructor(e,t){super(e),this.options=t,this.configureMenuDimensions=this.configureMenuDimensions.bind(this),this.initialize()}initialize(){this.player.ready(this.configureMenuDimensions),this.player.one(`play`,this.configureMenuDimensions),this.player.on(`resize`,this.configureMenuDimensions),this.player.on(`fullscreenchange`,this.configureMenuDimensions),this.player.on(`resizemenus`,this.configureMenuDimensions),this.player.on(`ready`,this.configureMenuDimensions)}dispose(){this.player.off(`resize`,this.configureMenuDimensions),this.player.off(`fullscreenchange`,this.configureMenuDimensions),this.player.off(`resizemenus`,this.configureMenuDimensions),this.player.off(`ready`,this.configureMenuDimensions),super.dispose()}configureMenuDimensions(){let e=e=>{if(this.options.mobile)return;let t=this.player.getChild(`collapserator`),n=t.getChild(`volumePanel`),r=t.children_.indexOf(n);t.removeChild(n),t.addChild(`volumePanel`,{inline:e,playerOptions:this.player.options_.playerOptions},r),this.player.trigger(`volumechange`)},t=this.player.isFullscreen();if(t&&!this.options.mobile){let t=this.player.whiteboardModePlugin().side;if(e(t!==`top`),t===`left`||t===`right`||t===`top`){let e=this.player.currentWidth();this.player.el().querySelectorAll(`.vjs-menu`).forEach(t=>{t.style.paddingTop=null,t.style.marginBottom=null,t.style.width=`calc(${e}px - 4em)`});return}}t||e(!0);let n=this.player.currentWidth(),r=this.player.currentHeight()/n*100,i=this.player.el().querySelector(`.cv-collapsorator`),a=this.player.el().querySelectorAll(`.vjs-menu`),o=i&&i.offsetHeight;if(!o){this.player.one(`play`,this.configureMenuDimensions);return}this.options.seekBarName===`CreateClipSeekBar`&&(o+=22),!(!a||!a.length)&&a.forEach(e=>{!t&&this.options.overflowControls?e.style.paddingTop=`80%`:e.style.paddingTop=`calc(${r}% - ${o}px)`,e.style.marginBottom=`${o}px`,e.style.width=null,e.querySelector(`.vjs-menu-content`)&&(n<=Sg.SMALL?this.player.addClass(`cv-player-small`):this.player.removeClass(`cv-player-small`))})}};X.registerPlugin(`configureMenuDimensionsPlugin`,wg);var Tg=X.getPlugin(`plugin`),Eg=`cvplayer-volume`,Dg=`cvplayer-mute`,Og=class extends Tg{constructor(e){super(e),this.enabled=!0,this.player.ready(()=>this.initialize())}initialize(){if(this.player.options_.mobile){this.removeVolumeControl();return}Q.hasLocalStorage()&&(this.saveVolumeState=this.saveVolumeState.bind(this),this.player.on(`volumechange`,this.saveVolumeState),this.applyUserPreferences())}applyUserPreferences(){let e=Q.get(Eg),t=Q.get(Dg);e&&this.player.volume(+e),t&&this.player.muted(t===`true`)}saveVolumeState(){this.enabled&&(Q.set(Eg,this.player.volume().toString()),Q.set(Dg,this.player.muted().toString()))}removeVolumeControl(){this.player.volume(1);let e=this.player.getChild(`collapserator`),t=e.getChild(`volumePanel`);e.removeChild(t)}enable(){this.enabled=!0}disable(){this.enabled=!1}dispose(){this.player.off(`volumechange`,this.saveVolumeState),super.dispose()}};X.registerPlugin(`persistVolumePlugin`,Og);var kg=X.getPlugin(`plugin`),Ag=`cvplayer-playback-rate`,jg=class extends kg{constructor(e,t){super(e),this.options=t,this.player.dataLoaded(()=>this.initialize())}initialize(){if(!Q.hasLocalStorage())return;this.savePlaybackRate=this.savePlaybackRate.bind(this),this.player.on(`ratechange`,this.savePlaybackRate),this.one(`dispose`,()=>{this.player.off(`ratechange`,this.savePlaybackRate)});let e=+Q.get(Ag);this.player.playbackRates()?.some(t=>t===e)&&this.player.playbackRate(e)}savePlaybackRate(){let e=this.player.playbackRate().toString();this.setDefaultPlaybackRate(+e),Q.set(Ag,e),this.options.analyticsService?.logUserAction({rate:e},{actionType:_.Select,workflowPhase:v.Complete,descriptor:y.ChangeSpeed,entity:S.PlaybackSpeed,eventVersion:g.V3})}setDefaultPlaybackRate(e){this.player.defaultPlaybackRate(e)}setPlaybackRateWithoutPersisting(e){this.player.off(`ratechange`,this.savePlaybackRate),this.player.playbackRate(e),this.setDefaultPlaybackRate(e),this.player.on(`ratechange`,this.savePlaybackRate)}};X.registerPlugin(`persistPlaybackRatePlugin`,jg);var Mg=X.getPlugin(`plugin`),Ng=class extends Mg{constructor(e){super(e),this.fullscreenBecauseOfRotate=!1,this.player.supportsFullScreen()&&(this.onRotate=this.onRotate.bind(this),this.onFullscreenChange=this.onFullscreenChange.bind(this),this.player.ready(()=>this.initialize()))}initialize(){this.player.on(`fullscreenchange`,this.onFullscreenChange),window.addEventListener(`orientationchange`,this.onRotate)}dispose(){this.player.off(`fullscreenchange`,this.onFullscreenChange),window.removeEventListener(`orientationchange`,this.onRotate)}onFullscreenChange(){this.player.isFullscreen()||(this.fullscreenBecauseOfRotate=!1)}onRotate(){let e=this.getAngle();if(e!==90&&e!==-90&&e!==270){this.fullscreenBecauseOfRotate&&this.player.isFullscreen()&&this.player.exitFullscreen();return}this.player.requestFullscreen(),this.fullscreenBecauseOfRotate=!0}getAngle(){return typeof window.screen?.orientation?.angle==`number`?window.screen.orientation.angle:0}};X.registerPlugin(`fullscreenOnRotatePlugin`,Ng);var Pg=`
232
+ `,Mh=class extends kh{constructor(e,t){super(e,t)}createEl(){let e=Ah.prototype.createEl.call(this,`button`,{className:this.buildCSSClass()},{type:`button`,title:this.controlText_});return e.innerHTML=jh,this.createControlTextEl(e),e}handleClick(e){e.stopPropagation(),e.preventDefault(),this.options_?.onClick&&this.options_.onClick()}buildCSSClass(){return`cv-remove-video-button`}};X.registerComponent(`removeVideoButton`,Mh),Mh.prototype.controlText_=`Remove from watch history`;var Nh=function(e){return e.Default=`play`,e.Hover=`hover`,e}({}),Ph=X.getPlugin(`plugin`),Fh=`cv-preview-mode`,Ih=`cv-force-16-9`,Lh=class extends Ph{constructor(e,t){super(e),this.hasSeeked=!1,this.buttonAdded=!1,this.mode=null,this.defaultDisplayMode=`normal`,this.onQualityReady=null,t?.defaultDisplayMode&&(this.defaultDisplayMode=t.defaultDisplayMode),t?.startTime&&(this.startTime=t.startTime),this.onSeek=this.onSeek.bind(this),this.player.one(`seeking`,this.onSeek)}onSeek(){this.hasSeeked=!0}dispose(){this.cleanupQualityListener(),this.player.off(`seeking`,this.onSeek),super.dispose()}getMode(){return this.mode}isHovering(){return this.mode===`hover`}setPlayerMode(e,t,n){this.player.trigger(`flushprogress`);let r=this.mode;if(this.mode=e,e===`hover`){this.buttonAdded||this.addButtons(t,n),this.player.addClass(Fh),this.applyAspectRatioFix(),this.enableSubtitles(),this.mute(),this.setLowQuality(),this.removeActivityTimeout(),this.player.trigger(`resize`);return}r===`hover`&&(this.applyDefaultModeLayout(),this.player.removeClass(Fh),this.player.removeClass(Ih),this.disableSubtitles(),this.unmute(),this.cleanupQualityListener(),this.restorePreviousQuality(),this.restoreActivityTimeout(),this.player.trigger(`resize`),this.hasSeeked||=(this.player.currentTime(this.startTime??0),!1))}applyDefaultModeLayout(){let e=this.player.usingPlugin?.(`theatreModePlugin`);this.defaultDisplayMode===`theatre`?(e&&this.player.theatreModePlugin()?.toggleTheatreMode(!0),this.player.fill(!0)):(e&&this.player.theatreModePlugin()?.toggleTheatreMode(!1),this.player.fluid(!0))}applyAspectRatioFix(){let e=()=>{let e=this.player.videoWidth(),t=this.player.videoHeight();if(e>0&&t>0){let n=e/t;Math.abs(n-16/9)<.01||this.player.addClass(Ih)}};this.player.readyState()>=1?e():this.player.one(`loadedmetadata`,e)}addButtons(e,t){let n=new Eh(this.player),r=new Oh(this.player,{onClickHandler:e}),i=new Mh(this.player,{onClick:t});t&&s.isFunction(t)&&this.player.addChild(i),this.player.addChild(n),this.player.addChild(r),this.buttonAdded=!0}enableSubtitles(){this.player.dataLoaded(()=>this.player.persistSubtitleSettingsPlugin().previewModeSubtitles())}disableSubtitles(){this.player.dataLoaded(()=>this.player.persistSubtitleSettingsPlugin().applyUserPreferences())}mute(){this.player.ready(()=>{this.player.persistVolumePlugin().disable(),this.player.muted(!0)})}unmute(){this.player.ready(()=>{this.player.persistVolumePlugin().applyUserPreferences(),this.player.persistVolumePlugin().enable()})}setLowQuality(){this.player.dataLoaded(()=>{this.mode===`hover`&&(this.player.persistQualitySettingsPlugin().disable(),this.cleanupQualityListener(),this.onQualityReady=()=>{this.mode===`hover`&&this.player.qualityManager().selectLowest()},this.player.on(`quality-levels-changed`,this.onQualityReady),this.player.qualityManager().selectLowest())})}cleanupQualityListener(){this.onQualityReady&&=(this.player.off(`quality-levels-changed`,this.onQualityReady),null)}restorePreviousQuality(){this.player.dataLoaded(()=>{this.player.persistQualitySettingsPlugin().applyUserPreferences(),this.player.persistQualitySettingsPlugin().enable()})}removeActivityTimeout(){this.player.cache_.inactivityTimeout=this.player.options_.inactivityTimeout,this.player.options_.inactivityTimeout=0}restoreActivityTimeout(){this.player.options_.inactivityTimeout=this.player.cache_.inactivityTimeout}};X.registerPlugin(`playerModePlugin`,Lh);function Rh(e,t){for(let n of e)if(n.quality<=t)return n;return e[e.length-1]}var zh=`cv-persisttest`,Q={hasLocalStorage:()=>{try{return window.localStorage.setItem(zh,`cv-player-storage-test`),window.localStorage.removeItem(zh),!0}catch{return!1}},get:e=>window.localStorage.getItem(e),set:(e,t)=>{window.localStorage.setItem(e,t)},remove:e=>{window.localStorage.removeItem(e)}},Bh=`cvplayer-playback-quality:v2`,Vh=`cvplayer-localcache-playback-quality:v2`,Hh=`cvplayer-dash-playback-quality:v1`,Uh=`auto`,Wh=480*60*1e3;function Gh(e){return e?Vh:Bh}var Kh={hasStoredPreference(){return Q.hasLocalStorage()?!!(Q.get(`cvplayer-playback-quality:v2`)||Q.get(`cvplayer-localcache-playback-quality:v2`)||Q.get(`cvplayer-dash-playback-quality:v1`)):!1},storeProgressive(e,t){Q.hasLocalStorage()&&Q.set(Gh(t),e.toString())},resolveProgressive(e,t=!1){let n=t?e?.playbackQualityLocalCache:e?.playbackQuality,r=(Q.hasLocalStorage()?Q.get(Gh(t)):null)||n||e?.playbackQualityFallback;if(!r)return null;let i=parseInt(r);return isNaN(i)?null:i},resolveDash(){if(!Q.hasLocalStorage())return Uh;let e=Q.get(Hh);if(!e)return Uh;try{let t=JSON.parse(e);if(typeof t?.quality==`number`&&typeof t?.expiresAt==`number`&&t.expiresAt>Date.now())return t.quality}catch{}return Uh},storeDashLock(e){if(!Q.hasLocalStorage())return;let t={quality:e,expiresAt:Date.now()+Wh};Q.set(Hh,JSON.stringify(t))},clearDashLock(){Q.hasLocalStorage()&&Q.remove(Hh)}};function qh(e,t){let n=e.currentTime(),r=!e.paused(),i=e.hasStarted();e.src(t);let a=()=>{e.off(`error`,o),e.currentTime()!==n&&e.currentTime(n),r&&e.play()?.catch(()=>void 0),i&&e.hasStarted(!0)},o=()=>e.off(`loadedmetadata`,a);e.one(`loadedmetadata`,a),e.one(`error`,o)}var Jh=`application/dash+xml`,Yh={sortFilesByQuality(e){return{...e,progressive:[...e.progressive].sort((e,t)=>t.quality-e.quality)}},getSignedDashUrl(e,t){let n=e.manifests?.dashUrl;if(n)return`${n}?viewKey=${t}`},getDashSource(e,t,n){let r=Yh.getSignedDashUrl(e,t);if(r)return{src:r,type:Jh,useBandwidthFromLocalStorage:!n}},getDefaultProgressiveFile(e,t,n){let r=n?.playbackQuality??Kh.resolveProgressive(t,!!n);return r===null?e.progressive[0]:Rh(e.progressive,r)},planSources(e){let t=Yh.getDashSource(e.files,e.viewKey,e.activeLocalCache),n=Yh.getDefaultProgressiveFile(e.files,e.settings,e.activeLocalCache),r=[];return t&&r.push(t),n&&r.push({src:n.url,type:n.mimeType}),{sources:r,defaultFile:n}},applyFile(e,t){qh(e,{src:t.url,type:t.mimeType})}};function Xh(e){return Qh(e)?.BANDWIDTH}function Zh(e){return Qh(e)?.CODECS}function Qh(e){return(e.tech?.(!0))?.vhs?.playlistController_?.mediaTypes_?.AUDIO?.activePlaylistLoader?.media?.()?.attributes}function $h(e){let t=e.isFullscreen?.()??!1,n=e.usingPlugin?.(`playerModePlugin`)?e.playerModePlugin()?.isHovering?.()??!1:!1,r=e.usingPlugin?.(`theatreModePlugin`)?e.theatreModePlugin()?.getTheatreMode?.()??!1:!1;return t?`fullscreen`:n?`hover`:r?`theatre`:`default`}var eg=`segment-metadata`,tg={getTrack(e){return nh.getTrack(e,`metadata`,eg)??null},isTrack(e){return e?.kind===`metadata`&&e.label===eg},getOnScreenSegment(e){let t=tg.getTrack(e);if(!t?.cues?.length)return null;let n=t.activeCues;return n?.length?n[n.length-1].value??null:null}};function ng(e){return tg.getOnScreenSegment(e)?.codecs||(e.tech?.(!0))?.vhs?.playlists?.media?.()?.attributes?.CODECS}var rg=1e3*60*60*8,ig=class{constructor(e){this.options=e,this.initialize()}logStream(){let e=`v:${this.options.videoId}`,t=this.getPlayerMetrics();p.cacheExists(e)||(this.collectionApiClient.log({type:_.WebPlayerStream,actionContext:this.getActionContext(),data:{...this.getAnalyticsData(),player:t},eventVersion:g.V3}),p&&p.cacheSet(e,null,300))}logVideoProgress(e,t,n){let r=this.getAnalyticsData(),i=this.getPlayerMetrics(),a=n?_.PreviewStreamProgress:_.StreamProgress,o=e.map(e=>({type:a,actionContext:this.getActionContext(),data:{...r,player:i,progress:e},eventVersion:g.V2}));for(let e of t)o.push({type:_.StreamBuffering,actionContext:this.getActionContext(),data:{...r,player:i,buffering:e},eventVersion:g.V2});this.collectionApiClient.log(o)}logUserAction(e,t){let n={...this.getAnalyticsData(),...e},r={...this.getActionContext(),...t};this.collectionApiClient.log({type:t.actionType,data:n,actionContext:r,eventVersion:t.eventVersion||g.V2})}getAnalyticsData(){let e={video:{id:this.options.videoId},flags:{isUsingLocalCache:this.options.isUsingLocalCache,isQualityUserPreference:Kh.hasStoredPreference(),isAutoQuality:this.options.player.qualityManager?.()?.isAuto()??!1},...this.options.additionalAnalyticsData||{}};this.options.shareId&&(e.video.shareId=this.options.shareId);let t=this.getEntityType();return t===S.Interactive?e.interactive={id:+this.options.mediaId}:t===S.Clip&&(e.clip={id:+this.options.mediaId}),e}initialize(){this.setupCollectionApiClient(),O.lockWindowSession(this.options.userId,rg),this.options.player.one(`dispose`,()=>O.unlockWindowSession(this.options.userId))}setupCollectionApiClient(){this.collectionApiClient=new D({productName:`player.web`,productVersion:this.options.productVersion,regionName:this.options.regionName,collectionApiUrls:this.options.collectionApiUrls,collectionApiClientId:this.options.collectionApiClientId,getUser:()=>this.getCurrentUser(),shouldLog:k.shouldLog,formatData:k.formatData})}async getCurrentUser(){return{id:this.options.userId,customerId:this.options.customerId,sessionId:this.options.authSessionId}}getActionContext(){return{entity:this.getEntityType(),location:this.getLocationContext(),productArea:void 0,descriptor:this.options.isEmbedded?T.Embedded:void 0,workflowPhase:void 0}}getEntityType(){switch(this.options.mediaType){case`MasterVideo`:return S.Video;case`MasterInteractive`:return S.Interactive;case`MasterClip`:return S.Clip}}getLocationContext(){switch(this.options.playerType){case`player`:return m.Player;case`interactive-player`:return m.InteractivePlayer;case`create-clip-player`:return m.CreateClipPlayer}}getPlayerMetrics(){let e=this.options.player,t=e.qualityManager?.()?.getActive();return{mode:$h(e),width:e.currentWidth(),height:e.currentHeight(),quality:t?.quality?.toString(),qualityLabel:t?.displayName,preset:t?.preset,tech:e.techName_,playbackType:e.currentType?.()===`application/dash+xml`?`dash`:`progressive`,videoCodec:ng(e),audioBitrate:Xh(e),audioCodec:Zh(e)}}},ag=class extends Error{constructor(e,t){super(t?.title||`Ajax error`),this.url=e,this.response=t}},og=new class{constructor(){this.tokens={gateway:null}}async get(e,t){return await this.parseResponse(await fetch(e,{method:`GET`,mode:`cors`,headers:this.getHeaders(t)}))}async delete(e,t){await fetch(e,{method:`DELETE`,headers:this.getHeaders(t)})}async post(e,t,n,r=!0){let i=await fetch(e,{method:`POST`,headers:this.getHeaders(n),body:t,mode:`cors`});if(r)return await this.parseResponse(i)}async put(e,t,n,r=!0){let i=await fetch(e,{method:`PUT`,headers:this.getHeaders(n),body:t,mode:`cors`});if(r)return await this.parseResponse(i)}setToken(e,t){this.tokens[e]=t}hasToken(e){return!!this.tokens[e]}getHeaders(e={}){let t={"Content-Type":`application/json`};return this.tokens[e.tokenName]&&(t.authorization=`Bearer ${this.tokens[e.tokenName]}`),t}async parseResponse(e){if(e.status===404)return null;if(!e.ok){let t;try{t=await e.json()}catch{throw new ag(e.url)}finally{throw new ag(e.url,t)}}return await e.json()}},sg=n(t(((e,t)=>{function n(e){if(e&&typeof e==`object`){var t=e.which||e.keyCode||e.charCode;t&&(e=t)}if(typeof e==`number`)return o[e];var n=String(e),a=r[n.toLowerCase()];if(a)return a;var a=i[n.toLowerCase()];if(a)return a;if(n.length===1)return n.charCodeAt(0)}n.isEventKey=function(e,t){if(e&&typeof e==`object`){var n=e.which||e.keyCode||e.charCode;if(n==null)return!1;if(typeof t==`string`){var a=r[t.toLowerCase()];if(a)return a===n;var a=i[t.toLowerCase()];if(a)return a===n}else if(typeof t==`number`)return t===n;return!1}},e=t.exports=n;var r=e.code=e.codes={backspace:8,tab:9,enter:13,shift:16,ctrl:17,alt:18,"pause/break":19,"caps lock":20,esc:27,space:32,"page up":33,"page down":34,end:35,home:36,left:37,up:38,right:39,down:40,insert:45,delete:46,command:91,"left command":91,"right command":93,"numpad *":106,"numpad +":107,"numpad -":109,"numpad .":110,"numpad /":111,"num lock":144,"scroll lock":145,"my computer":182,"my calculator":183,";":186,"=":187,",":188,"-":189,".":190,"/":191,"`":192,"[":219,"\\":220,"]":221,"'":222},i=e.aliases={windows:91,"⇧":16,"⌥":18,"⌃":17,"⌘":91,ctl:17,control:17,option:18,pause:19,break:19,caps:20,return:13,escape:27,spc:32,spacebar:32,pgup:33,pgdn:34,ins:45,del:46,cmd:91};for(a=97;a<123;a++)r[String.fromCharCode(a)]=a-32;for(var a=48;a<58;a++)r[a-48]=a;for(a=1;a<13;a++)r[`f`+a]=a+111;for(a=0;a<10;a++)r[`numpad `+a]=a+96;var o=e.names=e.title={};for(a in r)o[r[a]]=a;for(var s in i)r[s]=i[s]}))());function cg(e){document[e.fsApi_.fullscreenEnabled]&&(e.isFullscreen()?e.exitFullscreen():e.requestFullscreen())}function lg(e){let t=e.theatreModePlugin().getTheatreMode();e.theatreModePlugin().toggleTheatreMode(!t,{shouldLog:!0})}function ug(e){let t=e.volume(),n=e.lastVolume_();if(t===0){let t=n<.1?.1:n;e.volume(t),e.muted(!1)}else e.muted(!e.muted())}function dg(e){e.paused()?e.play():e.pause()}function fg(e,t){e.currentTime(e.currentTime()+t)}function pg(e,t){t>0&&e.muted()&&e.muted(!1),e.volume(e.volume()+t)}function mg(e){let t=e.target;return t.tagName.toLowerCase()===`video`||!![`video-js`,`vjs-tech`].find(e=>t.classList.contains(e))}var hg={f:cg,m:ug,k:dg,space:dg,t:lg,left:e=>fg(e,-5),right:e=>fg(e,5),j:e=>fg(e,-10),l:e=>fg(e,10),up:e=>pg(e,.05),down:e=>pg(e,-.05)};function gg(e,t,n){if(e.ctrlKey||e.metaKey||e.altKey)return;let r=(0,sg.default)(e),i=[`up`,`down`].includes(r);if(i&&!e.shiftKey||!i&&e.shiftKey||r===`t`&&!n.allowTheatreMode||r===`f`&&!n.allowFullscreen||!hg[r])return;hg[r](t,e);let a=mg(e),o=[`space`].includes(r);(a||o)&&(e.preventDefault(),e.stopPropagation())}var _g=function(e){return e.PhysicallyChapteredVideo=`physically-chaptered-video`,e}({}),vg={name:`@clickview/player`,version:`1.54.0-rc.3`,description:`ClickView Player`,main:`dist/player-app.js`,type:`module`,scripts:{"type-check":`tsc --noEmit`,"build-app":`node ../../../node_modules/vite/bin/vite.js build --config vite.config.app.ts`,"build-styles":`node ../../../node_modules/vite/bin/vite.js build --config vite.config.styles.ts`,build:`npm run type-check && npm run build-player && npm run build-interactive-player`,"build-player":`node ../../../node_modules/vite/bin/vite.js build --config vite.player.config.ts`,"build-interactive-player":`node ../../../node_modules/vite/bin/vite.js build --config vite.interactive-player.config.ts`,"build-font":`cross-env NODE_ENV=development npm run start`,test:`jest`,"test-watch":`jest --watch`,"test-harness":`npm run build && node ../../../node_modules/vite/bin/vite.js --config vite.test-harness.config.ts`},repository:{type:`git`,url:`https://gitlab.cvinternal.net/front-end/clickview`},author:`Matt Trengrove, Cameron Hill, Shale Kuzmanovski`,license:`ISC`,devDependencies:{"@clickview/player-font":`0.0.17`,"@types/chromecast-caf-sender":`1.0.3`,"@types/cropperjs":`1.3.0`,"@types/draft-js":`0.10.44`,"@types/node-polyglot":`0.4.34`,"@types/react-draft-wysiwyg":`1.13.1`,"@types/signalr-no-jquery":`0.1.3`,"@types/simplebar":`5.1.1`,"@types/video.js":`7.3.58`,jest:`29.6.4`,"ts-jest":`29.1.1`,"vite-plugin-mkcert":`1.17.12`},dependencies:{"@microsoft/signalr":`5.0.2`,"@types/react-canvas-draw":`1.2.1`,cropperjs:`1.5.6`,"draft-convert":`2.1.10`,"draft-js":`0.11.7`,keycode:`2.2.0`,"node-polyglot":`2.3.0`,"react-canvas-draw":`1.2.1`,"react-draft-wysiwyg":`1.15.0`,"react-textarea-autosize":`8.3.2`,"signalr-no-jquery":`0.2.0`,simplebar:`5.3.0`,"simplebar-react":`2.3.0`,"video.js":`8.20.0`}},yg=class{constructor(e){this.controller=null,this.logger=X.log.createLogger(`quality`),this.player=e}setController(e){this.controller?.dispose(),this.controller=e,this.notifyLevelsChanged(),e?.getSelected()&&this.notifyQualityChanged(`system`)}getController(){return this.controller}getLevels(){return this.controller?.getLevels()??[]}getSelected(){return this.controller?.getSelected()??null}getActive(){return this.controller?.getActive()??null}select(e,t){this.controller?.select(e,t)}selectPreferred(e){let t=Rh(this.getLevels(),e);t&&this.select(t.id)}selectLowest(){let e=this.getLevels(),t=e[e.length-1];t&&this.select(t.id)}supportsAuto(){return this.controller?.supportsAuto()??!1}isAuto(){return this.controller?.isAuto()??!1}selectAuto(e){this.controller?.selectAuto(e)}notifyLevelsChanged(){let e=this.getLevels();this.logger.debug(`Levels changed: ${e.map(e=>e.displayName).join(`, `)||`none`}`),this.player.trigger(`quality-levels-changed`),this.player.trigger(`cv-updatecog`),this.player.trigger(`resizemenus`)}notifyQualityChanged(e){let t=this.getSelected();this.logger.debug(`Quality changed to ${t?.displayName??`none`} (origin: ${e})`),this.player.trigger(`quality-changed`,{origin:e}),this.player.trigger(`cv-quality-change`,t?.id)}dispose(){this.controller?.dispose(),this.controller=null}},bg=new WeakMap;function xg(){let e=bg.get(this);if(e)return e;let t=new yg(this);return bg.set(this,t),this.one(`dispose`,()=>{t.dispose(),bg.delete(this)}),t}X.registerPlugin(`qualityManager`,xg);var Sg={SMALL:450,MEDIUM:650},Cg=X.getPlugin(`plugin`),wg=class extends Cg{constructor(e,t){super(e),this.options=t,this.configureMenuDimensions=this.configureMenuDimensions.bind(this),this.initialize()}initialize(){this.player.ready(this.configureMenuDimensions),this.player.one(`play`,this.configureMenuDimensions),this.player.on(`resize`,this.configureMenuDimensions),this.player.on(`fullscreenchange`,this.configureMenuDimensions),this.player.on(`resizemenus`,this.configureMenuDimensions),this.player.on(`ready`,this.configureMenuDimensions)}dispose(){this.player.off(`resize`,this.configureMenuDimensions),this.player.off(`fullscreenchange`,this.configureMenuDimensions),this.player.off(`resizemenus`,this.configureMenuDimensions),this.player.off(`ready`,this.configureMenuDimensions),super.dispose()}configureMenuDimensions(){let e=e=>{if(this.options.mobile)return;let t=this.player.getChild(`collapserator`),n=t.getChild(`volumePanel`),r=t.children_.indexOf(n);t.removeChild(n),t.addChild(`volumePanel`,{inline:e,playerOptions:this.player.options_.playerOptions},r),this.player.trigger(`volumechange`)},t=this.player.isFullscreen();if(t&&!this.options.mobile){let t=this.player.whiteboardModePlugin().side;if(e(t!==`top`),t===`left`||t===`right`||t===`top`){let e=this.player.currentWidth();this.player.el().querySelectorAll(`.vjs-menu`).forEach(t=>{t.style.paddingTop=null,t.style.marginBottom=null,t.style.width=`calc(${e}px - 4em)`});return}}t||e(!0);let n=this.player.currentWidth(),r=this.player.currentHeight()/n*100,i=this.player.el().querySelector(`.cv-collapsorator`),a=this.player.el().querySelectorAll(`.vjs-menu`),o=i&&i.offsetHeight;if(!o){this.player.one(`play`,this.configureMenuDimensions);return}this.options.seekBarName===`CreateClipSeekBar`&&(o+=22),!(!a||!a.length)&&a.forEach(e=>{!t&&this.options.overflowControls?e.style.paddingTop=`80%`:e.style.paddingTop=`calc(${r}% - ${o}px)`,e.style.marginBottom=`${o}px`,e.style.width=null,e.querySelector(`.vjs-menu-content`)&&(n<=Sg.SMALL?this.player.addClass(`cv-player-small`):this.player.removeClass(`cv-player-small`))})}};X.registerPlugin(`configureMenuDimensionsPlugin`,wg);var Tg=X.getPlugin(`plugin`),Eg=`cvplayer-volume`,Dg=`cvplayer-mute`,Og=class extends Tg{constructor(e){super(e),this.enabled=!0,this.player.ready(()=>this.initialize())}initialize(){if(this.player.options_.mobile){this.removeVolumeControl();return}Q.hasLocalStorage()&&(this.saveVolumeState=this.saveVolumeState.bind(this),this.player.on(`volumechange`,this.saveVolumeState),this.applyUserPreferences())}applyUserPreferences(){let e=Q.get(Eg),t=Q.get(Dg);e&&this.player.volume(+e),t&&this.player.muted(t===`true`)}saveVolumeState(){this.enabled&&(Q.set(Eg,this.player.volume().toString()),Q.set(Dg,this.player.muted().toString()))}removeVolumeControl(){this.player.volume(1);let e=this.player.getChild(`collapserator`),t=e.getChild(`volumePanel`);e.removeChild(t)}enable(){this.enabled=!0}disable(){this.enabled=!1}dispose(){this.player.off(`volumechange`,this.saveVolumeState),super.dispose()}};X.registerPlugin(`persistVolumePlugin`,Og);var kg=X.getPlugin(`plugin`),Ag=`cvplayer-playback-rate`,jg=class extends kg{constructor(e,t){super(e),this.options=t,this.player.dataLoaded(()=>this.initialize())}initialize(){if(!Q.hasLocalStorage())return;this.savePlaybackRate=this.savePlaybackRate.bind(this),this.player.on(`ratechange`,this.savePlaybackRate),this.one(`dispose`,()=>{this.player.off(`ratechange`,this.savePlaybackRate)});let e=+Q.get(Ag);this.player.playbackRates()?.some(t=>t===e)&&this.player.playbackRate(e)}savePlaybackRate(){let e=this.player.playbackRate().toString();this.setDefaultPlaybackRate(+e),Q.set(Ag,e),this.options.analyticsService?.logUserAction({rate:e},{actionType:_.Select,workflowPhase:v.Complete,descriptor:y.ChangeSpeed,entity:S.PlaybackSpeed,eventVersion:g.V3})}setDefaultPlaybackRate(e){this.player.defaultPlaybackRate(e)}setPlaybackRateWithoutPersisting(e){this.player.off(`ratechange`,this.savePlaybackRate),this.player.playbackRate(e),this.setDefaultPlaybackRate(e),this.player.on(`ratechange`,this.savePlaybackRate)}};X.registerPlugin(`persistPlaybackRatePlugin`,jg);var Mg=X.getPlugin(`plugin`),Ng=class extends Mg{constructor(e){super(e),this.fullscreenBecauseOfRotate=!1,this.player.supportsFullScreen()&&(this.onRotate=this.onRotate.bind(this),this.onFullscreenChange=this.onFullscreenChange.bind(this),this.player.ready(()=>this.initialize()))}initialize(){this.player.on(`fullscreenchange`,this.onFullscreenChange),window.addEventListener(`orientationchange`,this.onRotate)}dispose(){this.player.off(`fullscreenchange`,this.onFullscreenChange),window.removeEventListener(`orientationchange`,this.onRotate)}onFullscreenChange(){this.player.isFullscreen()||(this.fullscreenBecauseOfRotate=!1)}onRotate(){let e=this.getAngle();if(e!==90&&e!==-90&&e!==270){this.fullscreenBecauseOfRotate&&this.player.isFullscreen()&&this.player.exitFullscreen();return}this.player.requestFullscreen(),this.fullscreenBecauseOfRotate=!0}getAngle(){return typeof window.screen?.orientation?.angle==`number`?window.screen.orientation.angle:0}};X.registerPlugin(`fullscreenOnRotatePlugin`,Ng);var Pg=`
233
233
  <svg viewBox="0 0 2420 383">
234
234
  <title>ClickView Logo</title>
235
235
  <path fill="#f8981d" d="M317.302 140.594c38.928 22.475 38.928 78.663 0 101.137L87.93 374.159c-51.737 29.87-109.635-28.028-79.764-79.765l42.745-74.035a58.39 58.39 0 0 0 0-58.392L8.165 87.929C-21.705 36.193 36.193-21.705 87.93 8.165z"/>
@@ -266,4 +266,4 @@ ${$f(e)}`),t.map&&!t.map.bytes&&(this.logger_(`going to request init segment.`),
266
266
  <path d="M268.06 2.91764L254.192 14.8403L262.401 17.4661L258.324 27.0679L272.192 15.1453L263.983 12.5194L268.06 2.91764Z" stroke="white" stroke-linecap="round" stroke-linejoin="round"/>
267
267
  </svg>
268
268
  `})}};X.registerComponent(`ErrorDisplay`,yw);var bw=X.getComponent(`FullscreenToggle`),xw=`Fullscreen (f)`,Sw=class extends bw{handleFullscreenChange(){bw.prototype.handleFullscreenChange.call(this),this.controlText(xw)}};X.registerComponent(`FullscreenToggle`,Sw),Sw.prototype.controlText_=xw;var Cw=X.getComponent(`MuteToggle`),ww=`Mute (m)`,Tw=`Unmute (m)`,Ew=class extends Cw{updateControlText_(){let e=this.player_.muted()||this.player_.volume()===0?Tw:ww;this.controlText_!==e&&this.controlText(e)}};X.registerComponent(`MuteToggle`,Ew),Ew.prototype.controlText_=ww;var Dw=X.getComponent(`Player`),Ow=e=>e.indexOf(`#`)===0?e.slice(1):e,kw=3,Aw,jw=class e{static{this.options_={viewKey:null,controls:!0,playbackRates:[.25,.5,.75,1,1.25,1.5,1.75,2],playerApi:new URL(`http://localhost:52000`),enableLocalCache:!0,eventLogging:!0,allowFullscreen:!0}}constructor(t,n){if(this.streamLogged=!1,this.options=X.obj.merge({},e.options_,n),this.options.playerApi===null)throw Error(`PlayerApi required`);this.initialize(),this.createEl(t),this.buildVideoJs(),this.options.splash&&this.setupSplash(this.options.splash),this.bindEventListeners(),this.setupSeekBar(),this.fetchConfig(),this.logStream=this.logStream.bind(this),this.player.ready(()=>{this._configurePlugins(),this.options.setup&&this.options.setup(this.options,this.player),this.fetch().catch(e=>this.handleFetchError(e))})}initialize(){}_configurePlugins(){this.player.configureMenuDimensionsPlugin({mobile:this.options.mobile,overflowControls:this.options.overflowControls,seekBarName:this.getSeekBarName()}),this.player.progressReporterPlugin({onFlush:this.onFlushProgress=this.onFlushProgress.bind(this)}),this.player.persistVolumePlugin(),!this.options.mobile&&this.options.allowFullscreen&&this.player.fullscreenOnRotatePlugin(),this.player.touchControls(),this.player.playerModePlugin({defaultDisplayMode:this.options.nextDefaultDisplayMode,startTime:this.options.startTime}),this.options.getExternalLink&&this.player.openExternallyPlugin({getExternalLink:this.options.getExternalLink}),this.player.oldVersionRefreshPlugin?.(),this.configurePlugins()}configurePlugins(){}onFlushProgress(e,t){let n=this.player.playerModePlugin().isHovering();this.analyticsService?.logVideoProgress(e,t,n)}buildVideoJs(){return this.player=X(this.el,this.getPlayerOptions())}getInactivityTimeout(){if(typeof this.options.inactivityTimeout==`number`)return this.options.inactivityTimeout;let e=500;return(this.options.mobile||X.browser.IS_IOS||X.browser.IS_ANDROID)&&(e=3e3),e}getFluid(){return!(this.options.theatreMode||this.options.embed||this.options.mobile)}getFill(){return!!(this.options.theatreMode||this.options.embed||this.options.mobile)}getPlayerOptions(){let e=Dw.prototype.options_.children;return e=e.filter(e=>!(e===`bigPlayButton`||e===`posterImage`)),{controls:this.options.controls,fluid:this.getFluid(),fill:this.getFill(),inactivityTimeout:this.getInactivityTimeout(),controlBar:{children:[`timeWrapper`,`progressControl`]},children:[...e,{name:`collapserator`,children:Ch.filter(e=>!(e===`fullscreenToggle`&&!this.options.allowFullscreen||e===`playbackRateMenuButton`&&!this.options.playbackRates?.length))},`playPauseFeedback`,`controlBarGradient`],userActions:{hotkeys:e=>gg(e,this.player,this.options)},playbackRates:this.options.playbackRates,techOrder:[`html5`],html5:{nativeTextTracks:!1},playsinline:!0,aspectRatio:this.options.aspectRatio,mobile:this.options.mobile,allowTheatreMode:this.options.allowTheatreMode,deferMenus:this.options.deferMenus,muted:this.options.muted,devicesConfig:this.options.devicesConfig}}async getPlaybackObject(){if(this.options.offlinePlaybackObject)return this.options.offlinePlaybackObject;let e=this.options.fetch;if(this.options.fetch===void 0&&(e=e=>{let t=`${this.options.playerApi.origin}/api/playback?viewKey=${e}`;return og.get(t)}),!this.options.viewKey)throw Error(`Please specify a viewKey or a fetch function`);let t=await e(this.options.viewKey);if(!t)throw Error(`Error fetching playback object`);return t}setChaptersInternal(e,t){let n=nh.getTrack(this.player,`chapters`,null);n||=this.player.addTextTrack(`chapters`),[...n.cues.cues_].forEach(e=>n.removeCue(e)),e.forEach(e=>{n.addCue({startTime:e.timestamp,endTime:e.endTimestamp,text:e.name})}),t&&n.trigger({type:`cv:cuechange`,target:n}),n.trigger({type:`loadeddata`,target:n})}setChapters(e){this.setChaptersInternal(e,!0)}setPlayerMode(e,t,n){this.player.playerModePlugin().setPlayerMode(e,t,n)}getPlayerMode(){return this.player.playerModePlugin().getMode()}setFavourite(e,t){this.player.favouritePlugin().setFavourite(e,t)}async fetch(){let e=await this.getPlaybackObject();if(this.isDisposed())return;let t=e.mediaType===`MasterClip`,n=e.additionalData?.clipData;e.chapters?.list?.length>0&&!t&&!n&&this.setChaptersInternal(e.chapters.list,!1),this.player.localCache({localCacheAddresses:e.localCacheAddresses??[],enabled:this.options.enableLocalCache??!0}),this.player.mediaSources({files:e.files,viewKey:this.options.viewKey,settings:e.settings}),this.player.handleNetworkErrors({playerApi:this.options.playerApi,fileToken:e.files.fileToken}),e.subtitles.list.length>0&&e.subtitles.list.forEach(e=>{if(e.mimeType!==`text/vtt`)return;let t=this.player.addRemoteTextTrack({kind:`subtitles`,src:e.url,language:e.language,label:e.label},!0);if(nh.sanitizeTrack(t.track,this.player),this.options.allowTranscript){let t=this.player.addRemoteTextTrack({kind:`metadata`,src:e.url+(e.url.includes(`?`)?`&`:`?`)+`fullSentences=true`,language:e.language,label:`transcript`},!0);t.track.isClickViewProduced=e.isClickViewProduced,nh.sanitizeTrack(t.track,this.player)}}),e.posterUrl&&this.player.poster(F.createUrl(e.posterUrl,{size:re.Large})),this.setupSplash({title:e.title,posterUrl:e.posterUrl,episodeNumber:e.episodeNumber,ratingCode:e.ratingCode,seasonNumber:e.seasonNumber,seriesName:e.seriesName}),this.additionalSetup(e),this.handleAutoplay(e),this.options.startTime&&(this.player.currentTime(this.options.startTime),this.player.one(`canplay`,()=>{this.player.currentTime(this.options.startTime)})),this.player.trigger(`cv-playback-data-loaded`,e)}handleFetchError(e){let t=e.message;e instanceof ag&&e.response?.type===_g.PhysicallyChapteredVideo&&(t=`Video cannot be played because it is either corrupt or damaged.`),this.player.error(t),this.options.onError&&this.options.onError(e)}async fetchConfig(){if(Aw||this.options.fetch||this.options.offlinePlaybackObject)return;let e=`${this.options.playerApi.origin}/api/config`;Aw=await og.get(e),!this.isDisposed()&&this.trigger(`config:loaded`)}additionalSetup(e){this.player.whiteboardModePlugin(),this.player.deferMenusPlugin();let t=this.options.enableLocalCache&&!!e.localCacheAddresses?.length;Aw?this.setupAnalyticsService(e,t):this.one(`config:loaded`,()=>this.setupAnalyticsService(e,t)),this.analyticsService||!this.isAnalyticsEnabled()?this.setupAnalyticsDependentPlugins(e):this.one(`analytics:loaded`,()=>this.setupAnalyticsDependentPlugins(e))}setupAnalyticsService(e,t){this.options.eventLogging&&(this.analyticsService=new ig({player:this.player,collectionApiUrls:Aw.collectionApi.urls,collectionApiClientId:Aw.collectionApi.clientId,productVersion:vg.version,authSessionId:e.viewerAuthSessionId,videoId:e.videoId,mediaId:e.mediaId,userId:e.viewerId,shareId:e.shareId,customerId:e.viewerCustomerId,mediaType:e.mediaType,playerType:this.getAnalyticsPlayerType(),isEmbedded:this.options.embed,isUsingLocalCache:t,additionalAnalyticsData:this.getAdditionalAnalyticsData(e),regionName:e.instanceRegion||this.options.sharerInstanceRegion||E.CvApSoutheast1}),this.on(`timeupdate`,this.logStream),this.trigger(`analytics:loaded`))}setupAnalyticsDependentPlugins(e){this.player.persistSubtitleSettingsPlugin({showSubtitles:e.settings?.showSubtitles,subtitleSize:e.settings?.playbackSubtitleSizeDefault,analyticsService:this.analyticsService}),this.player.persistQualitySettingsPlugin({playbackQuality:e.settings?.playbackQuality,playbackQualityLocalCache:e.settings?.playbackQualityLocalCache,playbackQualityFallback:e.settings?.playbackQualityFallback,analyticsService:this.analyticsService}),this.player.persistPlaybackRatePlugin({analyticsService:this.analyticsService})}getAdditionalAnalyticsData(e){return{}}isAnalyticsEnabled(){return this.options.fetch||this.options.offlinePlaybackObject?!1:this.options.eventLogging}handleAutoplay(e){this.options.autoplay&&this.player.ready(()=>{this.player.play().catch(()=>{this.isDisposed()||this.showSplash()})})}logStream(){this.analyticsService&&(this.player.currentTime()<kw||this.streamLogged||this.player.playerModePlugin().getMode()!==Nh.Hover&&(this.analyticsService.logStream(),this.streamLogged=!0,this.off(`timeupdate`,this.logStream)))}getAnalyticsPlayerType(){return`player`}createEl(e){let t;typeof e==`string`?(e=Ow(e),t=X.dom.$(`#`+e)):t=e;let n=`video-js`;return this.getPlayerClassName()&&(n+=` ${this.getPlayerClassName()}`),this.el=X.dom.createEl(`video`,{},{class:n}),t.appendChild(this.el),this.el}getPlayerClassName(){return``}on(e,t){this.player.on(e,t)}one(e,t){this.player.one(e,t)}off(e,t){this.player.off(e,t)}trigger(e,t){return this.player.trigger(e,t)}dispose(){this.player.dispose()}ready(e){this.player.ready(e)}isDisposed(){return this.player.isDisposed()}play(){this.player.play()}pause(){this.player.pause()}isPaused(){return this.player.paused()}currentTime(e){return this.player.currentTime(e)}muted(e){return this.player.muted(e)}duration(){return this.player.duration()}isFullscreen(){return this.player.isFullscreen()}requestFullscreen(){this.player.requestFullscreen()}exitFullscreen(){this.player.exitFullscreen()}playbackRate(e){return this.player.playbackRate(e)}quality(e){let t=this.player.qualityManager();if(e===`auto`){t.selectAuto();return}if(e){t.select(e.toString());return}return t.getSelected()?.id}subtitles(e){let t=this.player.textTracks();for(let n=0;n<t.length;n++){let r=t[n];if(r.kind===`subtitles`){if(e!==void 0){r.label===e?r.mode=`showing`:r.mode=`disabled`;continue}if(r.mode===`showing`)return r.label}}}bindEventListeners(){let e=e=>e.preventDefault();if(this.showSplash=this.showSplash.bind(this),this.hideSplash=this.hideSplash.bind(this),this.player.on(`ended`,this.showSplash),this.player.on(`play`,this.hideSplash),this.player.tech(!0).on(`contextmenu`,e),this.player.one(`dispose`,()=>{this.off(`ended`,this.showSplash),this.off(`play`,this.hideSplash),this.player.tech(!0).off(`contextmenu`,e)}),!this.options.hotkeyElQuerySelector)return;let t=X.dom.$(this.options.hotkeyElQuerySelector);t&&(this.player.on(t,`keydown`,this.player.handleKeyDown),this.player.one(`dispose`,()=>{this.player.off(t,`keydown`,this.player.handleKeyDown)}))}setupSeekBar(){let e=this.getSeekBarName(),t=this.player.controlBar.getChild(`progressControl`);t.addChild(e,{...this.getSeekBarOptions(),playerOptions:this.player.options_.playerOptions}),t.setSeekBarName(e)}setupSplash(e){this._splashAdded||(this._splashAdded=!0,this.player.addChild(`posterImage`,{embed:this.options.embed,...e}),this.player.addChild(`bigPlayButton`),this.options.autoplay?this.hideSplash():this.showSplash())}showSplash(){this.player.hasStarted(!1),this.player.getChild(`posterImage`).show(),this.player.getChild(`bigPlayButton`).show()}hideSplash(){this.player.getChild(`posterImage`).hide(),this.player.getChild(`bigPlayButton`).hide()}getSeekBarOptions(){return{}}getSeekBarName(){return`ChapterSeekBar`}};function Mw(e){return new Proxy(e,{get(e,t,n){if(!(t!==`off`&&e.isDisposed()))return Reflect.get(e,t,n)}})}export{Jh as A,cb as C,Iy as D,By as E,nh as F,Gm as I,X as L,sh as M,oh as N,Zg as O,ih as P,ge as R,ub as S,Hy as T,Rb as _,DS as a,_b as b,qx as c,jx as d,Tx as f,zb as g,Bb as h,OS as i,Q as j,og as k,Bx as l,yx as m,jw as n,yS as o,Cx as p,TC as r,Yx as s,Mw as t,Lx as u,Lb as v,ob as w,hb as x,Ib as y,he as z};
269
- //# sourceMappingURL=UFmS4XTi.chunk.js.map
269
+ //# sourceMappingURL=DTUkmChD.chunk.js.map