@clickview/lite 0.104.0-rc.7 → 0.104.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.
- package/dist/.vite/manifest.json +575 -575
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/{Dnz8CbEu.chunk.js → -QIG2ZHc.chunk.js} +3 -3
- package/dist/scripts/{Dnz8CbEu.chunk.js.map → -QIG2ZHc.chunk.js.map} +1 -1
- package/dist/scripts/{CX6c7KRp2.chunk.js → 0mx04bmJ2.chunk.js} +2 -2
- package/dist/scripts/{CX6c7KRp2.chunk.js.map → 0mx04bmJ2.chunk.js.map} +1 -1
- package/dist/scripts/{CMHxOVI7.chunk.js → 41LJfkjO.chunk.js} +2 -2
- package/dist/scripts/{CMHxOVI7.chunk.js.map → 41LJfkjO.chunk.js.map} +1 -1
- package/dist/scripts/{BBWnpWNB2.chunk.js → 7uvJMXC12.chunk.js} +2 -2
- package/dist/scripts/{BBWnpWNB2.chunk.js.map → 7uvJMXC12.chunk.js.map} +1 -1
- package/dist/scripts/{CaCm4N_d2.chunk.js → B-HfRX562.chunk.js} +2 -2
- package/dist/scripts/{CaCm4N_d2.chunk.js.map → B-HfRX562.chunk.js.map} +1 -1
- package/dist/scripts/{DSPMbDdF.chunk.js → B3_lC6bW.chunk.js} +2 -2
- package/dist/scripts/{DSPMbDdF.chunk.js.map → B3_lC6bW.chunk.js.map} +1 -1
- package/dist/scripts/{0Fek4oFk.chunk.js → BLE8DLAY.chunk.js} +2 -2
- package/dist/scripts/{0Fek4oFk.chunk.js.map → BLE8DLAY.chunk.js.map} +1 -1
- package/dist/scripts/{B338pwKt2.chunk.js → BRt-Kdnn2.chunk.js} +2 -2
- package/dist/scripts/{B338pwKt2.chunk.js.map → BRt-Kdnn2.chunk.js.map} +1 -1
- package/dist/scripts/{D3ncynN72.chunk.js → BVBpDZoT2.chunk.js} +3 -3
- package/dist/scripts/{D3ncynN72.chunk.js.map → BVBpDZoT2.chunk.js.map} +1 -1
- package/dist/scripts/{5PKjjI4Y.chunk.js → BapoiGsj.chunk.js} +2 -2
- package/dist/scripts/{5PKjjI4Y.chunk.js.map → BapoiGsj.chunk.js.map} +1 -1
- package/dist/scripts/{CNfmLVE82.chunk.js → Bc1JT5Y-2.chunk.js} +2 -2
- package/dist/scripts/{CNfmLVE82.chunk.js.map → Bc1JT5Y-2.chunk.js.map} +1 -1
- package/dist/scripts/{cDv6zuhh.chunk.js → BhE5KhcC.chunk.js} +2 -2
- package/dist/scripts/{cDv6zuhh.chunk.js.map → BhE5KhcC.chunk.js.map} +1 -1
- package/dist/scripts/{Bzk4AwVx2.chunk.js → BncgzKKQ2.chunk.js} +2 -2
- package/dist/scripts/{Bzk4AwVx2.chunk.js.map → BncgzKKQ2.chunk.js.map} +1 -1
- package/dist/scripts/BwBWuxjr2.chunk.js +2 -0
- package/dist/scripts/{B1hsuVfV2.chunk.js.map → BwBWuxjr2.chunk.js.map} +1 -1
- package/dist/scripts/{B1TqilLB.chunk.js → C6z8ii6C.chunk.js} +2 -2
- package/dist/scripts/{B1TqilLB.chunk.js.map → C6z8ii6C.chunk.js.map} +1 -1
- package/dist/scripts/{fMgBORUX.chunk.js → C8x-QH43.chunk.js} +2 -2
- package/dist/scripts/{fMgBORUX.chunk.js.map → C8x-QH43.chunk.js.map} +1 -1
- package/dist/scripts/{BiWUSyJr.chunk.js → CAkqvKfy.chunk.js} +2 -2
- package/dist/scripts/{BiWUSyJr.chunk.js.map → CAkqvKfy.chunk.js.map} +1 -1
- package/dist/scripts/{D-iyHqNw2.chunk.js → CLvImDXv2.chunk.js} +3 -3
- package/dist/scripts/{D-iyHqNw2.chunk.js.map → CLvImDXv2.chunk.js.map} +1 -1
- package/dist/scripts/{Cqq1N9xw.chunk.js → CM8248d7.chunk.js} +2 -2
- package/dist/scripts/{Cqq1N9xw.chunk.js.map → CM8248d7.chunk.js.map} +1 -1
- package/dist/scripts/{B_TE5XUR2.chunk.js → CvilnM0u2.chunk.js} +2 -2
- package/dist/scripts/{B_TE5XUR2.chunk.js.map → CvilnM0u2.chunk.js.map} +1 -1
- package/dist/scripts/{AEOAlemi.chunk.js → Cwocc8uV.chunk.js} +2 -2
- package/dist/scripts/{AEOAlemi.chunk.js.map → Cwocc8uV.chunk.js.map} +1 -1
- package/dist/scripts/{Bld7iWR52.chunk.js → D-pn0sNx2.chunk.js} +2 -2
- package/dist/scripts/{Bld7iWR52.chunk.js.map → D-pn0sNx2.chunk.js.map} +1 -1
- package/dist/scripts/{Cyit3dMk.chunk.js → D78QEASE.chunk.js} +2 -2
- package/dist/scripts/{Cyit3dMk.chunk.js.map → D78QEASE.chunk.js.map} +1 -1
- package/dist/scripts/{Dtag-27K.chunk.js → DER8311r.chunk.js} +2 -2
- package/dist/scripts/{Dtag-27K.chunk.js.map → DER8311r.chunk.js.map} +1 -1
- package/dist/scripts/{CmnbQiBA.chunk.js → DSZaceCq.chunk.js} +2 -2
- package/dist/scripts/{CmnbQiBA.chunk.js.map → DSZaceCq.chunk.js.map} +1 -1
- package/dist/scripts/{CfNYFxJl2.chunk.js → D_1m0b_a2.chunk.js} +2 -2
- package/dist/scripts/{CfNYFxJl2.chunk.js.map → D_1m0b_a2.chunk.js.map} +1 -1
- package/dist/scripts/{-KvTbeQV.chunk.js → DhcRnxkp.chunk.js} +2 -2
- package/dist/scripts/{-KvTbeQV.chunk.js.map → DhcRnxkp.chunk.js.map} +1 -1
- package/dist/scripts/{qRLSbnEr.chunk.js → DhdM2yGm.chunk.js} +2 -2
- package/dist/scripts/{qRLSbnEr.chunk.js.map → DhdM2yGm.chunk.js.map} +1 -1
- package/dist/scripts/{DKDWcWxk.chunk.js → Dqn0sInF.chunk.js} +2 -2
- package/dist/scripts/{DKDWcWxk.chunk.js.map → Dqn0sInF.chunk.js.map} +1 -1
- package/dist/scripts/{CAs2Sere2.chunk.js → MW7W80HY2.chunk.js} +2 -2
- package/dist/scripts/{CAs2Sere2.chunk.js.map → MW7W80HY2.chunk.js.map} +1 -1
- package/dist/scripts/{CwFYdvvA.chunk.js → Okf3Hn0s.chunk.js} +2 -2
- package/dist/scripts/{CwFYdvvA.chunk.js.map → Okf3Hn0s.chunk.js.map} +1 -1
- package/dist/scripts/{Dt5731Ay.chunk.js → _lqYS5Jx.chunk.js} +2 -2
- package/dist/scripts/{Dt5731Ay.chunk.js.map → _lqYS5Jx.chunk.js.map} +1 -1
- package/dist/scripts/{app-CyGIKC-k.js → app-H3wSQ-PR.js} +4 -4
- package/dist/scripts/{app-CyGIKC-k.js.map → app-H3wSQ-PR.js.map} +1 -1
- package/dist/scripts/{B3AhKFfz.chunk.js → ftYw2FVB.chunk.js} +2 -2
- package/dist/scripts/{B3AhKFfz.chunk.js.map → ftYw2FVB.chunk.js.map} +1 -1
- package/dist/scripts/{DyE6EUDb.chunk.js → kjRiUKIL.chunk.js} +2 -2
- package/dist/scripts/{DyE6EUDb.chunk.js.map → kjRiUKIL.chunk.js.map} +1 -1
- package/dist/scripts/{B3y60nT5.chunk.js → pDWQ8Uj5.chunk.js} +2 -2
- package/dist/scripts/{B3y60nT5.chunk.js.map → pDWQ8Uj5.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/B1hsuVfV2.chunk.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"B1TqilLB.chunk.js","names":[],"sources":["../../../../libs/shared/src/components/time-input/time-input.module.scss","../../../../libs/shared/src/components/time-input/TimeInput.tsx","../../../../libs/shared/src/apps/clips/components/clip-time-form/ClipTimeForm.tsx","../../../player/src/plugins/create-clip-plugin/components/clip-timepoint-selector/clip-timepoint-selector-handle.ts","../../../player/src/plugins/create-clip-plugin/components/clip-timepoint-selector/clip-timepoint-selector.ts","../../../player/src/plugins/create-clip-plugin/components/create-clip-progress-indicator/create-clip-progress-indicator.ts","../../../player/src/plugins/create-clip-plugin/components/create-clip-seek-bar/create-clip-seek-bar.ts","../../../player/src/plugins/create-clip-plugin/create-clip-plugin.ts","../../../player/src/players/create-clip-player.ts","../../../player/src/react/CreateClipPlayer.tsx","../../src/shared/views/edit-clip-timepoints/EditClipTimepointsView.tsx"],"sourcesContent":[":local {\n .arrowContainer {\n padding: 0.16666rem;\n cursor: pointer;\n\n &:hover {\n background-color: $gray-400;\n }\n }\n\n %arrow {\n width: 0.66666rem; \n height: 0.33333rem; \n border-left: 0.33333rem solid transparent;\n border-right: 0.33333rem solid transparent;\n }\n\n .upArrow {\n @extend %arrow;\n border-bottom: 0.33333rem solid $gray-900;\n }\n\n .downArrow {\n @extend %arrow;\n border-top: 0.33333rem solid $gray-900;\n }\n\n .inputContainer {\n border: 1px solid $gray-300;\n transition: box-shadow 0.1s ease-in-out;\n\n &.focus {\n border: 1px solid $blue;\n outline: 0 !important;\n box-shadow: $input-focus-box-shadow;\n }\n\n input {\n width: 1.5rem;\n }\n }\n}","import * as React from 'react';\n\nimport { TimeHelper } from 'libs/common/react/utils/TimeHelper';\n\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\n\nimport styles from './time-input.module.scss';\n\nconst UP_ARROW_KEYCODE = 38;\nconst DOWN_ARROW_KEYCODE = 40;\n\nconst HOUR = 3600; // hour in seconds;\n\ninterface TimeInputProps {\n /**\n * A time in seconds\n */\n value: number;\n\n /**\n * Callback to set time where time is in seconds.\n *\n * Will be called on blur.\n */\n setTime: (time: number) => void;\n\n /**\n * Allows a time to be typed in by the user.\n *\n * Note: this doesn't include UP/DOWN keyboard arrows which are always enabled.\n */\n allowKeyboardInput?: boolean;\n\n formSize?: 'md' | 'lg';\n\n hasError?: boolean;\n\n /**\n * Time in seconds to logically cap the maximum input value\n */\n maxValue?: number;\n\n disabled?: boolean;\n\n /**\n * If set to true, will hide the up and down arrow buttons\n */\n hideButtons?: boolean;\n\n duration?: number;\n}\n\nTimeInput.defaultProps = {\n allowKeyboardInput: true,\n size: 'lg'\n};\n\nexport function TimeInput(props: TimeInputProps): JSX.Element {\n const [ hours, setHours ] = React.useState('00');\n const [ minutes, setMinutes ] = React.useState('00');\n const [ seconds, setSeconds ] = React.useState('00');\n const [ focus, setFocus ] = React.useState(false);\n\n const minutesRef = React.useRef(null);\n const secondsRef = React.useRef(null);\n\n const showHours = props.duration && props.duration >= HOUR;\n\n function handleFocus(e: React.FocusEvent<HTMLInputElement>) {\n e.target.select();\n setFocus(true);\n }\n\n function handleChange(\n event: React.ChangeEvent<HTMLInputElement>,\n setValue: (value: string) => void,\n nextInputRef?: React.MutableRefObject<HTMLInputElement>\n ) {\n const inputValue = event.target.value;\n const formattedValue = inputValue.replace(/\\D/g, '').slice(0, 2);\n setValue(formattedValue);\n \n if (formattedValue.length === 2 && nextInputRef?.current)\n requestAnimationFrame(() => nextInputRef.current.focus());\n }\n\n function increment(): void {\n props.setTime(props.value + 1);\n }\n\n function decrement(): void {\n props.setTime(props.value - 1);\n }\n\n function handleBlur(\n event: React.ChangeEvent<HTMLInputElement>,\n setValue: (value: string) => void\n ): void {\n if (!props.allowKeyboardInput)\n return;\n\n updateTime(TimeHelper.convertDurationToSeconds(hours, minutes, seconds));\n setValue(event.target.value.padStart(2, '0'));\n setFocus(false);\n }\n\n function updateTime(value: number) {\n if (value < 0)\n return;\n \n if (props.maxValue && value > props.maxValue)\n return;\n \n props.setTime(value);\n }\n\n function setTimeInputs() {\n const displayDuration = DurationHelper.ToDisplayDuration(props.value * 1000, true).split(':');\n\n setHours(String(displayDuration[0]).padStart(2, '0'));\n setMinutes(displayDuration[1]);\n setSeconds(displayDuration[2]);\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (e.keyCode === UP_ARROW_KEYCODE)\n increment();\n\n if (e.keyCode === DOWN_ARROW_KEYCODE)\n decrement();\n }\n\n React.useEffect(() => {\n setTimeInputs();\n }, [props.value]);\n\n return (\n <div className={`${styles.inputContainer} ${focus ? styles.focus : ''} position-relative bg-white d-flex align-items-center p-2 rounded-pill font-size-md`}>\n <div className={`${showHours ? '' : 'd-none'}`}>\n <input\n type='text'\n className='border-0 outline-none'\n value={hours}\n maxLength={2}\n placeholder='HH'\n onChange={e => handleChange(e, setHours, minutesRef)}\n onFocus={handleFocus}\n onBlur={e => handleBlur(e, setHours)}\n onKeyDown={handleKeyDown}\n disabled={props.disabled}\n />\n <span>:</span>\n </div>\n <div>\n <input\n ref={minutesRef}\n type='text'\n className='border-0 outline-none'\n value={minutes}\n maxLength={2}\n placeholder='MM'\n onChange={e => handleChange(e, setMinutes, secondsRef)}\n onFocus={handleFocus}\n onBlur={e => handleBlur(e, setMinutes)}\n onKeyDown={handleKeyDown}\n disabled={props.disabled}\n />\n <span>:</span>\n </div>\n <input\n ref={secondsRef}\n type='text'\n className='border-0 outline-none'\n value={seconds}\n maxLength={2}\n placeholder='SS'\n onChange={e => setSeconds(e.target.value)}\n onFocus={handleFocus}\n onBlur={e => handleBlur(e, setSeconds)}\n onKeyDown={handleKeyDown}\n disabled={props.disabled}\n />\n {!props.hideButtons &&\n <div>\n <div className={styles.arrowContainer} onClick={increment}>\n <div className={styles.upArrow} />\n </div>\n <div className={styles.arrowContainer} onClick={decrement}>\n <div className={styles.downArrow} />\n </div>\n </div>\n }\n </div>\n );\n}\n\n","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { TimeInput } from 'libs/shared/components/time-input/TimeInput';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\n\nconst namespace = 'shared.clipTimeForm';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n/**\n * All times are in seconds.\n */\ninterface ClipTimeFormProps {\n startTime: number;\n endTime: number;\n setStartTime: (time: number) => void;\n setEndTime: (time: number) => void;\n onSubmit: () => void;\n onCancel: () => void;\n duration: number;\n}\n\nexport function ClipTimeForm(props: ClipTimeFormProps): JSX.Element {\n if (isNaN(props.startTime) || isNaN(props.endTime))\n return <></>;\n\n /**\n * DurationHelper.ToDisplayDuration in TimeInput will truncate as decimals\n * so we floor the times when displaying the duration.\n */\n const duration = Math.floor(props.endTime) - Math.floor(props.startTime);\n\n return (\n <div className='px-3'>\n <form className='d-flex align-items-center justify-content-center pb-4'>\n <div>\n <TimeInput\n value={props.startTime}\n setTime={props.setStartTime}\n duration={props.duration}\n />\n </div>\n <span className='px-2'>-</span>\n <div className='me-2'>\n <TimeInput\n value={props.endTime}\n setTime={props.setEndTime}\n duration={props.duration}\n />\n </div>\n <span>\n <strong><Text namespace={namespace} phrase='duration' /></strong>\n \n {DurationHelper.ToDisplayDuration((duration) * 1000)}\n </span>\n </form>\n <div className='d-flex justify-content-end'>\n <button className='btn btn-link' onClick={props.onCancel}>\n {getPhrase('cancel')}\n </button>\n <button className='btn btn-dark' onClick={props.onSubmit}>\n {getPhrase('next')}\n </button>\n </div>\n </div>\n );\n}\n","import videojs from 'video.js';\n\nconst Component = videojs.getComponent('Component');\n\n// tslint:disable-next-line\nconst handleSvg = '<svg viewBox=\"0 0 5 14\" pointer-events=\"none\"><g id=\"Clips\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"><g id=\"Clip-2\" transform=\"translate(-835.000000, -632.000000)\" fill=\"#FFFFFF\"><g id=\"Video-Copy\" transform=\"translate(275.000000, 96.000000)\"><g id=\"Handles\" transform=\"translate(560.000000, 536.000000)\"><circle id=\"Oval\" cx=\"1\" cy=\"1\" r=\"1\"></circle><circle id=\"Oval-Copy-2\" cx=\"1\" cy=\"5\" r=\"1\"></circle><circle id=\"Oval-Copy-4\" cx=\"1\" cy=\"9\" r=\"1\"></circle><circle id=\"Oval-Copy-8\" cx=\"1\" cy=\"13\" r=\"1\"></circle><circle id=\"Oval-Copy\" cx=\"4\" cy=\"1\" r=\"1\"></circle><circle id=\"Oval-Copy-3\" cx=\"4\" cy=\"5\" r=\"1\"></circle><circle id=\"Oval-Copy-5\" cx=\"4\" cy=\"9\" r=\"1\"></circle><circle id=\"Oval-Copy-9\" cx=\"4\" cy=\"13\" r=\"1\"></circle></g></g></g></g></svg>';\n\nexport class ClipTimepointSelectorHandle extends Component {\n public buildCSSClass(): string {\n return `cv-clip-timepoint-handle ${super.buildCSSClass()}`;\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): Element {\n return super.createEl(tagName, {\n ...properties,\n className: this.buildCSSClass(),\n innerHTML: handleSvg\n }, attributes);\n }\n\n public isEventTarget(e: videojs.EventTarget.Event): boolean {\n return this.el().contains(e.target as Node);\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nconst Component = videojs.getComponent('Component');\n\nimport {\n ClipTimepointSelectorHandle\n} from 'projects/player/plugins/create-clip-plugin/components/clip-timepoint-selector/clip-timepoint-selector-handle';\n\nimport './clip-timepoint-selector.scss';\n\nexport interface ClipTimepointSelectorOptions extends videojs.ComponentOptions {\n startTime: number;\n endTime: number;\n minDuration: number;\n onChangeStartTime: (startTime: number) => void;\n onChangeEndTime: (endTime: number) => void;\n}\n\nexport class ClipTimepointSelector extends Component {\n // tslint:disable-next-line\n public options_: ClipTimepointSelectorOptions;\n\n // tslint:disable-next-line\n public el_: HTMLElement;\n\n private minDuration: number;\n\n /**\n * These variables shouldn't be set directly.\n * setStartTime and setEndTime should be used.\n */\n private startTime: number;\n private endTime: number;\n\n private startHandle: ClipTimepointSelectorHandle;\n private endHandle: ClipTimepointSelectorHandle;\n\n private dragStartActive: boolean = false;\n private dragEndActive: boolean = false;\n private dragSliderActive: boolean = false;\n\n private dragSliderCurrentPosition: number = null;\n\n constructor(player: VideoJsPlayer, options: ClipTimepointSelectorOptions) {\n super(player, options);\n\n this.minDuration = Math.min(player.duration(), this.options_.minDuration);\n\n this.setStartTime(options.startTime, false);\n this.setEndTime(options.endTime, false);\n\n this.startHandle = new ClipTimepointSelectorHandle(this.player(), options);\n this.startHandle.addClass('cv-clip-start-handle');\n this.addChild(this.startHandle);\n\n this.endHandle = new ClipTimepointSelectorHandle(this.player(), options);\n this.endHandle.addClass('cv-clip-end-handle');\n this.addChild(this.endHandle);\n\n this.on(this.player(), 'update:clip:start:time', ({ time }) => this.setStartTime(time));\n this.on(this.player(), 'update:clip:end:time', ({ time }) => this.setEndTime(time));\n\n this.bindListeners();\n this.update();\n }\n\n public createEl(): Element {\n return super.createEl('div', {\n className: 'cv-clip-timepoint-selector'\n }, {});\n }\n\n private update(): void {\n this.options_.onChangeStartTime(this.startTime);\n this.options_.onChangeEndTime(this.endTime);\n\n this.requestAnimationFrame(() => {\n this.setStartOffset();\n this.setWidth();\n });\n }\n\n private setStartTime(time: number, shouldUpdate: boolean = true): void {\n if (isNaN(time))\n return;\n\n const currentDuration = this.hasStartTime() && this.hasEndTime() && (this.endTime - this.startTime);\n\n const maxStartTime = this.player().duration() - this.minDuration;\n\n if (time > maxStartTime)\n time = maxStartTime;\n\n if (time < 0)\n time = 0;\n\n this.startTime = time;\n\n if (this.endTime && (this.endTime - this.startTime < this.minDuration)) {\n const newEndTime = typeof currentDuration === 'number' ?\n this.startTime + currentDuration :\n this.startTime + this.minDuration;\n\n this.setEndTime(newEndTime);\n }\n\n /**\n * Seek player to the clip start time.\n */\n this.player().currentTime(this.startTime);\n\n if (shouldUpdate)\n this.update();\n }\n\n private setEndTime(time: number, shouldUpdate: boolean = true): void {\n if (isNaN(time))\n return;\n\n const currentDuration = this.hasStartTime() && this.hasEndTime() && (this.endTime - this.startTime);\n\n const minEndTime = this.minDuration;\n\n if (time < minEndTime)\n time = minEndTime;\n\n if (time > this.player().duration())\n time = this.player().duration();\n\n this.endTime = time;\n\n if (this.startTime && (this.endTime - this.startTime < this.minDuration)) {\n const newStartTime = typeof currentDuration === 'number' ?\n this.endTime - currentDuration :\n this.endTime - this.minDuration;\n\n this.setStartTime(newStartTime);\n }\n\n if (shouldUpdate)\n this.update();\n }\n\n private bindListeners(): void {\n this.onTimeupdate = this.onTimeupdate.bind(this);\n this.player().on('timeupdate', this.onTimeupdate);\n\n this.on('mousedown', this.dragStart);\n this.on('touchstart', this.dragStart);\n\n this.player().on('dispose', () => {\n this.player().off('timeupdate', this.onTimeupdate);\n this.off('mousedown', this.dragStart);\n this.off('touchstart', this.dragStart);\n });\n }\n\n private hasStartTime(): boolean {\n return typeof this.startTime === 'number';\n }\n\n private hasEndTime(): boolean {\n return typeof this.endTime === 'number';\n }\n\n private onTimeupdate(): void {\n /**\n * Pause the player if it plays past the end point\n */\n const currentTime = this.player().currentTime();\n if (currentTime > this.endTime && currentTime < (this.endTime + 0.5))\n this.player().pause();\n }\n\n private dragStart(e: videojs.EventTarget.Event): void {\n if (this.startHandle.isEventTarget(e)) {\n e.stopImmediatePropagation();\n this.dragStartActive = true;\n }\n\n if (this.endHandle.isEventTarget(e)) {\n e.stopImmediatePropagation();\n this.dragEndActive = true;\n }\n\n if (e.target === this.el()) {\n e.stopImmediatePropagation();\n this.dragSliderActive = true;\n this.dragSliderCurrentPosition = this.getPosition(e);\n }\n\n const doc = this.el().ownerDocument as unknown as Element;\n\n this.on(doc, 'mousemove', this.drag);\n this.on(doc, 'mouseup', this.dragEnd);\n this.on(doc, 'touchmove', this.drag);\n this.on(doc, 'touchend', this.dragEnd);\n\n this.drag(e);\n }\n\n private dragEnd(): void {\n this.dragStartActive = false;\n this.dragEndActive = false;\n this.dragSliderActive = false;\n this.dragSliderCurrentPosition = null;\n\n const doc = this.el().ownerDocument as unknown as Element;\n\n this.off(doc, 'mousemove', this.drag);\n this.off(doc, 'mouseup', this.dragEnd);\n this.off(doc, 'touchmove', this.drag);\n this.off(doc, 'touchend', this.dragEnd);\n }\n\n private drag(e: videojs.EventTarget.Event): void {\n if (!this.dragStartActive && !this.dragEndActive && !this.dragSliderActive || !videojs.dom.isSingleLeftClick(e))\n return;\n \n const position = this.getPosition(e);\n\n const timepoint = position * this.player().duration();\n\n if (this.dragStartActive)\n this.handleStartHandleDrag(timepoint);\n\n if (this.dragEndActive)\n this.handleEndHandleDrag(timepoint);\n\n if (this.dragSliderActive)\n this.handleSliderDrag(position);\n }\n\n private handleStartHandleDrag(timepoint: number): void {\n this.setStartTime(timepoint);\n }\n\n private handleEndHandleDrag(timepoint: number): void {\n this.setEndTime(timepoint);\n }\n\n private handleSliderDrag(position: number): void {\n const timeDifference = (position - this.dragSliderCurrentPosition) * this.player().duration();\n const newStartTime = this.startTime + timeDifference;\n const newEndTime = this.endTime + timeDifference;\n\n /**\n * Don't move if the clip is already at the beginning and/or end\n * of the video.\n */\n if (newStartTime <= 0 || newEndTime >= this.player().duration())\n return;\n\n this.dragSliderCurrentPosition = position;\n this.setStartTime(newStartTime);\n this.setEndTime(newEndTime);\n }\n\n private getPosition(e: videojs.EventTarget.Event): number {\n return videojs.dom.getPointerPosition(this.el_.parentNode as HTMLElement, e).x;\n }\n\n private setStartOffset(): void {\n this.el_.style.marginLeft = `${this.getPercentage(this.startTime)}%`;\n }\n\n private setWidth(): void {\n this.el_.style.width = `${this.getPercentage(this.endTime - this.startTime)}%`;\n }\n\n private getPercentage(time: number): number {\n return +((time / this.player().duration() * 100).toFixed(4));\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nconst Component = videojs.getComponent('Component');\n\nimport './create-clip-progress-indicator.scss';\n\ninterface CreateClipProgressIndicatorOptions extends videojs.ComponentOptions {\n seekBar: videojs.Component;\n playProgressBar: videojs.Component;\n}\n\nexport class CreateClipProgressIndicator extends Component {\n private el_: HTMLDivElement;\n private seekBar_: videojs.Component;\n private playProgressBar_: videojs.Component;\n private videoWasPlaying_: boolean;\n\n constructor(player: VideoJsPlayer, options: CreateClipProgressIndicatorOptions) {\n super(player, options);\n\n this.seekBar_ = options.seekBar;\n this.playProgressBar_ = options.playProgressBar;\n\n this.bindListeners();\n this.player_.one('dispose', () => {\n this.unbindListeners();\n });\n }\n\n public createEl(tagName?: string, properties?: any, attribtues?: any): Element {\n return super.createEl(tagName, {\n ...properties,\n className: 'cv-create-clip-progress-indicator'\n }, attribtues);\n }\n\n private bindListeners(): void {\n this.on('mousedown', this.handleMouseDown);\n this.on('touchstart', this.handleMouseDown);\n }\n\n private unbindListeners(): void {\n const doc = (this.el_ as any).ownerDocument;\n\n this.off('mousedown', this.handleMouseDown);\n this.off('touchstart', this.handleMouseDown);\n this.off(doc, 'mousemove', this.handleMouseMove);\n this.off(doc, 'mouseup', this.handleMouseUp);\n this.off(doc, 'touchmove', this.handleMouseMove);\n this.off(doc, 'touchend', this.handleMouseUp);\n }\n\n private handleMouseDown(event: videojs.EventTarget.Event): void {\n // Prevent handling right and middle mouse clicks\n if (!videojs.dom.isSingleLeftClick(event))\n return;\n\n event.stopPropagation();\n if (event.type === 'mousedown')\n event.preventDefault();\n\n /**\n * Comment below copied over from videojs - Sha\n * \n * Do not call preventDefault() on touchstart in Chrome\n * to avoid console warnings. Use a 'touch-action: none' style\n * instead to prevent unintented scrolling.\n * https://developers.google.com/web/updates/2017/01/scrolling-intervention\n */\n if (event.type === 'touchstart' && !videojs.browser.IS_CHROME)\n event.preventDefault();\n\n this.player_.scrubbing(true);\n this.videoWasPlaying_ = !this.player_.paused();\n this.player_.pause();\n\n videojs.dom.blockTextSelection();\n\n const doc = (this.el_ as any).ownerDocument;\n\n this.on(doc, 'mousemove', this.handleMouseMove);\n this.on(doc, 'mouseup', this.handleMouseUp);\n this.on(doc, 'touchmove', this.handleMouseMove);\n this.on(doc, 'touchend', this.handleMouseUp);\n\n this.handleMouseMove(event);\n\n this.player_.addClass('cv-hide-mouse-time');\n }\n\n private handleMouseMove(event: videojs.EventTarget.Event): void {\n // Prevent handling right and middle mouse clicks\n if (!videojs.dom.isSingleLeftClick(event))\n return;\n\n const distance = videojs.dom.getPointerPosition((this.seekBar_ as any).el_, event).x;\n\n let newTime = distance * this.player_.duration();\n\n // Don't let video end while scrubbing.\n if (newTime === this.player_.duration())\n newTime = newTime - 0.1;\n\n this.player_.currentTime(newTime);\n (this.playProgressBar_ as any).update();\n }\n\n private handleMouseUp(event: videojs.EventTarget.Event): void {\n videojs.dom.unblockTextSelection();\n\n const doc = (this.el_ as any).ownerDocument;\n\n this.off(doc, 'mousemove', this.handleMouseMove);\n this.off(doc, 'mouseup', this.handleMouseUp);\n this.off(doc, 'touchmove', this.handleMouseMove);\n this.off(doc, 'touchend', this.handleMouseUp);\n\n event?.stopPropagation();\n this.player_.scrubbing(false);\n this.player_.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n if (this.videoWasPlaying_) {\n this.player_.play();\n }\n\n (this.seekBar_ as any).update();\n this.player_.removeClass('cv-hide-mouse-time');\n }\n}\n\nvideojs.registerComponent('CreateClipProgressIndicator', CreateClipProgressIndicator);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport {\n ClipTimepointSelector,\n ClipTimepointSelectorOptions\n} from 'projects/player/plugins/create-clip-plugin/components/clip-timepoint-selector/clip-timepoint-selector';\nimport { CreateClipProgressIndicator } from 'projects/player/plugins/create-clip-plugin/components/create-clip-progress-indicator/create-clip-progress-indicator';\n\nimport './create-clip-seek-bar.scss';\n\nconst SeekBar = videojs.getComponent('SeekBar') as unknown as typeof videojs.SeekBar;\n\ninterface CreateClipSeekBarOptions extends ClipTimepointSelectorOptions {}\n\nexport class CreateClipSeekBar extends SeekBar {\n constructor(player: VideoJsPlayer, options: any) {\n super(player, options);\n\n this.addClass('cv-create-clip-seek-bar');\n }\n\n public initialize(options: CreateClipSeekBarOptions): void {\n const timepointSelector = new ClipTimepointSelector(this.player(), options);\n\n this.addChild(timepointSelector);\n\n const playProgressBar = this.getChild('playProgressBar');\n const indicator = new CreateClipProgressIndicator(this.player_, {\n seekBar: this,\n playProgressBar\n });\n playProgressBar.addChild(indicator);\n }\n}\n\nCreateClipSeekBar.prototype.options_ = {\n children: ['playProgressBar'],\n barName: 'playProgressBar'\n};\n\n// MouseTimeDisplay tooltips should not be added to a player on mobile devices\nif (!videojs.browser.IS_IOS && !videojs.browser.IS_ANDROID) {\n CreateClipSeekBar.prototype.options_.children.splice(1, 0, 'mouseTimeDisplay');\n}\n\nvideojs.registerComponent('CreateClipSeekBar', CreateClipSeekBar);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport {\n CreateClipSeekBar\n} from 'projects/player/plugins/create-clip-plugin/components/create-clip-seek-bar/create-clip-seek-bar';\n\nimport 'projects/player/plugins/create-clip-plugin/components/create-clip-seek-bar/create-clip-seek-bar';\n\nconst Plugin = videojs.getPlugin('plugin');\n\nconst DEFAULT_MIN_CLIP_DURATION = 5; // seconds;\n\ninterface CreateClipPluginOptions {\n onChangeStartTime: (startTime: number) => void;\n onChangeEndTime: (endTime: number) => void;\n startTime?: number;\n endTime?: number;\n minDuration?: number;\n}\n\nclass CreateClipPlugin extends Plugin {\n private options: CreateClipPluginOptions;\n\n constructor(player: VideoJsPlayer, options: CreateClipPluginOptions) {\n super(player, options);\n\n this.options = options;\n\n this.initCreateClipSeekBar = this.initCreateClipSeekBar.bind(this);\n\n this.player.one('loadedmetadata', () => this.player.ready(this.initCreateClipSeekBar));\n }\n\n private initCreateClipSeekBar(): void {\n const seekBar = this.player.controlBar.getChild('ProgressControl')?.getChild('SeekBar') as CreateClipSeekBar;\n\n if (!seekBar)\n return;\n\n const startTime = (!isNaN(this.options.startTime) && this.options.startTime >= 0) ?\n this.options.startTime :\n 0;\n\n const endTime = (!isNaN(this.options.endTime) && this.options.endTime <= this.player.duration()) ?\n this.options.endTime :\n this.player.duration();\n\n const minDuration = Math.min(this.options.minDuration || DEFAULT_MIN_CLIP_DURATION, this.player.duration());\n\n seekBar.initialize({\n startTime,\n endTime,\n minDuration,\n onChangeStartTime: this.options.onChangeStartTime,\n onChangeEndTime: this.options.onChangeEndTime\n });\n }\n\n public dispose(): void {\n this.player.off('loadedmetadata', this.initCreateClipSeekBar);\n super.dispose();\n }\n}\n\nvideojs.registerPlugin('createClipPlugin', CreateClipPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n createClipPlugin(options: CreateClipPluginOptions): void;\n }\n}\n","/* eslint simple-import-sort/imports: 0 */\n\nimport { VideoJsPlayerOptions } from 'video.js';\nimport { BasePlayer, BasePlayerOptions } from './base-player';\n\nimport { AnalyticsPlayerType } from 'projects/player/services/analytics-service';\n\nimport 'projects/player/plugins/create-clip-plugin/create-clip-plugin';\n\nexport interface CreateClipPlayerOptions extends Omit<BasePlayerOptions, 'playbackRates'> {\n onChangeEndTime: (endTime: number) => void;\n onChangeStartTime: (startTime: number) => void;\n startTime?: number;\n endTime?: number;\n minDuration?: number;\n}\n\nexport class CreateClipPlayer extends BasePlayer {\n declare protected options: CreateClipPlayerOptions;\n\n constructor(id: string | Element, options: CreateClipPlayerOptions) {\n super(id, {\n allowFullscreen: true,\n ...options,\n playbackRates: null,\n enableLocalCache: false\n });\n }\n\n protected getPlayerClassName(): string {\n return 'cv-create-clip-player';\n }\n\n protected configurePlugins(): void {\n const { startTime, endTime, minDuration, onChangeStartTime, onChangeEndTime } = this.options;\n this.player.createClipPlugin({ startTime, endTime, minDuration, onChangeStartTime, onChangeEndTime });\n }\n\n protected getPlayerOptions(): VideoJsPlayerOptions {\n const options = super.getPlayerOptions();\n options.inactivityTimeout = 0;\n return options;\n }\n\n protected getSeekBarName(): string {\n return 'CreateClipSeekBar';\n }\n\n protected getAnalyticsPlayerType(): AnalyticsPlayerType {\n return 'create-clip-player';\n }\n}\n","import React from 'react';\n\nimport { CreateClipPlayer, CreateClipPlayerOptions } from 'projects/player/players/create-clip-player';\nimport { getProxy } from 'projects/player/utils/getProxy';\n\nexport interface ClickViewCreateClipPlayerProps extends CreateClipPlayerOptions {\n onReady?: (player: CreateClipPlayer) => void;\n onDispose?: () => void;\n}\n\nexport function ClickViewCreateClipPlayer(props: ClickViewCreateClipPlayerProps): React.ReactElement {\n const { onReady, onDispose } = props;\n\n const ref = React.useRef(null);\n const playerRef = React.useRef<CreateClipPlayer>(null);\n\n React.useEffect(() => {\n playerRef.current?.dispose();\n\n if (!ref)\n return;\n\n playerRef.current = new CreateClipPlayer(ref.current, props);\n\n if (onReady) {\n playerRef.current.ready(() => {\n onReady(getProxy(playerRef.current));\n });\n }\n\n if (onDispose) {\n playerRef.current.one('dispose', onDispose);\n }\n \n return () => {\n playerRef.current?.dispose();\n };\n }, [props.viewKey]);\n\n React.useEffect(() => {\n playerRef.current?.trigger({ type: 'update:clip:start:time', time: props.startTime });\n }, [props.startTime]);\n\n React.useEffect(() => {\n playerRef.current?.trigger({ type: 'update:clip:end:time', time: props.endTime });\n }, [props.endTime]);\n\n return (\n <div ref={ref}></div>\n );\n}\n","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { ClipTimeForm } from 'libs/shared/apps/clips/components/clip-time-form/ClipTimeForm';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, Config, PlayerViewKey, Video } from 'libs/shared/interfaces';\nimport { DialogHelper } from 'libs/shared/utils/DialogHelper';\n\nimport { CreateClipPlayer } from 'projects/player/players/create-clip-player';\nimport { ClickViewCreateClipPlayer } from 'projects/player/react/CreateClipPlayer';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst NAV_LOCK_ID = 'edit-clip-timepoints';\nconst namespace = 'shared.editClipTimepoints';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst DEFAULT_DURATION = 30;\nconst MIN_DURATION = 5;\n\nfunction handleError(error: string): void {\n DialogHelper.render(\n (\n <p>{error}</p>\n ), {\n title: getPhrase('errorHeading'),\n cancelButtonProps: {\n variant: 'link',\n text: getPhrase('close')\n }\n }\n );\n}\n\nfunction safeStringToNumber(value: string): number {\n if (!value) return 0;\n\n const number = Number(value);\n return isNaN(number) ? 0 : number;\n}\n\ninterface EditClipTimepointsViewProps {\n id?: string;\n videoId?: string;\n startTime?: string;\n isCopying?: boolean;\n}\n\nexport function EditClipTimepointsView(props: EditClipTimepointsViewProps): JSX.Element {\n const playerRef = React.useRef<CreateClipPlayer>(null);\n \n const initialStartTime = safeStringToNumber(props.startTime);\n\n const [ startTime, setStartTime ] = React.useState<number>(initialStartTime);\n const [ endTime, setEndTime ] = React.useState<number>(initialStartTime + DEFAULT_DURATION);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const clip = Flight.useBasicFetch<Clip>(!!props.id && ClipRequests.clip(props.id));\n const videoId = clip.data?._parentVideo?.id || props.videoId;\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(!!videoId &&\n PlayerRequests.createViewKey(videoId, MediaIdType.MasterObject));\n const video = Flight.useBasicFetch<Video>(!!videoId && VideoRequests.video(videoId));\n\n const [ duration, setDuration ] = React.useState<number>(0);\n\n const navLock = useNavLock();\n\n useSetPageMetadata({ title: props.id ? clip.data?.name : getPhrase('pageTitle') });\n\n React.useEffect(() => {\n navLock.lock({\n id: NAV_LOCK_ID,\n title: LanguageService.getPhrase(namespace, 'navLockTitle'),\n text: LanguageService.getPhrase(namespace, 'navLockBody')\n });\n }, []);\n\n React.useEffect(() => {\n if (!clip.data)\n return;\n\n setStartTime(clip.data.startTime);\n setEndTime(clip.data.endTime);\n }, [clip.data]);\n\n function onReady(player: CreateClipPlayer): void {\n playerRef.current = player;\n\n player.on('durationchange', () => setDuration(player.duration()));\n }\n\n function onSubmit(): void {\n let error = '';\n\n if (startTime > endTime)\n error = getPhrase('startTimeGreaterThanEndTime');\n\n if (endTime - startTime < MIN_DURATION)\n error = getPhrase('tooShort', { minDuration: MIN_DURATION });\n\n if (error) {\n handleError(error);\n return;\n }\n\n navLock.unlock(NAV_LOCK_ID);\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLIPS,\n action: props.id ? Actions.Clips.EDIT_CLIP_DETAILS_POPUP : Actions.Clips.CREATE_CLIP_DETAILS,\n args: props.id ? [props.id] : [props.videoId],\n params: { startTime, endTime, isCopying: props.isCopying }\n });\n }\n\n function onCancel(): void {\n const startTime = playerRef.current?.currentTime() ?? 0;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [\n null,\n video.data?.id,\n TextHelper.slugify(video.data?.name)\n ],\n params: { t: startTime }\n });\n }\n\n if (!props.id && !props.videoId)\n return <></>;\n\n return (\n <div className='px-3'>\n {!!config.data && !!viewKey.data && !!video.data && (!props.id || !!clip.data) &&\n <div className='pb-3'>\n <div className='mb-3'>\n <ClickViewCreateClipPlayer\n onReady={onReady}\n playerApi={new URL(config.data.playerApiUrl)}\n viewKey={viewKey.data.viewKey}\n startTime={startTime}\n endTime={endTime}\n onChangeStartTime={setStartTime}\n onChangeEndTime={setEndTime}\n minDuration={MIN_DURATION}\n autoplay\n />\n </div>\n <ClipTimeForm\n startTime={startTime}\n endTime={endTime}\n setStartTime={setStartTime}\n setEndTime={setEndTime}\n onSubmit={onSubmit}\n onCancel={onCancel}\n duration={duration}\n />\n </div>\n }\n </div>\n );\n}\n"],"mappings":"ghCCQM,EAAmB,GACnB,EAAqB,GAErB,EAAO,KAyCb,EAAU,aAAe,CACvB,mBAAoB,GACpB,KAAM,IACR,EAEA,SAAgB,EAAU,EAAoC,CAC5D,GAAM,CAAE,EAAO,GAAA,EAAmB,SAAS,IAAI,EACzC,CAAE,EAAS,GAAA,EAAqB,SAAS,IAAI,EAC7C,CAAE,EAAS,GAAA,EAAqB,SAAS,IAAI,EAC7C,CAAE,EAAO,GAAA,EAAmB,SAAS,EAAK,EAE1C,EAAA,EAAmB,OAAO,IAAI,EAC9B,EAAA,EAAmB,OAAO,IAAI,EAE9B,EAAY,EAAM,UAAY,EAAM,UAAY,EAEtD,SAAS,EAAY,EAAuC,CAC1D,EAAE,OAAO,OAAO,EAChB,EAAS,EAAI,CACf,CAEA,SAAS,EACP,EACA,EACA,EACA,CAEA,IAAM,EADa,EAAM,OAAO,MACE,QAAQ,MAAO,EAAE,CAAC,CAAC,MAAM,EAAG,CAAC,EAC/D,EAAS,CAAc,EAEnB,EAAe,SAAW,GAAK,GAAc,SAC/C,0BAA4B,EAAa,QAAQ,MAAM,CAAC,CAC5D,CAEA,SAAS,GAAkB,CACzB,EAAM,QAAQ,EAAM,MAAQ,CAAC,CAC/B,CAEA,SAAS,GAAkB,CACzB,EAAM,QAAQ,EAAM,MAAQ,CAAC,CAC/B,CAEA,SAAS,EACP,EACA,EACM,CACD,EAAM,qBAGX,EAAW,EAAW,yBAAyB,EAAO,EAAS,CAAO,CAAC,EACvE,EAAS,EAAM,OAAO,MAAM,SAAS,EAAG,GAAG,CAAC,EAC5C,EAAS,EAAK,EAChB,CAEA,SAAS,EAAW,EAAe,CAC7B,EAAQ,GAGR,EAAM,UAAY,EAAQ,EAAM,UAGpC,EAAM,QAAQ,CAAK,CACrB,CAEA,SAAS,GAAgB,CACvB,IAAM,EAAkB,EAAe,kBAAkB,EAAM,MAAQ,IAAM,EAAI,CAAC,CAAC,MAAM,GAAG,EAE5F,EAAS,OAAO,EAAgB,EAAE,CAAC,CAAC,SAAS,EAAG,GAAG,CAAC,EACpD,EAAW,EAAgB,EAAE,EAC7B,EAAW,EAAgB,EAAE,CAC/B,CAEA,SAAS,EAAc,EAAwB,CACzC,EAAE,UAAY,GAChB,EAAU,EAER,EAAE,UAAY,GAChB,EAAU,CACd,CAMA,OAJA,EAAM,cAAgB,CACpB,EAAc,CAChB,EAAG,CAAC,EAAM,KAAK,CAAC,GAGd,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,eAAe,GAAG,EAAQ,EAAO,MAAQ,GAAG,8FAAtE,EACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAY,GAAK,oBAApC,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,KAAK,OACL,UAAU,wBACV,MAAO,EACP,UAAW,EACX,YAAY,KACZ,SAAU,GAAK,EAAa,EAAG,EAAU,CAAU,EACnD,QAAS,EACT,OAAQ,GAAK,EAAW,EAAG,CAAQ,EACnC,UAAW,EACX,SAAU,EAAM,QACjB,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,GAAO,CAAA,CACV,KACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,IAAK,EACL,KAAK,OACL,UAAU,wBACV,MAAO,EACP,UAAW,EACX,YAAY,KACZ,SAAU,GAAK,EAAa,EAAG,EAAY,CAAU,EACrD,QAAS,EACT,OAAQ,GAAK,EAAW,EAAG,CAAU,EACrC,UAAW,EACX,SAAU,EAAM,QACjB,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAM,GAAO,CAAA,CACV,CAAA,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,IAAK,EACL,KAAK,OACL,UAAU,wBACV,MAAO,EACP,UAAW,EACX,YAAY,KACZ,SAAU,GAAK,EAAW,EAAE,OAAO,KAAK,EACxC,QAAS,EACT,OAAQ,GAAK,EAAW,EAAG,CAAU,EACrC,UAAW,EACX,SAAU,EAAM,QACjB,CAAA,EACA,CAAC,EAAM,cACN,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,eAAgB,QAAS,YAC9C,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OAAU,CAAA,CAC9B,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,eAAgB,QAAS,YAC9C,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SAAY,CAAA,CAChC,CAAA,CACF,CAAA,CAAA,CAEJ,GAET,CC1LA,IAAM,EAAY,sBACZ,EAAY,EAAgB,iBAAiB,CAAS,EAe5D,SAAgB,EAAa,EAAuC,CAClE,GAAI,MAAM,EAAM,SAAS,GAAK,MAAM,EAAM,OAAO,EAC/C,OAAO,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,EAMb,IAAM,EAAW,KAAK,MAAM,EAAM,OAAO,EAAI,KAAK,MAAM,EAAM,SAAS,EAEvE,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAU,iEAAhB,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAO,EAAM,UACb,QAAS,EAAM,aACf,SAAU,EAAM,QACjB,CAAA,CACE,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,gBAAO,GAAO,CAAA,GAC9B,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAO,EAAM,QACb,QAAS,EAAM,WACf,SAAU,EAAM,QACjB,CAAA,CACE,CAAA,GACL,EAAA,EAAA,KAAA,CAAC,OAAD,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,UAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,UAAA,EAAW,OAAO,UAAY,CAAA,CAAS,CAAA,EAAC,OAEhE,EAAe,kBAAmB,EAAY,GAAI,CAC/C,CAAA,CAAA,CACF,KACN,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,sCAAf,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAU,eAAe,QAAS,EAAM,kBAC7C,EAAU,QAAQ,CACb,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,UAAU,eAAe,QAAS,EAAM,kBAC7C,EAAU,MAAM,CACX,CAAA,CACL,GACF,GAET,CClEA,IAAM,EAAY,EAAQ,aAAa,WAAW,EAG5C,EAAY,ywBAEL,EAAb,cAAiD,CAAU,CACzD,eAA+B,CAC7B,MAAO,4BAA4B,MAAM,cAAc,GACzD,CAEA,SAAgB,EAAkB,EAAkB,EAA2B,CAC7E,OAAO,MAAM,SAAS,EAAS,CAC7B,GAAG,EACH,UAAW,KAAK,cAAc,EAC9B,UAAW,CACb,EAAG,CAAU,CACf,CAEA,cAAqB,EAAuC,CAC1D,OAAO,KAAK,GAAG,CAAC,CAAC,SAAS,EAAE,MAAc,CAC5C,CACF,ECrBM,EAAY,EAAQ,aAAa,WAAW,EAgBrC,EAAb,cAA2C,CAAU,CAyBnD,YAAY,EAAuB,EAAuC,CACxE,MAAM,EAAQ,CAAO,uBAPY,sBACF,yBACG,kCAEQ,KAK1C,KAAK,YAAc,KAAK,IAAI,EAAO,SAAS,EAAG,KAAK,SAAS,WAAW,EAExE,KAAK,aAAa,EAAQ,UAAW,EAAK,EAC1C,KAAK,WAAW,EAAQ,QAAS,EAAK,EAEtC,KAAK,YAAc,IAAI,EAA4B,KAAK,OAAO,EAAG,CAAO,EACzE,KAAK,YAAY,SAAS,sBAAsB,EAChD,KAAK,SAAS,KAAK,WAAW,EAE9B,KAAK,UAAY,IAAI,EAA4B,KAAK,OAAO,EAAG,CAAO,EACvE,KAAK,UAAU,SAAS,oBAAoB,EAC5C,KAAK,SAAS,KAAK,SAAS,EAE5B,KAAK,GAAG,KAAK,OAAO,EAAG,0BAA2B,CAAE,UAAW,KAAK,aAAa,CAAI,CAAC,EACtF,KAAK,GAAG,KAAK,OAAO,EAAG,wBAAyB,CAAE,UAAW,KAAK,WAAW,CAAI,CAAC,EAElF,KAAK,cAAc,EACnB,KAAK,OAAO,CACd,CAEA,UAA2B,CACzB,OAAO,MAAM,SAAS,MAAO,CAC3B,UAAW,4BACb,EAAG,CAAC,CAAC,CACP,CAEA,QAAuB,CACrB,KAAK,SAAS,kBAAkB,KAAK,SAAS,EAC9C,KAAK,SAAS,gBAAgB,KAAK,OAAO,EAE1C,KAAK,0BAA4B,CAC/B,KAAK,eAAe,EACpB,KAAK,SAAS,CAChB,CAAC,CACH,CAEA,aAAqB,EAAc,EAAwB,GAAY,CACrE,GAAI,MAAM,CAAI,EACZ,OAEF,IAAM,EAAkB,KAAK,aAAa,GAAK,KAAK,WAAW,GAAM,KAAK,QAAU,KAAK,UAEnF,EAAe,KAAK,OAAO,CAAC,CAAC,SAAS,EAAI,KAAK,YAUrD,GARI,EAAO,IACT,EAAO,GAEL,EAAO,IACT,EAAO,GAET,KAAK,UAAY,EAEb,KAAK,SAAY,KAAK,QAAU,KAAK,UAAY,KAAK,YAAc,CACtE,IAAM,EAAa,OAAO,GAAoB,SAC5C,KAAK,UAAY,EACjB,KAAK,UAAY,KAAK,YAExB,KAAK,WAAW,CAAU,CAC5B,CAKA,KAAK,OAAO,CAAC,CAAC,YAAY,KAAK,SAAS,EAEpC,GACF,KAAK,OAAO,CAChB,CAEA,WAAmB,EAAc,EAAwB,GAAY,CACnE,GAAI,MAAM,CAAI,EACZ,OAEF,IAAM,EAAkB,KAAK,aAAa,GAAK,KAAK,WAAW,GAAM,KAAK,QAAU,KAAK,UAEnF,EAAa,KAAK,YAUxB,GARI,EAAO,IACT,EAAO,GAEL,EAAO,KAAK,OAAO,CAAC,CAAC,SAAS,IAChC,EAAO,KAAK,OAAO,CAAC,CAAC,SAAS,GAEhC,KAAK,QAAU,EAEX,KAAK,WAAc,KAAK,QAAU,KAAK,UAAY,KAAK,YAAc,CACxE,IAAM,EAAe,OAAO,GAAoB,SAC9C,KAAK,QAAU,EACf,KAAK,QAAU,KAAK,YAEtB,KAAK,aAAa,CAAY,CAChC,CAEI,GACF,KAAK,OAAO,CAChB,CAEA,eAA8B,CAC5B,KAAK,aAAe,KAAK,aAAa,KAAK,IAAI,EAC/C,KAAK,OAAO,CAAC,CAAC,GAAG,aAAc,KAAK,YAAY,EAEhD,KAAK,GAAG,YAAa,KAAK,SAAS,EACnC,KAAK,GAAG,aAAc,KAAK,SAAS,EAEpC,KAAK,OAAO,CAAC,CAAC,GAAG,cAAiB,CAChC,KAAK,OAAO,CAAC,CAAC,IAAI,aAAc,KAAK,YAAY,EACjD,KAAK,IAAI,YAAa,KAAK,SAAS,EACpC,KAAK,IAAI,aAAc,KAAK,SAAS,CACvC,CAAC,CACH,CAEA,cAAgC,CAC9B,OAAO,OAAO,KAAK,WAAc,QACnC,CAEA,YAA8B,CAC5B,OAAO,OAAO,KAAK,SAAY,QACjC,CAEA,cAA6B,CAI3B,IAAM,EAAc,KAAK,OAAO,CAAC,CAAC,YAAY,EAC1C,EAAc,KAAK,SAAW,EAAe,KAAK,QAAU,IAC9D,KAAK,OAAO,CAAC,CAAC,MAAM,CACxB,CAEA,UAAkB,EAAoC,CAChD,KAAK,YAAY,cAAc,CAAC,IAClC,EAAE,yBAAyB,EAC3B,KAAK,gBAAkB,IAGrB,KAAK,UAAU,cAAc,CAAC,IAChC,EAAE,yBAAyB,EAC3B,KAAK,cAAgB,IAGnB,EAAE,SAAW,KAAK,GAAG,IACvB,EAAE,yBAAyB,EAC3B,KAAK,iBAAmB,GACxB,KAAK,0BAA4B,KAAK,YAAY,CAAC,GAGrD,IAAM,EAAM,KAAK,GAAG,CAAC,CAAC,cAEtB,KAAK,GAAG,EAAK,YAAa,KAAK,IAAI,EACnC,KAAK,GAAG,EAAK,UAAW,KAAK,OAAO,EACpC,KAAK,GAAG,EAAK,YAAa,KAAK,IAAI,EACnC,KAAK,GAAG,EAAK,WAAY,KAAK,OAAO,EAErC,KAAK,KAAK,CAAC,CACb,CAEA,SAAwB,CACtB,KAAK,gBAAkB,GACvB,KAAK,cAAgB,GACrB,KAAK,iBAAmB,GACxB,KAAK,0BAA4B,KAEjC,IAAM,EAAM,KAAK,GAAG,CAAC,CAAC,cAEtB,KAAK,IAAI,EAAK,YAAa,KAAK,IAAI,EACpC,KAAK,IAAI,EAAK,UAAW,KAAK,OAAO,EACrC,KAAK,IAAI,EAAK,YAAa,KAAK,IAAI,EACpC,KAAK,IAAI,EAAK,WAAY,KAAK,OAAO,CACxC,CAEA,KAAa,EAAoC,CAC/C,GAAI,CAAC,KAAK,iBAAmB,CAAC,KAAK,eAAiB,CAAC,KAAK,kBAAoB,CAAC,EAAQ,IAAI,kBAAkB,CAAC,EAC5G,OAEF,IAAM,EAAW,KAAK,YAAY,CAAC,EAE7B,EAAY,EAAW,KAAK,OAAO,CAAC,CAAC,SAAS,EAEhD,KAAK,iBACP,KAAK,sBAAsB,CAAS,EAElC,KAAK,eACP,KAAK,oBAAoB,CAAS,EAEhC,KAAK,kBACP,KAAK,iBAAiB,CAAQ,CAClC,CAEA,sBAA8B,EAAyB,CACrD,KAAK,aAAa,CAAS,CAC7B,CAEA,oBAA4B,EAAyB,CACnD,KAAK,WAAW,CAAS,CAC3B,CAEA,iBAAyB,EAAwB,CAC/C,IAAM,GAAkB,EAAW,KAAK,2BAA6B,KAAK,OAAO,CAAC,CAAC,SAAS,EACtF,EAAe,KAAK,UAAY,EAChC,EAAa,KAAK,QAAU,EAM9B,GAAgB,GAAK,GAAc,KAAK,OAAO,CAAC,CAAC,SAAS,IAG9D,KAAK,0BAA4B,EACjC,KAAK,aAAa,CAAY,EAC9B,KAAK,WAAW,CAAU,EAC5B,CAEA,YAAoB,EAAsC,CACxD,OAAO,EAAQ,IAAI,mBAAmB,KAAK,IAAI,WAA2B,CAAC,CAAC,CAAC,CAC/E,CAEA,gBAA+B,CAC7B,KAAK,IAAI,MAAM,WAAa,GAAG,KAAK,cAAc,KAAK,SAAS,EAAE,EACpE,CAEA,UAAyB,CACvB,KAAK,IAAI,MAAM,MAAQ,GAAG,KAAK,cAAc,KAAK,QAAU,KAAK,SAAS,EAAE,EAC9E,CAEA,cAAsB,EAAsB,CAC1C,MAAO,EAAG,EAAO,KAAK,OAAO,CAAC,CAAC,SAAS,EAAI,IAAA,CAAK,QAAQ,CAAC,CAC5D,CACF,EC/QM,EAAY,EAAQ,aAAa,WAAW,EASrC,EAAb,cAAiD,CAAU,CAMzD,YAAY,EAAuB,EAA6C,CAC9E,MAAM,EAAQ,CAAO,EAErB,KAAK,SAAW,EAAQ,QACxB,KAAK,iBAAmB,EAAQ,gBAEhC,KAAK,cAAc,EACnB,KAAK,QAAQ,IAAI,cAAiB,CAChC,KAAK,gBAAgB,CACvB,CAAC,CACH,CAEA,SAAgB,EAAkB,EAAkB,EAA2B,CAC7E,OAAO,MAAM,SAAS,EAAS,CAC7B,GAAG,EACH,UAAW,mCACb,EAAG,CAAU,CACf,CAEA,eAA8B,CAC5B,KAAK,GAAG,YAAa,KAAK,eAAe,EACzC,KAAK,GAAG,aAAc,KAAK,eAAe,CAC5C,CAEA,iBAAgC,CAC9B,IAAM,EAAO,KAAK,IAAY,cAE9B,KAAK,IAAI,YAAa,KAAK,eAAe,EAC1C,KAAK,IAAI,aAAc,KAAK,eAAe,EAC3C,KAAK,IAAI,EAAK,YAAa,KAAK,eAAe,EAC/C,KAAK,IAAI,EAAK,UAAW,KAAK,aAAa,EAC3C,KAAK,IAAI,EAAK,YAAa,KAAK,eAAe,EAC/C,KAAK,IAAI,EAAK,WAAY,KAAK,aAAa,CAC9C,CAEA,gBAAwB,EAAwC,CAE9D,GAAI,CAAC,EAAQ,IAAI,kBAAkB,CAAK,EACtC,OAEF,EAAM,gBAAgB,EAClB,EAAM,OAAS,aACjB,EAAM,eAAe,EAUnB,EAAM,OAAS,cAAgB,CAAC,EAAQ,QAAQ,WAClD,EAAM,eAAe,EAEvB,KAAK,QAAQ,UAAU,EAAI,EAC3B,KAAK,iBAAmB,CAAC,KAAK,QAAQ,OAAO,EAC7C,KAAK,QAAQ,MAAM,EAEnB,EAAQ,IAAI,mBAAmB,EAE/B,IAAM,EAAO,KAAK,IAAY,cAE9B,KAAK,GAAG,EAAK,YAAa,KAAK,eAAe,EAC9C,KAAK,GAAG,EAAK,UAAW,KAAK,aAAa,EAC1C,KAAK,GAAG,EAAK,YAAa,KAAK,eAAe,EAC9C,KAAK,GAAG,EAAK,WAAY,KAAK,aAAa,EAE3C,KAAK,gBAAgB,CAAK,EAE1B,KAAK,QAAQ,SAAS,oBAAoB,CAC5C,CAEA,gBAAwB,EAAwC,CAE9D,GAAI,CAAC,EAAQ,IAAI,kBAAkB,CAAK,EACtC,OAIF,IAAI,EAFa,EAAQ,IAAI,mBAAoB,KAAK,SAAiB,IAAK,CAAK,CAAC,CAAC,EAE1D,KAAK,QAAQ,SAAS,EAG3C,IAAY,KAAK,QAAQ,SAAS,IACpC,GAAoB,IAEtB,KAAK,QAAQ,YAAY,CAAO,EAChC,KAAM,iBAAyB,OAAO,CACxC,CAEA,cAAsB,EAAwC,CAC5D,EAAQ,IAAI,qBAAqB,EAEjC,IAAM,EAAO,KAAK,IAAY,cAE9B,KAAK,IAAI,EAAK,YAAa,KAAK,eAAe,EAC/C,KAAK,IAAI,EAAK,UAAW,KAAK,aAAa,EAC3C,KAAK,IAAI,EAAK,YAAa,KAAK,eAAe,EAC/C,KAAK,IAAI,EAAK,WAAY,KAAK,aAAa,EAE5C,GAAO,gBAAgB,EACvB,KAAK,QAAQ,UAAU,EAAK,EAC5B,KAAK,QAAQ,QAAQ,CAAE,KAAM,aAAc,OAAQ,KAAM,kBAAmB,EAAK,CAAC,EAC9E,KAAK,kBACP,KAAK,QAAQ,KAAK,EAGpB,KAAM,SAAiB,OAAO,EAC9B,KAAK,QAAQ,YAAY,oBAAoB,CAC/C,CACF,EAEA,EAAQ,kBAAkB,8BAA+B,CAA2B,ECvHpF,IAAM,EAAU,EAAQ,aAAa,SAAS,EAIjC,EAAb,cAAuC,CAAQ,CAC7C,YAAY,EAAuB,EAAc,CAC/C,MAAM,EAAQ,CAAO,EAErB,KAAK,SAAS,yBAAyB,CACzC,CAEA,WAAkB,EAAyC,CACzD,IAAM,EAAoB,IAAI,EAAsB,KAAK,OAAO,EAAG,CAAO,EAE1E,KAAK,SAAS,CAAiB,EAE/B,IAAM,EAAkB,KAAK,SAAS,iBAAiB,EACjD,EAAY,IAAI,EAA4B,KAAK,QAAS,CAC9D,QAAS,KACT,iBACF,CAAC,EACD,EAAgB,SAAS,CAAS,CACpC,CACF,EAEA,EAAkB,UAAU,SAAW,CACrC,SAAU,CAAC,iBAAiB,EAC5B,QAAS,iBACX,EAGI,CAAC,EAAQ,QAAQ,QAAU,CAAC,EAAQ,QAAQ,YAC9C,EAAkB,UAAU,SAAS,SAAS,OAAO,EAAG,EAAG,kBAAkB,EAG/E,EAAQ,kBAAkB,oBAAqB,CAAiB,ECrChE,IAAM,EAAS,EAAQ,UAAU,QAAQ,EAEnC,EAA4B,EAU5B,EAAN,cAA+B,CAAO,CAGpC,YAAY,EAAuB,EAAkC,CACnE,MAAM,EAAQ,CAAO,EAErB,KAAK,QAAU,EAEf,KAAK,sBAAwB,KAAK,sBAAsB,KAAK,IAAI,EAEjE,KAAK,OAAO,IAAI,qBAAwB,KAAK,OAAO,MAAM,KAAK,qBAAqB,CAAC,CACvF,CAEA,uBAAsC,CACpC,IAAM,EAAU,KAAK,OAAO,WAAW,SAAS,iBAAiB,CAAC,EAAE,SAAS,SAAS,EAEtF,GAAI,CAAC,EACH,OAEF,IAAM,EAAa,CAAC,MAAM,KAAK,QAAQ,SAAS,GAAK,KAAK,QAAQ,WAAa,EAC7E,KAAK,QAAQ,UACb,EAEI,EAAW,CAAC,MAAM,KAAK,QAAQ,OAAO,GAAK,KAAK,QAAQ,SAAW,KAAK,OAAO,SAAS,EAC5F,KAAK,QAAQ,QACb,KAAK,OAAO,SAAS,EAEjB,EAAc,KAAK,IAAI,KAAK,QAAQ,aAAe,EAA2B,KAAK,OAAO,SAAS,CAAC,EAE1G,EAAQ,WAAW,CACjB,YACA,UACA,cACA,kBAAmB,KAAK,QAAQ,kBAChC,gBAAiB,KAAK,QAAQ,eAChC,CAAC,CACH,CAEA,SAAuB,CACrB,KAAK,OAAO,IAAI,iBAAkB,KAAK,qBAAqB,EAC5D,MAAM,QAAQ,CAChB,CACF,EAEA,EAAQ,eAAe,mBAAoB,CAAgB,EC/C3D,IAAa,EAAb,cAAsC,CAAW,CAG/C,YAAY,EAAsB,EAAkC,CAClE,MAAM,EAAI,CACR,gBAAiB,GACjB,GAAG,EACH,cAAe,KACf,iBAAkB,EACpB,CAAC,CACH,CAEA,oBAAuC,CACrC,MAAO,uBACT,CAEA,kBAAmC,CACjC,GAAM,CAAE,YAAW,UAAS,cAAa,oBAAmB,mBAAoB,KAAK,QACrF,KAAK,OAAO,iBAAiB,CAAE,YAAW,UAAS,cAAa,oBAAmB,iBAAgB,CAAC,CACtG,CAEA,kBAAmD,CACjD,IAAM,EAAU,MAAM,iBAAiB,EAEvC,MADA,GAAQ,kBAAoB,EACrB,CACT,CAEA,gBAAmC,CACjC,MAAO,mBACT,CAEA,wBAAwD,CACtD,MAAO,oBACT,CACF,ECzCA,SAAgB,EAA0B,EAA2D,CACnG,GAAM,CAAE,UAAS,aAAc,EAEzB,EAAA,EAAY,OAAO,IAAI,EACvB,EAAA,EAAkB,OAAyB,IAAI,EAiCrD,OA/BA,EAAM,cAAgB,CACpB,KAAU,SAAS,QAAQ,EAEtB,EAeL,MAZA,GAAU,QAAU,IAAI,EAAiB,EAAI,QAAS,CAAK,EAEvD,GACF,EAAU,QAAQ,UAAY,CAC5B,EAAQ,EAAS,EAAU,OAAO,CAAC,CACrC,CAAC,EAGC,GACF,EAAU,QAAQ,IAAI,UAAW,CAAS,MAG/B,CACX,EAAU,SAAS,QAAQ,CAC7B,CACF,EAAG,CAAC,EAAM,OAAO,CAAC,EAElB,EAAM,cAAgB,CACpB,EAAU,SAAS,QAAQ,CAAE,KAAM,yBAA0B,KAAM,EAAM,SAAU,CAAC,CACtF,EAAG,CAAC,EAAM,SAAS,CAAC,EAEpB,EAAM,cAAgB,CACpB,EAAU,SAAS,QAAQ,CAAE,KAAM,uBAAwB,KAAM,EAAM,OAAQ,CAAC,CAClF,EAAG,CAAC,EAAM,OAAO,CAAC,GAGhB,EAAA,EAAA,IAAA,CAAC,MAAD,CAAU,KAAU,CAAA,CAExB,CC1BA,IAAM,EAAc,uBACd,EAAY,4BACZ,EAAY,EAAgB,iBAAiB,CAAS,EAEtD,EAAmB,GACnB,EAAe,EAErB,SAAS,EAAY,EAAqB,CACxC,EAAa,QAET,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAI,CAAS,CAAA,EACZ,CACD,MAAO,EAAU,cAAc,EAC/B,kBAAmB,CACjB,QAAS,OACT,KAAM,EAAU,OAAO,CACzB,CACF,CACF,CACF,CAEA,SAAS,EAAmB,EAAuB,CACjD,GAAI,CAAC,EAAO,MAAO,GAEnB,IAAM,EAAS,OAAO,CAAK,EAC3B,OAAO,MAAM,CAAM,EAAI,EAAI,CAC7B,CASA,SAAgB,GAAuB,EAAiD,CACtF,IAAM,EAAA,EAAkB,OAAyB,IAAI,EAE/C,EAAmB,EAAmB,EAAM,SAAS,EAErD,CAAE,EAAW,GAAA,EAAuB,SAAiB,CAAgB,EACrE,CAAE,EAAS,GAAA,EAAqB,SAAiB,EAAmB,CAAgB,EAEpF,EAAS,EAA6B,EAAe,OAAO,CAAC,EAC7D,EAAO,EAA2B,CAAC,CAAC,EAAM,IAAM,EAAa,KAAK,EAAM,EAAE,CAAC,EAC3E,EAAU,EAAK,MAAM,cAAc,IAAM,EAAM,QAC/C,EAAU,EAAoC,CAAC,CAAC,GACpD,EAAe,cAAc,EAAS,EAAY,YAAY,CAAC,EAC3D,EAAQ,EAA4B,CAAC,CAAC,GAAW,EAAc,MAAM,CAAO,CAAC,EAE7E,CAAE,EAAU,GAAA,EAAsB,SAAiB,CAAC,EAEpD,EAAU,EAAW,EAE3B,EAAmB,CAAE,MAAO,EAAM,GAAK,EAAK,MAAM,KAAO,EAAU,WAAW,CAAE,CAAC,EAEjF,EAAM,cAAgB,CACpB,EAAQ,KAAK,CACX,GAAI,EACJ,MAAO,EAAgB,UAAU,EAAW,cAAc,EAC1D,KAAM,EAAgB,UAAU,EAAW,aAAa,CAC1D,CAAC,CACH,EAAG,CAAC,CAAC,EAEL,EAAM,cAAgB,CACf,EAAK,OAGV,EAAa,EAAK,KAAK,SAAS,EAChC,EAAW,EAAK,KAAK,OAAO,EAC9B,EAAG,CAAC,EAAK,IAAI,CAAC,EAEd,SAAS,EAAQ,EAAgC,CAC/C,EAAU,QAAU,EAEpB,EAAO,GAAG,qBAAwB,EAAY,EAAO,SAAS,CAAC,CAAC,CAClE,CAEA,SAAS,GAAiB,CACxB,IAAI,EAAQ,GAQZ,GANI,EAAY,IACd,EAAQ,EAAU,6BAA6B,GAE7C,EAAU,EAAY,IACxB,EAAQ,EAAU,WAAY,CAAE,YAAa,CAAa,CAAC,GAEzD,EAAO,CACT,EAAY,CAAK,EACjB,MACF,CAEA,EAAQ,OAAO,CAAW,EAE1B,EAAmB,QAAQ,CACzB,YAAa,EAAY,MACzB,OAAQ,EAAM,GAAK,EAAQ,MAAM,wBAA0B,EAAQ,MAAM,oBACzE,KAAM,EAAM,GAAK,CAAC,EAAM,EAAE,EAAI,CAAC,EAAM,OAAO,EAC5C,OAAQ,CAAE,YAAW,UAAS,UAAW,EAAM,SAAU,CAC3D,CAAC,CACH,CAEA,SAAS,GAAiB,CACxB,IAAM,EAAY,EAAU,SAAS,YAAY,GAAK,EAEtD,EAAmB,QAAQ,CACzB,YAAa,EAAY,OACzB,OAAQ,EAAQ,OAAO,WACvB,KAAM,CACJ,KACA,EAAM,MAAM,GACZ,EAAW,QAAQ,EAAM,MAAM,IAAI,CACrC,EACA,OAAQ,CAAE,EAAG,CAAU,CACzB,CAAC,CACH,CAKA,MAHI,CAAC,EAAM,IAAM,CAAC,EAAM,SACf,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,GAGX,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,gBACZ,CAAC,CAAC,EAAO,MAAQ,CAAC,CAAC,EAAQ,MAAQ,CAAC,CAAC,EAAM,OAAS,CAAC,EAAM,IAAM,CAAC,CAAC,EAAK,QACvE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,iBACb,EAAA,EAAA,IAAA,CAAC,EAAD,CACW,UACT,UAAW,IAAI,IAAI,EAAO,KAAK,YAAY,EAC3C,QAAS,EAAQ,KAAK,QACX,YACF,UACT,kBAAmB,EACnB,gBAAiB,EACjB,YAAa,EACb,SAAA,EACD,CAAA,CACE,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,EAAD,CACa,YACF,UACK,eACF,aACF,WACA,WACA,UACX,CAAA,CACE,GAEJ,CAAA,CAET"}
|
|
1
|
+
{"version":3,"file":"C6z8ii6C.chunk.js","names":[],"sources":["../../../../libs/shared/src/components/time-input/time-input.module.scss","../../../../libs/shared/src/components/time-input/TimeInput.tsx","../../../../libs/shared/src/apps/clips/components/clip-time-form/ClipTimeForm.tsx","../../../player/src/plugins/create-clip-plugin/components/clip-timepoint-selector/clip-timepoint-selector-handle.ts","../../../player/src/plugins/create-clip-plugin/components/clip-timepoint-selector/clip-timepoint-selector.ts","../../../player/src/plugins/create-clip-plugin/components/create-clip-progress-indicator/create-clip-progress-indicator.ts","../../../player/src/plugins/create-clip-plugin/components/create-clip-seek-bar/create-clip-seek-bar.ts","../../../player/src/plugins/create-clip-plugin/create-clip-plugin.ts","../../../player/src/players/create-clip-player.ts","../../../player/src/react/CreateClipPlayer.tsx","../../src/shared/views/edit-clip-timepoints/EditClipTimepointsView.tsx"],"sourcesContent":[":local {\n .arrowContainer {\n padding: 0.16666rem;\n cursor: pointer;\n\n &:hover {\n background-color: $gray-400;\n }\n }\n\n %arrow {\n width: 0.66666rem; \n height: 0.33333rem; \n border-left: 0.33333rem solid transparent;\n border-right: 0.33333rem solid transparent;\n }\n\n .upArrow {\n @extend %arrow;\n border-bottom: 0.33333rem solid $gray-900;\n }\n\n .downArrow {\n @extend %arrow;\n border-top: 0.33333rem solid $gray-900;\n }\n\n .inputContainer {\n border: 1px solid $gray-300;\n transition: box-shadow 0.1s ease-in-out;\n\n &.focus {\n border: 1px solid $blue;\n outline: 0 !important;\n box-shadow: $input-focus-box-shadow;\n }\n\n input {\n width: 1.5rem;\n }\n }\n}","import * as React from 'react';\n\nimport { TimeHelper } from 'libs/common/react/utils/TimeHelper';\n\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\n\nimport styles from './time-input.module.scss';\n\nconst UP_ARROW_KEYCODE = 38;\nconst DOWN_ARROW_KEYCODE = 40;\n\nconst HOUR = 3600; // hour in seconds;\n\ninterface TimeInputProps {\n /**\n * A time in seconds\n */\n value: number;\n\n /**\n * Callback to set time where time is in seconds.\n *\n * Will be called on blur.\n */\n setTime: (time: number) => void;\n\n /**\n * Allows a time to be typed in by the user.\n *\n * Note: this doesn't include UP/DOWN keyboard arrows which are always enabled.\n */\n allowKeyboardInput?: boolean;\n\n formSize?: 'md' | 'lg';\n\n hasError?: boolean;\n\n /**\n * Time in seconds to logically cap the maximum input value\n */\n maxValue?: number;\n\n disabled?: boolean;\n\n /**\n * If set to true, will hide the up and down arrow buttons\n */\n hideButtons?: boolean;\n\n duration?: number;\n}\n\nTimeInput.defaultProps = {\n allowKeyboardInput: true,\n size: 'lg'\n};\n\nexport function TimeInput(props: TimeInputProps): JSX.Element {\n const [ hours, setHours ] = React.useState('00');\n const [ minutes, setMinutes ] = React.useState('00');\n const [ seconds, setSeconds ] = React.useState('00');\n const [ focus, setFocus ] = React.useState(false);\n\n const minutesRef = React.useRef(null);\n const secondsRef = React.useRef(null);\n\n const showHours = props.duration && props.duration >= HOUR;\n\n function handleFocus(e: React.FocusEvent<HTMLInputElement>) {\n e.target.select();\n setFocus(true);\n }\n\n function handleChange(\n event: React.ChangeEvent<HTMLInputElement>,\n setValue: (value: string) => void,\n nextInputRef?: React.MutableRefObject<HTMLInputElement>\n ) {\n const inputValue = event.target.value;\n const formattedValue = inputValue.replace(/\\D/g, '').slice(0, 2);\n setValue(formattedValue);\n \n if (formattedValue.length === 2 && nextInputRef?.current)\n requestAnimationFrame(() => nextInputRef.current.focus());\n }\n\n function increment(): void {\n props.setTime(props.value + 1);\n }\n\n function decrement(): void {\n props.setTime(props.value - 1);\n }\n\n function handleBlur(\n event: React.ChangeEvent<HTMLInputElement>,\n setValue: (value: string) => void\n ): void {\n if (!props.allowKeyboardInput)\n return;\n\n updateTime(TimeHelper.convertDurationToSeconds(hours, minutes, seconds));\n setValue(event.target.value.padStart(2, '0'));\n setFocus(false);\n }\n\n function updateTime(value: number) {\n if (value < 0)\n return;\n \n if (props.maxValue && value > props.maxValue)\n return;\n \n props.setTime(value);\n }\n\n function setTimeInputs() {\n const displayDuration = DurationHelper.ToDisplayDuration(props.value * 1000, true).split(':');\n\n setHours(String(displayDuration[0]).padStart(2, '0'));\n setMinutes(displayDuration[1]);\n setSeconds(displayDuration[2]);\n }\n\n function handleKeyDown(e: React.KeyboardEvent) {\n if (e.keyCode === UP_ARROW_KEYCODE)\n increment();\n\n if (e.keyCode === DOWN_ARROW_KEYCODE)\n decrement();\n }\n\n React.useEffect(() => {\n setTimeInputs();\n }, [props.value]);\n\n return (\n <div className={`${styles.inputContainer} ${focus ? styles.focus : ''} position-relative bg-white d-flex align-items-center p-2 rounded-pill font-size-md`}>\n <div className={`${showHours ? '' : 'd-none'}`}>\n <input\n type='text'\n className='border-0 outline-none'\n value={hours}\n maxLength={2}\n placeholder='HH'\n onChange={e => handleChange(e, setHours, minutesRef)}\n onFocus={handleFocus}\n onBlur={e => handleBlur(e, setHours)}\n onKeyDown={handleKeyDown}\n disabled={props.disabled}\n />\n <span>:</span>\n </div>\n <div>\n <input\n ref={minutesRef}\n type='text'\n className='border-0 outline-none'\n value={minutes}\n maxLength={2}\n placeholder='MM'\n onChange={e => handleChange(e, setMinutes, secondsRef)}\n onFocus={handleFocus}\n onBlur={e => handleBlur(e, setMinutes)}\n onKeyDown={handleKeyDown}\n disabled={props.disabled}\n />\n <span>:</span>\n </div>\n <input\n ref={secondsRef}\n type='text'\n className='border-0 outline-none'\n value={seconds}\n maxLength={2}\n placeholder='SS'\n onChange={e => setSeconds(e.target.value)}\n onFocus={handleFocus}\n onBlur={e => handleBlur(e, setSeconds)}\n onKeyDown={handleKeyDown}\n disabled={props.disabled}\n />\n {!props.hideButtons &&\n <div>\n <div className={styles.arrowContainer} onClick={increment}>\n <div className={styles.upArrow} />\n </div>\n <div className={styles.arrowContainer} onClick={decrement}>\n <div className={styles.downArrow} />\n </div>\n </div>\n }\n </div>\n );\n}\n\n","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { TimeInput } from 'libs/shared/components/time-input/TimeInput';\nimport { DurationHelper } from 'libs/shared/utils/DurationHelper';\n\nconst namespace = 'shared.clipTimeForm';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n/**\n * All times are in seconds.\n */\ninterface ClipTimeFormProps {\n startTime: number;\n endTime: number;\n setStartTime: (time: number) => void;\n setEndTime: (time: number) => void;\n onSubmit: () => void;\n onCancel: () => void;\n duration: number;\n}\n\nexport function ClipTimeForm(props: ClipTimeFormProps): JSX.Element {\n if (isNaN(props.startTime) || isNaN(props.endTime))\n return <></>;\n\n /**\n * DurationHelper.ToDisplayDuration in TimeInput will truncate as decimals\n * so we floor the times when displaying the duration.\n */\n const duration = Math.floor(props.endTime) - Math.floor(props.startTime);\n\n return (\n <div className='px-3'>\n <form className='d-flex align-items-center justify-content-center pb-4'>\n <div>\n <TimeInput\n value={props.startTime}\n setTime={props.setStartTime}\n duration={props.duration}\n />\n </div>\n <span className='px-2'>-</span>\n <div className='me-2'>\n <TimeInput\n value={props.endTime}\n setTime={props.setEndTime}\n duration={props.duration}\n />\n </div>\n <span>\n <strong><Text namespace={namespace} phrase='duration' /></strong>\n \n {DurationHelper.ToDisplayDuration((duration) * 1000)}\n </span>\n </form>\n <div className='d-flex justify-content-end'>\n <button className='btn btn-link' onClick={props.onCancel}>\n {getPhrase('cancel')}\n </button>\n <button className='btn btn-dark' onClick={props.onSubmit}>\n {getPhrase('next')}\n </button>\n </div>\n </div>\n );\n}\n","import videojs from 'video.js';\n\nconst Component = videojs.getComponent('Component');\n\n// tslint:disable-next-line\nconst handleSvg = '<svg viewBox=\"0 0 5 14\" pointer-events=\"none\"><g id=\"Clips\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"><g id=\"Clip-2\" transform=\"translate(-835.000000, -632.000000)\" fill=\"#FFFFFF\"><g id=\"Video-Copy\" transform=\"translate(275.000000, 96.000000)\"><g id=\"Handles\" transform=\"translate(560.000000, 536.000000)\"><circle id=\"Oval\" cx=\"1\" cy=\"1\" r=\"1\"></circle><circle id=\"Oval-Copy-2\" cx=\"1\" cy=\"5\" r=\"1\"></circle><circle id=\"Oval-Copy-4\" cx=\"1\" cy=\"9\" r=\"1\"></circle><circle id=\"Oval-Copy-8\" cx=\"1\" cy=\"13\" r=\"1\"></circle><circle id=\"Oval-Copy\" cx=\"4\" cy=\"1\" r=\"1\"></circle><circle id=\"Oval-Copy-3\" cx=\"4\" cy=\"5\" r=\"1\"></circle><circle id=\"Oval-Copy-5\" cx=\"4\" cy=\"9\" r=\"1\"></circle><circle id=\"Oval-Copy-9\" cx=\"4\" cy=\"13\" r=\"1\"></circle></g></g></g></g></svg>';\n\nexport class ClipTimepointSelectorHandle extends Component {\n public buildCSSClass(): string {\n return `cv-clip-timepoint-handle ${super.buildCSSClass()}`;\n }\n\n public createEl(tagName?: string, properties?: any, attributes?: any): Element {\n return super.createEl(tagName, {\n ...properties,\n className: this.buildCSSClass(),\n innerHTML: handleSvg\n }, attributes);\n }\n\n public isEventTarget(e: videojs.EventTarget.Event): boolean {\n return this.el().contains(e.target as Node);\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nconst Component = videojs.getComponent('Component');\n\nimport {\n ClipTimepointSelectorHandle\n} from 'projects/player/plugins/create-clip-plugin/components/clip-timepoint-selector/clip-timepoint-selector-handle';\n\nimport './clip-timepoint-selector.scss';\n\nexport interface ClipTimepointSelectorOptions extends videojs.ComponentOptions {\n startTime: number;\n endTime: number;\n minDuration: number;\n onChangeStartTime: (startTime: number) => void;\n onChangeEndTime: (endTime: number) => void;\n}\n\nexport class ClipTimepointSelector extends Component {\n // tslint:disable-next-line\n public options_: ClipTimepointSelectorOptions;\n\n // tslint:disable-next-line\n public el_: HTMLElement;\n\n private minDuration: number;\n\n /**\n * These variables shouldn't be set directly.\n * setStartTime and setEndTime should be used.\n */\n private startTime: number;\n private endTime: number;\n\n private startHandle: ClipTimepointSelectorHandle;\n private endHandle: ClipTimepointSelectorHandle;\n\n private dragStartActive: boolean = false;\n private dragEndActive: boolean = false;\n private dragSliderActive: boolean = false;\n\n private dragSliderCurrentPosition: number = null;\n\n constructor(player: VideoJsPlayer, options: ClipTimepointSelectorOptions) {\n super(player, options);\n\n this.minDuration = Math.min(player.duration(), this.options_.minDuration);\n\n this.setStartTime(options.startTime, false);\n this.setEndTime(options.endTime, false);\n\n this.startHandle = new ClipTimepointSelectorHandle(this.player(), options);\n this.startHandle.addClass('cv-clip-start-handle');\n this.addChild(this.startHandle);\n\n this.endHandle = new ClipTimepointSelectorHandle(this.player(), options);\n this.endHandle.addClass('cv-clip-end-handle');\n this.addChild(this.endHandle);\n\n this.on(this.player(), 'update:clip:start:time', ({ time }) => this.setStartTime(time));\n this.on(this.player(), 'update:clip:end:time', ({ time }) => this.setEndTime(time));\n\n this.bindListeners();\n this.update();\n }\n\n public createEl(): Element {\n return super.createEl('div', {\n className: 'cv-clip-timepoint-selector'\n }, {});\n }\n\n private update(): void {\n this.options_.onChangeStartTime(this.startTime);\n this.options_.onChangeEndTime(this.endTime);\n\n this.requestAnimationFrame(() => {\n this.setStartOffset();\n this.setWidth();\n });\n }\n\n private setStartTime(time: number, shouldUpdate: boolean = true): void {\n if (isNaN(time))\n return;\n\n const currentDuration = this.hasStartTime() && this.hasEndTime() && (this.endTime - this.startTime);\n\n const maxStartTime = this.player().duration() - this.minDuration;\n\n if (time > maxStartTime)\n time = maxStartTime;\n\n if (time < 0)\n time = 0;\n\n this.startTime = time;\n\n if (this.endTime && (this.endTime - this.startTime < this.minDuration)) {\n const newEndTime = typeof currentDuration === 'number' ?\n this.startTime + currentDuration :\n this.startTime + this.minDuration;\n\n this.setEndTime(newEndTime);\n }\n\n /**\n * Seek player to the clip start time.\n */\n this.player().currentTime(this.startTime);\n\n if (shouldUpdate)\n this.update();\n }\n\n private setEndTime(time: number, shouldUpdate: boolean = true): void {\n if (isNaN(time))\n return;\n\n const currentDuration = this.hasStartTime() && this.hasEndTime() && (this.endTime - this.startTime);\n\n const minEndTime = this.minDuration;\n\n if (time < minEndTime)\n time = minEndTime;\n\n if (time > this.player().duration())\n time = this.player().duration();\n\n this.endTime = time;\n\n if (this.startTime && (this.endTime - this.startTime < this.minDuration)) {\n const newStartTime = typeof currentDuration === 'number' ?\n this.endTime - currentDuration :\n this.endTime - this.minDuration;\n\n this.setStartTime(newStartTime);\n }\n\n if (shouldUpdate)\n this.update();\n }\n\n private bindListeners(): void {\n this.onTimeupdate = this.onTimeupdate.bind(this);\n this.player().on('timeupdate', this.onTimeupdate);\n\n this.on('mousedown', this.dragStart);\n this.on('touchstart', this.dragStart);\n\n this.player().on('dispose', () => {\n this.player().off('timeupdate', this.onTimeupdate);\n this.off('mousedown', this.dragStart);\n this.off('touchstart', this.dragStart);\n });\n }\n\n private hasStartTime(): boolean {\n return typeof this.startTime === 'number';\n }\n\n private hasEndTime(): boolean {\n return typeof this.endTime === 'number';\n }\n\n private onTimeupdate(): void {\n /**\n * Pause the player if it plays past the end point\n */\n const currentTime = this.player().currentTime();\n if (currentTime > this.endTime && currentTime < (this.endTime + 0.5))\n this.player().pause();\n }\n\n private dragStart(e: videojs.EventTarget.Event): void {\n if (this.startHandle.isEventTarget(e)) {\n e.stopImmediatePropagation();\n this.dragStartActive = true;\n }\n\n if (this.endHandle.isEventTarget(e)) {\n e.stopImmediatePropagation();\n this.dragEndActive = true;\n }\n\n if (e.target === this.el()) {\n e.stopImmediatePropagation();\n this.dragSliderActive = true;\n this.dragSliderCurrentPosition = this.getPosition(e);\n }\n\n const doc = this.el().ownerDocument as unknown as Element;\n\n this.on(doc, 'mousemove', this.drag);\n this.on(doc, 'mouseup', this.dragEnd);\n this.on(doc, 'touchmove', this.drag);\n this.on(doc, 'touchend', this.dragEnd);\n\n this.drag(e);\n }\n\n private dragEnd(): void {\n this.dragStartActive = false;\n this.dragEndActive = false;\n this.dragSliderActive = false;\n this.dragSliderCurrentPosition = null;\n\n const doc = this.el().ownerDocument as unknown as Element;\n\n this.off(doc, 'mousemove', this.drag);\n this.off(doc, 'mouseup', this.dragEnd);\n this.off(doc, 'touchmove', this.drag);\n this.off(doc, 'touchend', this.dragEnd);\n }\n\n private drag(e: videojs.EventTarget.Event): void {\n if (!this.dragStartActive && !this.dragEndActive && !this.dragSliderActive || !videojs.dom.isSingleLeftClick(e))\n return;\n \n const position = this.getPosition(e);\n\n const timepoint = position * this.player().duration();\n\n if (this.dragStartActive)\n this.handleStartHandleDrag(timepoint);\n\n if (this.dragEndActive)\n this.handleEndHandleDrag(timepoint);\n\n if (this.dragSliderActive)\n this.handleSliderDrag(position);\n }\n\n private handleStartHandleDrag(timepoint: number): void {\n this.setStartTime(timepoint);\n }\n\n private handleEndHandleDrag(timepoint: number): void {\n this.setEndTime(timepoint);\n }\n\n private handleSliderDrag(position: number): void {\n const timeDifference = (position - this.dragSliderCurrentPosition) * this.player().duration();\n const newStartTime = this.startTime + timeDifference;\n const newEndTime = this.endTime + timeDifference;\n\n /**\n * Don't move if the clip is already at the beginning and/or end\n * of the video.\n */\n if (newStartTime <= 0 || newEndTime >= this.player().duration())\n return;\n\n this.dragSliderCurrentPosition = position;\n this.setStartTime(newStartTime);\n this.setEndTime(newEndTime);\n }\n\n private getPosition(e: videojs.EventTarget.Event): number {\n return videojs.dom.getPointerPosition(this.el_.parentNode as HTMLElement, e).x;\n }\n\n private setStartOffset(): void {\n this.el_.style.marginLeft = `${this.getPercentage(this.startTime)}%`;\n }\n\n private setWidth(): void {\n this.el_.style.width = `${this.getPercentage(this.endTime - this.startTime)}%`;\n }\n\n private getPercentage(time: number): number {\n return +((time / this.player().duration() * 100).toFixed(4));\n }\n}\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nconst Component = videojs.getComponent('Component');\n\nimport './create-clip-progress-indicator.scss';\n\ninterface CreateClipProgressIndicatorOptions extends videojs.ComponentOptions {\n seekBar: videojs.Component;\n playProgressBar: videojs.Component;\n}\n\nexport class CreateClipProgressIndicator extends Component {\n private el_: HTMLDivElement;\n private seekBar_: videojs.Component;\n private playProgressBar_: videojs.Component;\n private videoWasPlaying_: boolean;\n\n constructor(player: VideoJsPlayer, options: CreateClipProgressIndicatorOptions) {\n super(player, options);\n\n this.seekBar_ = options.seekBar;\n this.playProgressBar_ = options.playProgressBar;\n\n this.bindListeners();\n this.player_.one('dispose', () => {\n this.unbindListeners();\n });\n }\n\n public createEl(tagName?: string, properties?: any, attribtues?: any): Element {\n return super.createEl(tagName, {\n ...properties,\n className: 'cv-create-clip-progress-indicator'\n }, attribtues);\n }\n\n private bindListeners(): void {\n this.on('mousedown', this.handleMouseDown);\n this.on('touchstart', this.handleMouseDown);\n }\n\n private unbindListeners(): void {\n const doc = (this.el_ as any).ownerDocument;\n\n this.off('mousedown', this.handleMouseDown);\n this.off('touchstart', this.handleMouseDown);\n this.off(doc, 'mousemove', this.handleMouseMove);\n this.off(doc, 'mouseup', this.handleMouseUp);\n this.off(doc, 'touchmove', this.handleMouseMove);\n this.off(doc, 'touchend', this.handleMouseUp);\n }\n\n private handleMouseDown(event: videojs.EventTarget.Event): void {\n // Prevent handling right and middle mouse clicks\n if (!videojs.dom.isSingleLeftClick(event))\n return;\n\n event.stopPropagation();\n if (event.type === 'mousedown')\n event.preventDefault();\n\n /**\n * Comment below copied over from videojs - Sha\n * \n * Do not call preventDefault() on touchstart in Chrome\n * to avoid console warnings. Use a 'touch-action: none' style\n * instead to prevent unintented scrolling.\n * https://developers.google.com/web/updates/2017/01/scrolling-intervention\n */\n if (event.type === 'touchstart' && !videojs.browser.IS_CHROME)\n event.preventDefault();\n\n this.player_.scrubbing(true);\n this.videoWasPlaying_ = !this.player_.paused();\n this.player_.pause();\n\n videojs.dom.blockTextSelection();\n\n const doc = (this.el_ as any).ownerDocument;\n\n this.on(doc, 'mousemove', this.handleMouseMove);\n this.on(doc, 'mouseup', this.handleMouseUp);\n this.on(doc, 'touchmove', this.handleMouseMove);\n this.on(doc, 'touchend', this.handleMouseUp);\n\n this.handleMouseMove(event);\n\n this.player_.addClass('cv-hide-mouse-time');\n }\n\n private handleMouseMove(event: videojs.EventTarget.Event): void {\n // Prevent handling right and middle mouse clicks\n if (!videojs.dom.isSingleLeftClick(event))\n return;\n\n const distance = videojs.dom.getPointerPosition((this.seekBar_ as any).el_, event).x;\n\n let newTime = distance * this.player_.duration();\n\n // Don't let video end while scrubbing.\n if (newTime === this.player_.duration())\n newTime = newTime - 0.1;\n\n this.player_.currentTime(newTime);\n (this.playProgressBar_ as any).update();\n }\n\n private handleMouseUp(event: videojs.EventTarget.Event): void {\n videojs.dom.unblockTextSelection();\n\n const doc = (this.el_ as any).ownerDocument;\n\n this.off(doc, 'mousemove', this.handleMouseMove);\n this.off(doc, 'mouseup', this.handleMouseUp);\n this.off(doc, 'touchmove', this.handleMouseMove);\n this.off(doc, 'touchend', this.handleMouseUp);\n\n event?.stopPropagation();\n this.player_.scrubbing(false);\n this.player_.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });\n if (this.videoWasPlaying_) {\n this.player_.play();\n }\n\n (this.seekBar_ as any).update();\n this.player_.removeClass('cv-hide-mouse-time');\n }\n}\n\nvideojs.registerComponent('CreateClipProgressIndicator', CreateClipProgressIndicator);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport {\n ClipTimepointSelector,\n ClipTimepointSelectorOptions\n} from 'projects/player/plugins/create-clip-plugin/components/clip-timepoint-selector/clip-timepoint-selector';\nimport { CreateClipProgressIndicator } from 'projects/player/plugins/create-clip-plugin/components/create-clip-progress-indicator/create-clip-progress-indicator';\n\nimport './create-clip-seek-bar.scss';\n\nconst SeekBar = videojs.getComponent('SeekBar') as unknown as typeof videojs.SeekBar;\n\ninterface CreateClipSeekBarOptions extends ClipTimepointSelectorOptions {}\n\nexport class CreateClipSeekBar extends SeekBar {\n constructor(player: VideoJsPlayer, options: any) {\n super(player, options);\n\n this.addClass('cv-create-clip-seek-bar');\n }\n\n public initialize(options: CreateClipSeekBarOptions): void {\n const timepointSelector = new ClipTimepointSelector(this.player(), options);\n\n this.addChild(timepointSelector);\n\n const playProgressBar = this.getChild('playProgressBar');\n const indicator = new CreateClipProgressIndicator(this.player_, {\n seekBar: this,\n playProgressBar\n });\n playProgressBar.addChild(indicator);\n }\n}\n\nCreateClipSeekBar.prototype.options_ = {\n children: ['playProgressBar'],\n barName: 'playProgressBar'\n};\n\n// MouseTimeDisplay tooltips should not be added to a player on mobile devices\nif (!videojs.browser.IS_IOS && !videojs.browser.IS_ANDROID) {\n CreateClipSeekBar.prototype.options_.children.splice(1, 0, 'mouseTimeDisplay');\n}\n\nvideojs.registerComponent('CreateClipSeekBar', CreateClipSeekBar);\n","import videojs, { VideoJsPlayer } from 'video.js';\n\nimport {\n CreateClipSeekBar\n} from 'projects/player/plugins/create-clip-plugin/components/create-clip-seek-bar/create-clip-seek-bar';\n\nimport 'projects/player/plugins/create-clip-plugin/components/create-clip-seek-bar/create-clip-seek-bar';\n\nconst Plugin = videojs.getPlugin('plugin');\n\nconst DEFAULT_MIN_CLIP_DURATION = 5; // seconds;\n\ninterface CreateClipPluginOptions {\n onChangeStartTime: (startTime: number) => void;\n onChangeEndTime: (endTime: number) => void;\n startTime?: number;\n endTime?: number;\n minDuration?: number;\n}\n\nclass CreateClipPlugin extends Plugin {\n private options: CreateClipPluginOptions;\n\n constructor(player: VideoJsPlayer, options: CreateClipPluginOptions) {\n super(player, options);\n\n this.options = options;\n\n this.initCreateClipSeekBar = this.initCreateClipSeekBar.bind(this);\n\n this.player.one('loadedmetadata', () => this.player.ready(this.initCreateClipSeekBar));\n }\n\n private initCreateClipSeekBar(): void {\n const seekBar = this.player.controlBar.getChild('ProgressControl')?.getChild('SeekBar') as CreateClipSeekBar;\n\n if (!seekBar)\n return;\n\n const startTime = (!isNaN(this.options.startTime) && this.options.startTime >= 0) ?\n this.options.startTime :\n 0;\n\n const endTime = (!isNaN(this.options.endTime) && this.options.endTime <= this.player.duration()) ?\n this.options.endTime :\n this.player.duration();\n\n const minDuration = Math.min(this.options.minDuration || DEFAULT_MIN_CLIP_DURATION, this.player.duration());\n\n seekBar.initialize({\n startTime,\n endTime,\n minDuration,\n onChangeStartTime: this.options.onChangeStartTime,\n onChangeEndTime: this.options.onChangeEndTime\n });\n }\n\n public dispose(): void {\n this.player.off('loadedmetadata', this.initCreateClipSeekBar);\n super.dispose();\n }\n}\n\nvideojs.registerPlugin('createClipPlugin', CreateClipPlugin);\n\ndeclare module 'video.js' {\n export interface VideoJsPlayer {\n createClipPlugin(options: CreateClipPluginOptions): void;\n }\n}\n","/* eslint simple-import-sort/imports: 0 */\n\nimport { VideoJsPlayerOptions } from 'video.js';\nimport { BasePlayer, BasePlayerOptions } from './base-player';\n\nimport { AnalyticsPlayerType } from 'projects/player/services/analytics-service';\n\nimport 'projects/player/plugins/create-clip-plugin/create-clip-plugin';\n\nexport interface CreateClipPlayerOptions extends Omit<BasePlayerOptions, 'playbackRates'> {\n onChangeEndTime: (endTime: number) => void;\n onChangeStartTime: (startTime: number) => void;\n startTime?: number;\n endTime?: number;\n minDuration?: number;\n}\n\nexport class CreateClipPlayer extends BasePlayer {\n declare protected options: CreateClipPlayerOptions;\n\n constructor(id: string | Element, options: CreateClipPlayerOptions) {\n super(id, {\n allowFullscreen: true,\n ...options,\n playbackRates: null,\n enableLocalCache: false\n });\n }\n\n protected getPlayerClassName(): string {\n return 'cv-create-clip-player';\n }\n\n protected configurePlugins(): void {\n const { startTime, endTime, minDuration, onChangeStartTime, onChangeEndTime } = this.options;\n this.player.createClipPlugin({ startTime, endTime, minDuration, onChangeStartTime, onChangeEndTime });\n }\n\n protected getPlayerOptions(): VideoJsPlayerOptions {\n const options = super.getPlayerOptions();\n options.inactivityTimeout = 0;\n return options;\n }\n\n protected getSeekBarName(): string {\n return 'CreateClipSeekBar';\n }\n\n protected getAnalyticsPlayerType(): AnalyticsPlayerType {\n return 'create-clip-player';\n }\n}\n","import React from 'react';\n\nimport { CreateClipPlayer, CreateClipPlayerOptions } from 'projects/player/players/create-clip-player';\nimport { getProxy } from 'projects/player/utils/getProxy';\n\nexport interface ClickViewCreateClipPlayerProps extends CreateClipPlayerOptions {\n onReady?: (player: CreateClipPlayer) => void;\n onDispose?: () => void;\n}\n\nexport function ClickViewCreateClipPlayer(props: ClickViewCreateClipPlayerProps): React.ReactElement {\n const { onReady, onDispose } = props;\n\n const ref = React.useRef(null);\n const playerRef = React.useRef<CreateClipPlayer>(null);\n\n React.useEffect(() => {\n playerRef.current?.dispose();\n\n if (!ref)\n return;\n\n playerRef.current = new CreateClipPlayer(ref.current, props);\n\n if (onReady) {\n playerRef.current.ready(() => {\n onReady(getProxy(playerRef.current));\n });\n }\n\n if (onDispose) {\n playerRef.current.one('dispose', onDispose);\n }\n \n return () => {\n playerRef.current?.dispose();\n };\n }, [props.viewKey]);\n\n React.useEffect(() => {\n playerRef.current?.trigger({ type: 'update:clip:start:time', time: props.startTime });\n }, [props.startTime]);\n\n React.useEffect(() => {\n playerRef.current?.trigger({ type: 'update:clip:end:time', time: props.endTime });\n }, [props.endTime]);\n\n return (\n <div ref={ref}></div>\n );\n}\n","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { ClipTimeForm } from 'libs/shared/apps/clips/components/clip-time-form/ClipTimeForm';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, Config, PlayerViewKey, Video } from 'libs/shared/interfaces';\nimport { DialogHelper } from 'libs/shared/utils/DialogHelper';\n\nimport { CreateClipPlayer } from 'projects/player/players/create-clip-player';\nimport { ClickViewCreateClipPlayer } from 'projects/player/react/CreateClipPlayer';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst NAV_LOCK_ID = 'edit-clip-timepoints';\nconst namespace = 'shared.editClipTimepoints';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst DEFAULT_DURATION = 30;\nconst MIN_DURATION = 5;\n\nfunction handleError(error: string): void {\n DialogHelper.render(\n (\n <p>{error}</p>\n ), {\n title: getPhrase('errorHeading'),\n cancelButtonProps: {\n variant: 'link',\n text: getPhrase('close')\n }\n }\n );\n}\n\nfunction safeStringToNumber(value: string): number {\n if (!value) return 0;\n\n const number = Number(value);\n return isNaN(number) ? 0 : number;\n}\n\ninterface EditClipTimepointsViewProps {\n id?: string;\n videoId?: string;\n startTime?: string;\n isCopying?: boolean;\n}\n\nexport function EditClipTimepointsView(props: EditClipTimepointsViewProps): JSX.Element {\n const playerRef = React.useRef<CreateClipPlayer>(null);\n \n const initialStartTime = safeStringToNumber(props.startTime);\n\n const [ startTime, setStartTime ] = React.useState<number>(initialStartTime);\n const [ endTime, setEndTime ] = React.useState<number>(initialStartTime + DEFAULT_DURATION);\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const clip = Flight.useBasicFetch<Clip>(!!props.id && ClipRequests.clip(props.id));\n const videoId = clip.data?._parentVideo?.id || props.videoId;\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(!!videoId &&\n PlayerRequests.createViewKey(videoId, MediaIdType.MasterObject));\n const video = Flight.useBasicFetch<Video>(!!videoId && VideoRequests.video(videoId));\n\n const [ duration, setDuration ] = React.useState<number>(0);\n\n const navLock = useNavLock();\n\n useSetPageMetadata({ title: props.id ? clip.data?.name : getPhrase('pageTitle') });\n\n React.useEffect(() => {\n navLock.lock({\n id: NAV_LOCK_ID,\n title: LanguageService.getPhrase(namespace, 'navLockTitle'),\n text: LanguageService.getPhrase(namespace, 'navLockBody')\n });\n }, []);\n\n React.useEffect(() => {\n if (!clip.data)\n return;\n\n setStartTime(clip.data.startTime);\n setEndTime(clip.data.endTime);\n }, [clip.data]);\n\n function onReady(player: CreateClipPlayer): void {\n playerRef.current = player;\n\n player.on('durationchange', () => setDuration(player.duration()));\n }\n\n function onSubmit(): void {\n let error = '';\n\n if (startTime > endTime)\n error = getPhrase('startTimeGreaterThanEndTime');\n\n if (endTime - startTime < MIN_DURATION)\n error = getPhrase('tooShort', { minDuration: MIN_DURATION });\n\n if (error) {\n handleError(error);\n return;\n }\n\n navLock.unlock(NAV_LOCK_ID);\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLIPS,\n action: props.id ? Actions.Clips.EDIT_CLIP_DETAILS_POPUP : Actions.Clips.CREATE_CLIP_DETAILS,\n args: props.id ? [props.id] : [props.videoId],\n params: { startTime, endTime, isCopying: props.isCopying }\n });\n }\n\n function onCancel(): void {\n const startTime = playerRef.current?.currentTime() ?? 0;\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [\n null,\n video.data?.id,\n TextHelper.slugify(video.data?.name)\n ],\n params: { t: startTime }\n });\n }\n\n if (!props.id && !props.videoId)\n return <></>;\n\n return (\n <div className='px-3'>\n {!!config.data && !!viewKey.data && !!video.data && (!props.id || !!clip.data) &&\n <div className='pb-3'>\n <div className='mb-3'>\n <ClickViewCreateClipPlayer\n onReady={onReady}\n playerApi={new URL(config.data.playerApiUrl)}\n viewKey={viewKey.data.viewKey}\n startTime={startTime}\n endTime={endTime}\n onChangeStartTime={setStartTime}\n onChangeEndTime={setEndTime}\n minDuration={MIN_DURATION}\n autoplay\n />\n </div>\n <ClipTimeForm\n startTime={startTime}\n endTime={endTime}\n setStartTime={setStartTime}\n setEndTime={setEndTime}\n onSubmit={onSubmit}\n onCancel={onCancel}\n duration={duration}\n />\n </div>\n }\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{o as e}from"./DAXXjFlN.chunk.js";import{_ as t}from"./BftnFbcr.chunk.js";import{t as n}from"./DMnm3Ewv.chunk.js";import"./DFZS3Ffo.chunk.js";import{n as ee}from"./B785hxeE.chunk.js";import{t as r}from"./CQyJ7YGa.chunk.js";import{t as te}from"./e57H3T-k.chunk.js";import{t as i}from"./C2w0pmFW.chunk.js";import{t as a}from"./wrLrTezN.chunk.js";import{t as o}from"./BXTI9cmX.chunk.js";import{d as ne,u as s}from"./BX0wDJmp.chunk.js";import{y as re}from"./NlCAcBdo.chunk.js";import{t as ie}from"./DGmmTRu72.chunk.js";import{t as ae}from"./DbSUQ2A12.chunk.js";import{t as oe}from"./DZssmXj6.chunk.js";import{t as se}from"./BC8PeYqm.chunk.js";import{t as c}from"./LoQS6GjP.chunk.js";import{t as l}from"./CqrjHjAN.chunk.js";import{t as u}from"./eoAypzU3.chunk.js";import{t as d}from"./D_gWf2lC.chunk.js";import{t as f}from"./CZbN8PTA.chunk.js";import{t as p}from"./XIE88U01.chunk.js";import{n as ce,t as le}from"./C6-aC3vu.chunk.js";import{t as ue}from"./7LGxCHGV.chunk.js";import{t as m}from"./Bbv3vbm7.chunk.js";import{t as de}from"./B3gsVN-_.chunk.js";import{l as fe,r as h}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{o as e}from"./DAXXjFlN.chunk.js";import{_ as t}from"./BftnFbcr.chunk.js";import{t as n}from"./DMnm3Ewv.chunk.js";import"./DFZS3Ffo.chunk.js";import{n as ee}from"./B785hxeE.chunk.js";import{t as r}from"./CQyJ7YGa.chunk.js";import{t as te}from"./e57H3T-k.chunk.js";import{t as i}from"./C2w0pmFW.chunk.js";import{t as a}from"./wrLrTezN.chunk.js";import{t as o}from"./BXTI9cmX.chunk.js";import{d as ne,u as s}from"./BX0wDJmp.chunk.js";import{y as re}from"./NlCAcBdo.chunk.js";import{t as ie}from"./DGmmTRu72.chunk.js";import{t as ae}from"./DbSUQ2A12.chunk.js";import{t as oe}from"./DZssmXj6.chunk.js";import{t as se}from"./BC8PeYqm.chunk.js";import{t as c}from"./LoQS6GjP.chunk.js";import{t as l}from"./CqrjHjAN.chunk.js";import{t as u}from"./eoAypzU3.chunk.js";import{t as d}from"./D_gWf2lC.chunk.js";import{t as f}from"./CZbN8PTA.chunk.js";import{t as p}from"./XIE88U01.chunk.js";import{n as ce,t as le}from"./C6-aC3vu.chunk.js";import{t as ue}from"./7LGxCHGV.chunk.js";import{t as m}from"./Bbv3vbm7.chunk.js";import{t as de}from"./B3gsVN-_.chunk.js";import{l as fe,r as h}from"./CLvImDXv2.chunk.js";import{t as g}from"./B_-pJtOI2.chunk.js";import{t as _}from"./DBkEQkKm2.chunk.js";import{t as v}from"./C1loT8MD2.chunk.js";import{t as y}from"./CgW21-1J.chunk.js";import{n as b}from"./ChnNWPOK2.chunk.js";import{t as x}from"./1IFtXPNY.chunk.js";import{t as S}from"./DMaQV7L2.chunk.js";import{t as C}from"./CCb14vhF.chunk.js";import{t as w}from"./C9XBZFiR.chunk.js";import{t as T}from"./BnuuRu_J2.chunk.js";import{t as E}from"./CC5Dr9aG.chunk.js";import{t as D}from"./DNuJUXpr2.chunk.js";import{v as O}from"./D-pn0sNx2.chunk.js";import{n as k,r as A,t as j}from"./ftYw2FVB.chunk.js";var M=e(i()),N=a(),P=r.encloseNamespace(`shared.play`),F={notFound:y,forbidden:{privacy:m}};I.defaultProps={queryParams:{}};function I(e){let{context:r,contextId:i,playNext:a,mtv:m,resourceId:y}=e.queryParams,{commonVideoProps:I,hasCommonVideoPropsCompleted:L}=T({locationContext:re.PlayPage,mtv:m}),{hasPermissions:pe}=de(),{activePresentation:R}=f(),{hasPlayPageTranscript:z,hasNewSearch:B,clickViewLive:V}=ie(null),H=s(x.streamableLearning()),U=s(l.currentUser()),W=s(c.video(e.id)),G=v({objectId:W.data?.id,objectTypeId:W.data?.typeId}),me=s(G.canViewClips&&oe.videoClips(e.id)),he=s(G.canViewInteractives&&se.videoInteractives(e.id)),ge=s(R&&S.audiencesByPresentationId(R.id)),{shouldFetchTranscript:K,shouldShowTranscript:_e}=j(e.id),{subtitles:q,chapters:ve}=s(K&&U.data?.contentRegion&&A.chaptersAndSubtitles(e.id,U.data.contentRegion))?.data||{},J=q?.filter(e=>!e.customer),Y=ne(J&&J.length>0?J.map(e=>A.subtitleVtt(e.url,e)):[]),ye=J?.filter(e=>Y.data.find(t=>t.id===e.id))||[],X=s(d.config()),be=O(),xe=s(W.statusCode===n.Forbidden&&c.video(e.id,ae.StripMetadata)),Se=C(e.id),Z=h({video:W.data,context:r,contextId:i,moviesAndTv:m,currentUser:U.data}),Q=fe(e.id,!0),$=s(c.regionAlternatives(e.id)),Ce=E({name:W.data?.name});return le(ce.getVideoMetadata({content:W.data,regionAlternatives:$.data,phraseContext:{phraseHandler:P,titlePhrase:`pageTitle`,descriptionPhrase:`pageDescription`},canonicalLink:g.getCanonicalLink({stripPresentationSlug:!0,customAppLink:_.getAppLink(W.data,{},e.presentationSlug)}),allowIndexing:g.allowIndexing(),hrefLang:g.getContentHrefLang($.data,(e,t)=>({application:o.VIDEOS,action:u.Videos.PLAY_VIDEO,args:[null,e,te.slugify(t)]}))})),w(W,F,{forbidden:!0}),D(Z.videos??[]),b({id:e.id,app:`videos`}),ue(xe),M.useEffect(()=>{V||!W.data||!H.data||!V&&W.data.libraries?.data.find(e=>e.id===H.data.objectId)&&t.throw(new p)},[W.hasCompleted,H.hasCompleted,V]),W.data&&U.hasCompleted&&Q.hasCompleted&&L?(0,N.jsx)(k,{presentationSlug:e.presentationSlug,video:W.data,clips:me.data?.data,interactives:he.data?.data,curriculums:Se,relatedVideos:Z,currentUser:U.data,pointsOfInterest:Q.items,playNext:a,featureAccess:G,audiences:ge.data,params:e.queryParams,canManageVideoAccess:pe(ee.ManageVideoAccess),shouldShowSideTableOfContents:be,tableOfContentsId:e.queryParams?.tocId,breadcrumbs:Ce,commonVideoProps:I,hasTheatreMode:z,shouldShowTranscript:_e&&(!K||Y.data?.length>0),vttSubtitles:Y.data||[],subtitles:ye,chapters:ve,isBot:g.isBot(),playerApiUrl:X.data?.playerApiUrl,hasNewSearch:B,liteUrl:X.data.liteUrl,resourcePopupId:y}):(0,N.jsx)(N.Fragment,{})}export{I as PlayView};
|
|
2
|
+
//# sourceMappingURL=C8x-QH43.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fMgBORUX.chunk.js","names":[],"sources":["../../src/shared/views/play/PlayView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { VideoNotFoundError } from 'libs/shared/errors/videos/video-not-found/VideoNotFoundError';\nimport { VideoPrivateError } from 'libs/shared/errors/videos/video-private/VideoPrivateError';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useBreadcrumbs } from 'libs/shared/hooks/useBreadcrumbs';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { ClipCollection, Config, CurrentUser, InteractiveCollection, PresentationAudience, RegionAlternative, Video, VttSubtitleResponse } from 'libs/shared/interfaces';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { TranscriptRequests, TranscriptResponse } from 'shared/flight-requests/TranscriptRequests';\nimport { useActivePresentation } from 'shared/hooks/presentations/useActivePresentation';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { useCurriculums } from 'shared/hooks/useCurriculums';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\nimport { useShouldShowSideTableOfContents } from 'shared/views/play/hooks/useShouldShowTableOfContents';\nimport { useShowTranscriptForVideo } from 'shared/views/play/hooks/useShowVideoTranscript';\n\nimport { PlayPage } from './components/play-page/PlayPage';\n\nconst namespace = 'shared.play';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst videoErrors = {\n notFound: VideoNotFoundError,\n forbidden: {\n privacy: VideoPrivateError\n }\n};\n\nexport interface PlayViewProps {\n presentationSlug: string;\n id: string;\n queryParams?: PlayViewQueryParams;\n}\n\nPlayView.defaultProps = {\n queryParams: {}\n};\n\nexport function PlayView(props: PlayViewProps): React.ReactElement {\n const { context, contextId, playNext, mtv, resourceId } = props.queryParams;\n\n const {\n commonVideoProps,\n hasCommonVideoPropsCompleted\n } = useCommonVideoProps({ locationContext: LocationContext.PlayPage, mtv });\n\n const { hasPermissions } = usePermissions();\n\n const { activePresentation } = useActivePresentation();\n const { hasPlayPageTranscript, hasNewSearch, clickViewLive } = useSettings(null);\n\n const streamableLibrary = Flight.useBasicFetch<HashObject>(LibraryRequests.streamableLearning());\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const video = Flight.useBasicFetch<Video>(VideoRequests.video(props.id));\n\n const featureAccess = useVideoFeatureAccess({\n objectId: video.data?.id,\n objectTypeId: video.data?.typeId\n });\n \n const clips = Flight.useBasicFetch<ClipCollection>(\n featureAccess.canViewClips && ClipRequests.videoClips(props.id)\n );\n const interactives = Flight.useBasicFetch<InteractiveCollection>(\n featureAccess.canViewInteractives && InteractiveRequests.videoInteractives(props.id)\n );\n \n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n activePresentation &&\n AudienceRequests.audiencesByPresentationId(activePresentation.id)\n );\n\n const { shouldFetchTranscript, shouldShowTranscript } = useShowTranscriptForVideo(props.id);\n const transcript = Flight.useBasicFetch<TranscriptResponse>(\n shouldFetchTranscript && currentUser.data?.contentRegion &&\n TranscriptRequests.chaptersAndSubtitles(props.id, currentUser.data.contentRegion)\n );\n const { subtitles: allSubtitles, chapters } = transcript?.data || {};\n // only show transcript for ClickView produced subtitle\n const subtitles = allSubtitles?.filter(subtitle => !subtitle.customer);\n\n const captionsRequests = (subtitles && subtitles.length > 0) ?\n subtitles.map(subtitle => TranscriptRequests.subtitleVtt(subtitle.url, subtitle)) :\n [];\n const captions = Flight.useBasicFetchAll<VttSubtitleResponse>(captionsRequests);\n const filteredSubtitles = subtitles?.filter(\n subtitle => captions.data.find(caption => caption.id === subtitle.id)\n ) || [];\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const shouldShowSideTableOfContents = useShouldShowSideTableOfContents();\n\n const strippedVideo = Flight.useBasicFetch<Video>(video.statusCode === HttpStatus.Forbidden &&\n VideoRequests.video(props.id, PermissionFilterOption.StripMetadata));\n\n const curriculums = useCurriculums(props.id);\n\n const relatedVideos = useGetRelatedVideos({\n video: video.data,\n context,\n contextId,\n moviesAndTv: mtv,\n currentUser: currentUser.data\n });\n const pointsOfInterest = useFetchPointsOfInterest(props.id, true);\n\n const regionAlternatives = Flight.useBasicFetch<RegionAlternative[]>(\n VideoRequests.regionAlternatives(props.id)\n );\n\n const breadcrumbs = useBreadcrumbs({ name: video.data?.name });\n\n useSetPageMetadata(PageMetadataHelper.getVideoMetadata({\n content: video.data,\n regionAlternatives: regionAlternatives.data,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink({\n stripPresentationSlug: true,\n customAppLink: VideoAppLinkHelper.getAppLink(video.data, {}, props.presentationSlug)\n }),\n allowIndexing: SeoHelper.allowIndexing(),\n hrefLang: SeoHelper.getContentHrefLang(regionAlternatives.data, (id: string, name: string) => ({\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ null, id, TextHelper.slugify(name) ]\n }))\n }));\n\n useHandleObjectError(video, videoErrors, { forbidden: true });\n useVideoMixin(relatedVideos.videos ?? []);\n useDeepLinks({ id: props.id, app: 'videos' });\n useCannotConsumeError(strippedVideo);\n\n React.useEffect(() => {\n if (clickViewLive)\n return;\n\n if (!video.data || !streamableLibrary.data)\n return;\n \n if (!clickViewLive && video.data.libraries?.data.find(library => library.id === streamableLibrary.data.objectId))\n Core.ErrorHelper.throw(new NotFoundError());\n }, [ video.hasCompleted, streamableLibrary.hasCompleted, clickViewLive ]);\n\n const dataLoaded = (\n video.data &&\n currentUser.hasCompleted &&\n pointsOfInterest.hasCompleted &&\n hasCommonVideoPropsCompleted\n );\n\n if (!dataLoaded)\n return <></>;\n\n return (\n <PlayPage\n presentationSlug={props.presentationSlug}\n video={video.data}\n clips={clips.data?.data}\n interactives={interactives.data?.data}\n curriculums={curriculums}\n relatedVideos={relatedVideos}\n currentUser={currentUser.data}\n pointsOfInterest={pointsOfInterest.items}\n playNext={playNext}\n featureAccess={featureAccess}\n audiences={audiences.data}\n params={props.queryParams}\n canManageVideoAccess={hasPermissions(PermissionName.ManageVideoAccess)}\n shouldShowSideTableOfContents={shouldShowSideTableOfContents}\n tableOfContentsId={props.queryParams?.tocId}\n breadcrumbs={breadcrumbs}\n commonVideoProps={commonVideoProps}\n hasTheatreMode={hasPlayPageTranscript}\n shouldShowTranscript={shouldShowTranscript && (!shouldFetchTranscript || captions.data?.length > 0)}\n vttSubtitles={captions.data || []}\n subtitles={filteredSubtitles}\n chapters={chapters}\n isBot={SeoHelper.isBot()}\n playerApiUrl={config.data?.playerApiUrl}\n hasNewSearch={hasNewSearch}\n liteUrl={config.data.liteUrl}\n resourcePopupId={resourceId}\n />\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"C8x-QH43.chunk.js","names":[],"sources":["../../src/shared/views/play/PlayView.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionFilterOption } from 'libs/shared/enums/PermissionFilterOption';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { VideoNotFoundError } from 'libs/shared/errors/videos/video-not-found/VideoNotFoundError';\nimport { VideoPrivateError } from 'libs/shared/errors/videos/video-private/VideoPrivateError';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useBreadcrumbs } from 'libs/shared/hooks/useBreadcrumbs';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { ClipCollection, Config, CurrentUser, InteractiveCollection, PresentationAudience, RegionAlternative, Video, VttSubtitleResponse } from 'libs/shared/interfaces';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { TranscriptRequests, TranscriptResponse } from 'shared/flight-requests/TranscriptRequests';\nimport { useActivePresentation } from 'shared/hooks/presentations/useActivePresentation';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { useCurriculums } from 'shared/hooks/useCurriculums';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\nimport { SeoHelper } from 'shared/utils/SeoHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\nimport { useShouldShowSideTableOfContents } from 'shared/views/play/hooks/useShouldShowTableOfContents';\nimport { useShowTranscriptForVideo } from 'shared/views/play/hooks/useShowVideoTranscript';\n\nimport { PlayPage } from './components/play-page/PlayPage';\n\nconst namespace = 'shared.play';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst videoErrors = {\n notFound: VideoNotFoundError,\n forbidden: {\n privacy: VideoPrivateError\n }\n};\n\nexport interface PlayViewProps {\n presentationSlug: string;\n id: string;\n queryParams?: PlayViewQueryParams;\n}\n\nPlayView.defaultProps = {\n queryParams: {}\n};\n\nexport function PlayView(props: PlayViewProps): React.ReactElement {\n const { context, contextId, playNext, mtv, resourceId } = props.queryParams;\n\n const {\n commonVideoProps,\n hasCommonVideoPropsCompleted\n } = useCommonVideoProps({ locationContext: LocationContext.PlayPage, mtv });\n\n const { hasPermissions } = usePermissions();\n\n const { activePresentation } = useActivePresentation();\n const { hasPlayPageTranscript, hasNewSearch, clickViewLive } = useSettings(null);\n\n const streamableLibrary = Flight.useBasicFetch<HashObject>(LibraryRequests.streamableLearning());\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const video = Flight.useBasicFetch<Video>(VideoRequests.video(props.id));\n\n const featureAccess = useVideoFeatureAccess({\n objectId: video.data?.id,\n objectTypeId: video.data?.typeId\n });\n \n const clips = Flight.useBasicFetch<ClipCollection>(\n featureAccess.canViewClips && ClipRequests.videoClips(props.id)\n );\n const interactives = Flight.useBasicFetch<InteractiveCollection>(\n featureAccess.canViewInteractives && InteractiveRequests.videoInteractives(props.id)\n );\n \n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n activePresentation &&\n AudienceRequests.audiencesByPresentationId(activePresentation.id)\n );\n\n const { shouldFetchTranscript, shouldShowTranscript } = useShowTranscriptForVideo(props.id);\n const transcript = Flight.useBasicFetch<TranscriptResponse>(\n shouldFetchTranscript && currentUser.data?.contentRegion &&\n TranscriptRequests.chaptersAndSubtitles(props.id, currentUser.data.contentRegion)\n );\n const { subtitles: allSubtitles, chapters } = transcript?.data || {};\n // only show transcript for ClickView produced subtitle\n const subtitles = allSubtitles?.filter(subtitle => !subtitle.customer);\n\n const captionsRequests = (subtitles && subtitles.length > 0) ?\n subtitles.map(subtitle => TranscriptRequests.subtitleVtt(subtitle.url, subtitle)) :\n [];\n const captions = Flight.useBasicFetchAll<VttSubtitleResponse>(captionsRequests);\n const filteredSubtitles = subtitles?.filter(\n subtitle => captions.data.find(caption => caption.id === subtitle.id)\n ) || [];\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const shouldShowSideTableOfContents = useShouldShowSideTableOfContents();\n\n const strippedVideo = Flight.useBasicFetch<Video>(video.statusCode === HttpStatus.Forbidden &&\n VideoRequests.video(props.id, PermissionFilterOption.StripMetadata));\n\n const curriculums = useCurriculums(props.id);\n\n const relatedVideos = useGetRelatedVideos({\n video: video.data,\n context,\n contextId,\n moviesAndTv: mtv,\n currentUser: currentUser.data\n });\n const pointsOfInterest = useFetchPointsOfInterest(props.id, true);\n\n const regionAlternatives = Flight.useBasicFetch<RegionAlternative[]>(\n VideoRequests.regionAlternatives(props.id)\n );\n\n const breadcrumbs = useBreadcrumbs({ name: video.data?.name });\n\n useSetPageMetadata(PageMetadataHelper.getVideoMetadata({\n content: video.data,\n regionAlternatives: regionAlternatives.data,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink({\n stripPresentationSlug: true,\n customAppLink: VideoAppLinkHelper.getAppLink(video.data, {}, props.presentationSlug)\n }),\n allowIndexing: SeoHelper.allowIndexing(),\n hrefLang: SeoHelper.getContentHrefLang(regionAlternatives.data, (id: string, name: string) => ({\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ null, id, TextHelper.slugify(name) ]\n }))\n }));\n\n useHandleObjectError(video, videoErrors, { forbidden: true });\n useVideoMixin(relatedVideos.videos ?? []);\n useDeepLinks({ id: props.id, app: 'videos' });\n useCannotConsumeError(strippedVideo);\n\n React.useEffect(() => {\n if (clickViewLive)\n return;\n\n if (!video.data || !streamableLibrary.data)\n return;\n \n if (!clickViewLive && video.data.libraries?.data.find(library => library.id === streamableLibrary.data.objectId))\n Core.ErrorHelper.throw(new NotFoundError());\n }, [ video.hasCompleted, streamableLibrary.hasCompleted, clickViewLive ]);\n\n const dataLoaded = (\n video.data &&\n currentUser.hasCompleted &&\n pointsOfInterest.hasCompleted &&\n hasCommonVideoPropsCompleted\n );\n\n if (!dataLoaded)\n return <></>;\n\n return (\n <PlayPage\n presentationSlug={props.presentationSlug}\n video={video.data}\n clips={clips.data?.data}\n interactives={interactives.data?.data}\n curriculums={curriculums}\n relatedVideos={relatedVideos}\n currentUser={currentUser.data}\n pointsOfInterest={pointsOfInterest.items}\n playNext={playNext}\n featureAccess={featureAccess}\n audiences={audiences.data}\n params={props.queryParams}\n canManageVideoAccess={hasPermissions(PermissionName.ManageVideoAccess)}\n shouldShowSideTableOfContents={shouldShowSideTableOfContents}\n tableOfContentsId={props.queryParams?.tocId}\n breadcrumbs={breadcrumbs}\n commonVideoProps={commonVideoProps}\n hasTheatreMode={hasPlayPageTranscript}\n shouldShowTranscript={shouldShowTranscript && (!shouldFetchTranscript || captions.data?.length > 0)}\n vttSubtitles={captions.data || []}\n subtitles={filteredSubtitles}\n chapters={chapters}\n isBot={SeoHelper.isBot()}\n playerApiUrl={config.data?.playerApiUrl}\n hasNewSearch={hasNewSearch}\n liteUrl={config.data.liteUrl}\n resourcePopupId={resourceId}\n />\n );\n}\n"],"mappings":"yqDAoDM,EAAY,EAAgB,iBAAiB,aAAS,EAEtD,EAAc,CAClB,SAAU,EACV,UAAW,CACT,QAAS,CACX,CACF,EAQA,EAAS,aAAe,CACtB,YAAa,CAAC,CAChB,EAEA,SAAgB,EAAS,EAA0C,CACjE,GAAM,CAAE,UAAS,YAAW,WAAU,MAAK,cAAe,EAAM,YAE1D,CACJ,mBACA,gCACE,EAAoB,CAAE,gBAAiB,GAAgB,SAAU,KAAI,CAAC,EAEpE,CAAE,mBAAmB,GAAe,EAEpC,CAAE,sBAAuB,EAAsB,EAC/C,CAAE,wBAAuB,eAAc,iBAAkB,GAAY,IAAI,EAEzE,EAAoB,EAAiC,EAAgB,mBAAmB,CAAC,EAEzF,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAQ,EAA4B,EAAc,MAAM,EAAM,EAAE,CAAC,EAEjE,EAAgB,EAAsB,CAC1C,SAAU,EAAM,MAAM,GACtB,aAAc,EAAM,MAAM,MAC5B,CAAC,EAEK,GAAQ,EACZ,EAAc,cAAgB,GAAa,WAAW,EAAM,EAAE,CAChE,EACM,GAAe,EACnB,EAAc,qBAAuB,GAAoB,kBAAkB,EAAM,EAAE,CACrF,EAEM,GAAY,EAChB,GACA,EAAiB,0BAA0B,EAAmB,EAAE,CAClE,EAEM,CAAE,wBAAuB,yBAAyB,EAA0B,EAAM,EAAE,EAKpF,CAAE,UAAW,EAAc,aAJd,EACjB,GAAyB,EAAY,MAAM,eAC3C,EAAmB,qBAAqB,EAAM,GAAI,EAAY,KAAK,aAAa,CAEpC,CAAA,EAAY,MAAQ,CAAC,EAE7D,EAAY,GAAc,OAAO,GAAY,CAAC,EAAS,QAAQ,EAK/D,EAAW,GAHS,GAAa,EAAU,OAAS,EACxD,EAAU,IAAI,GAAY,EAAmB,YAAY,EAAS,IAAK,CAAQ,CAAC,EAChF,CAAC,CAC2E,EACxE,GAAoB,GAAW,OACnC,GAAY,EAAS,KAAK,KAAK,GAAW,EAAQ,KAAO,EAAS,EAAE,CACtE,GAAK,CAAC,EACA,EAAS,EAA6B,EAAe,OAAO,CAAC,EAE7D,GAAgC,EAAiC,EAEjE,GAAgB,EAA4B,EAAM,aAAe,EAAW,WAChF,EAAc,MAAM,EAAM,GAAI,GAAuB,aAAa,CAAC,EAE/D,GAAc,EAAe,EAAM,EAAE,EAErC,EAAgB,EAAoB,CACxC,MAAO,EAAM,KACb,UACA,YACA,YAAa,EACb,YAAa,EAAY,IAC3B,CAAC,EACK,EAAmB,GAAyB,EAAM,GAAI,EAAI,EAE1D,EAAqB,EACzB,EAAc,mBAAmB,EAAM,EAAE,CAC3C,EAEM,GAAc,EAAe,CAAE,KAAM,EAAM,MAAM,IAAK,CAAC,EAgD7D,OA9CA,GAAmB,GAAmB,iBAAiB,CACrD,QAAS,EAAM,KACf,mBAAoB,EAAmB,KACvC,cAAe,CACb,cAAe,EACf,YAAa,YACb,kBAAmB,iBACrB,EACA,cAAe,EAAU,iBAAiB,CACxC,sBAAuB,GACvB,cAAe,EAAmB,WAAW,EAAM,KAAM,CAAC,EAAG,EAAM,gBAAgB,CACrF,CAAC,EACD,cAAe,EAAU,cAAc,EACvC,SAAU,EAAU,mBAAmB,EAAmB,MAAO,EAAY,KAAkB,CAC7F,YAAa,EAAY,OACzB,OAAQ,EAAQ,OAAO,WACvB,KAAM,CAAE,KAAM,EAAI,GAAW,QAAQ,CAAI,CAAE,CAC7C,EAAE,CACJ,CAAC,CAAC,EAEF,EAAqB,EAAO,EAAa,CAAE,UAAW,EAAK,CAAC,EAC5D,EAAc,EAAc,QAAU,CAAC,CAAC,EACxC,EAAa,CAAE,GAAI,EAAM,GAAI,IAAK,QAAS,CAAC,EAC5C,GAAsB,EAAa,EAEnC,EAAM,cAAgB,CAChB,GAGA,CAAC,EAAM,MAAQ,CAAC,EAAkB,MAGlC,CAAC,GAAiB,EAAM,KAAK,WAAW,KAAK,KAAK,GAAW,EAAQ,KAAO,EAAkB,KAAK,QAAQ,GAC7G,EAAiB,MAAM,IAAI,CAAe,CAC9C,EAAG,CAAE,EAAM,aAAc,EAAkB,aAAc,CAAc,CAAC,EAGtE,EAAM,MACN,EAAY,cACZ,EAAiB,cACjB,GAOA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,iBAAkB,EAAM,iBACxB,MAAO,EAAM,KACb,MAAO,GAAM,MAAM,KACnB,aAAc,GAAa,MAAM,KACpB,eACE,gBACf,YAAa,EAAY,KACzB,iBAAkB,EAAiB,MACzB,WACK,gBACf,UAAW,GAAU,KACrB,OAAQ,EAAM,YACd,qBAAsB,GAAe,GAAe,iBAAiB,EACtC,iCAC/B,kBAAmB,EAAM,aAAa,MACzB,eACK,mBAClB,eAAgB,EAChB,qBAAsB,KAAyB,CAAC,GAAyB,EAAS,MAAM,OAAS,GACjG,aAAc,EAAS,MAAQ,CAAC,EAChC,UAAW,GACD,YACV,MAAO,EAAU,MAAM,EACvB,aAAc,EAAO,MAAM,aACb,eACd,QAAS,EAAO,KAAK,QACrB,gBAAiB,CAClB,CAAA,GA/BM,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,CAiCf"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{o as e}from"./DAXXjFlN.chunk.js";import{x as t}from"./BftnFbcr.chunk.js";import{t as n}from"./C2w0pmFW.chunk.js";import{t as r}from"./wrLrTezN.chunk.js";import{C as i,U as a,d as o,l as s,z as c}from"./NlCAcBdo.chunk.js";import{t as l}from"./Dyy-PWHO.chunk.js";import{a as u,c as d,d as f,f as p,m,n as h,o as g,p as _,s as v,t as ee,u as te}from"./
|
|
1
|
+
import{o as e}from"./DAXXjFlN.chunk.js";import{x as t}from"./BftnFbcr.chunk.js";import{t as n}from"./C2w0pmFW.chunk.js";import{t as r}from"./wrLrTezN.chunk.js";import{C as i,U as a,d as o,l as s,z as c}from"./NlCAcBdo.chunk.js";import{t as l}from"./Dyy-PWHO.chunk.js";import{a as u,c as d,d as f,f as p,m,n as h,o as g,p as _,s as v,t as ee,u as te}from"./Dqn0sInF.chunk.js";import{t as y}from"./CnnDkGmK.chunk.js";import{n as b}from"./B5XaBzZh.chunk.js";import"./BhE5KhcC.chunk.js";import"./CM8248d7.chunk.js";import{t as x}from"./BiKac8UT2.chunk.js";import"./Bc1JT5Y-2.chunk.js";import{a as S,i as C,n as w,o as T,r as E,s as D,t as O}from"./_jJAx6fU.chunk.js";import{t as ne}from"./CLjADRa42.chunk.js";var k=e(n()),re=m.getComponent(`Button`),A=class extends re{constructor(...e){super(...e),this.alwaysCollapsed=!1,this.isCollapsed=!1,this.isCollabsible=!0}buildCSSClass(){return`cv-create-clip-button`}getCollabsibleName(){return this.controlText_}getCollabsibleValue(){return``}showInCollabsibleMenu(){return!0}showCollapsibleMenu(){super.handleClick(null)}};A.prototype.controlText_=`Create clip`,m.registerComponent(`CreateClipButton`,A);var ie=m.getPlugin(`plugin`),ae=class extends ie{constructor(e,t){super(e,t),this.options=t,e.ready(()=>this.onReady())}onReady(){let e=this.player.getChild(`collapserator`);e&&e.addChild(`CreateClipButton`,{clickHandler:this.options.onClick})}};m.registerPlugin(`createClipButtonPlugin`,ae);var oe=m.getComponent(`PictureInPictureToggle`),se=class extends oe{handlePictureInPictureEnabledChange(){this.enable()}};m.registerComponent(`PictureInPictureToggle`,se);var ce=m.getComponent(`PlayToggle`),le=m.getPlugin(`plugin`),ue=800,de=class extends le{constructor(e,t){super(e,t),this.options=t,this.bindFunctions(),e.ready(()=>this.initialize())}bindFunctions(){this.requestPictureInPicture=this.requestPictureInPicture.bind(this),this.exitPictureInPicture=this.exitPictureInPicture.bind(this),this.onPlayerResize=this.onPlayerResize.bind(this),this.playerRequestPictureInPictureFn=this.player.requestPictureInPicture,this.playerExitPictureInPictureFn=this.player.exitPictureInPicture,this.player.requestPictureInPicture=this.requestPictureInPicture,this.player.exitPictureInPicture=this.exitPictureInPicture}initialize(){let e=this.player.getChild(`collapserator`);this.toggle=e.addChild(`pictureInPictureToggle`,{}),this.toggle.enable(),this.player.on(`playerresize`,this.onPlayerResize),this.player.on(`dispose`,()=>{this.player?.off(`playerresize`,this.onPlayerResize)})}togglePictureInPicture(e){if(e===this.player.isInPictureInPicture())return;let t=e?`enterpictureinpicture`:`leavepictureinpicture`;this.player.isInPictureInPicture(e),this.player.trigger(t),e?this.addPipStyles():this.removePipStyles()}onPlayerResize(){if(this.player.isInPictureInPicture())return;let e=this.player.el().getBoundingClientRect();e.width!==0&&(e.width<ue?this.toggle?.hide():this.toggle?.show())}addPipStyles(){this.player.addClass(`cv-picture-in-picture`),this.playToggle=new ce(this.player),this.playToggle.addClass(`cv-pip-play-toggle`),this.player.addChild(this.playToggle),this.player.paused()?this.playToggle.handlePause():this.playToggle.handlePlay()}removePipStyles(){this.player.removeClass(`cv-picture-in-picture`),this.player.removeChild(this.playToggle),delete this.playToggle}requestPictureInPicture(){this.togglePictureInPicture(!0),typeof this.options?.onRequestPictureInPicture==`function`&&this.options.onRequestPictureInPicture(!0)}async exitPictureInPicture(){this.togglePictureInPicture(!1),this.options.onRequestPictureInPicture(!1),this.removePipStyles()}dispose(){this.player.requestPictureInPicture=this.playerRequestPictureInPictureFn,this.player.exitPictureInPicture=this.playerExitPictureInPictureFn,super.dispose()}};m.registerPlugin(`pictureInPicture`,de);var fe=m.getComponent(`Component`),pe=class extends fe{constructor(e,t){super(e,t),this.hasBuffered=!1,this.hasPlayed=!1,this.eventsService=ne,this.pointOfInterest=t.pointOfInterest,this.onMouseOver=this.onMouseOver.bind(this),this.onMouseLeave=this.onMouseLeave.bind(this),this.onGlancePointOfInterestMouseEnter=this.onGlancePointOfInterestMouseEnter.bind(this),this.onGlancePointOfInterestMouseLeave=this.onGlancePointOfInterestMouseLeave.bind(this),this.initialize()}initialize(){this.setPosition(),this.bindListeners()}buildCSSClass(){return`cv-point-of-interest-indicator ${super.buildCSSClass()}`}createEl(e,t,n){return super.createEl(e,{...t,className:this.buildCSSClass()},n)}bindListeners(){this.on(`mouseover`,this.onMouseOver),this.on(`mouseleave`,this.onMouseLeave),this.eventsService.subscribe(`glance:poi:mouseover`,this.onGlancePointOfInterestMouseEnter),this.eventsService.subscribe(`glance:poi:mouseleave`,this.onGlancePointOfInterestMouseLeave)}dispose(){this.eventsService.unsubscribe(`glance:poi:mouseover`,this.onGlancePointOfInterestMouseEnter),this.eventsService.unsubscribe(`glance:poi:mouseleave`,this.onGlancePointOfInterestMouseLeave)}getPointOfInterestTime(){return this.pointOfInterest.startTime}setPosition(){let e=this.player().duration();this.el_.style.left=this.getPointOfInterestTime()/e*100+`%`}updateBuffered(e){let t=this.getPointOfInterestTime()<=e;if(t===this.hasBuffered)return;this.hasBuffered=t;let n=`cv-point-of-interest-indicator-buffered`;this.hasBuffered?this.addClass(n):this.removeClass(n)}updatePlaybackProgress(e){let t=this.getPointOfInterestTime()<=e;if(t===this.hasPlayed)return;this.hasPlayed=t;let n=`cv-point-of-interest-indicator-played`;t?this.addClass(n):this.removeClass(n)}toggleVisibility(e){let t=`cv-point-of-interest-indicator-hidden`;e?this.removeClass(t):this.addClass(t)}onMouseOver(){this.setTimeTooltipText(),this.eventsService.trigger(`player:poi:mouseover`,this.pointOfInterest)}onMouseLeave(){this.clearTimeTooltipText(),this.eventsService.trigger(`player:poi:mouseleave`)}onGlancePointOfInterestMouseEnter(e){e.id===this.pointOfInterest.id&&(this.addClass(`cv-point-of-interest-indicator-highlight`),this.setTimeTooltipTime(),this.setTimeTooltipText(),this.positionMouseTimeDisplay(),this.showMouseTimeDisplay())}onGlancePointOfInterestMouseLeave(){this.removeClass(`cv-point-of-interest-indicator-highlight`),this.hideMouseTimeDisplay()}setTimeTooltipText(){this.getTimeTooltip()?.setCustomChapterText(this.pointOfInterest.description)}clearTimeTooltipText(){this.getTimeTooltip()?.setCustomChapterText()}setTimeTooltipTime(){this.getTimeTooltip()?.updateTime(this.getPointOfInterestTime())}positionMouseTimeDisplay(){let e=this.getSeekBar()?.el();if(!e)return;let t=m.dom.findPosition(e),n=this.getPointOfInterestTime()/this.player().duration();this.getMouseTimeDisplay()?.update(t,n)}showMouseTimeDisplay(){this.getMouseTimeDisplay()?.forceShow()}hideMouseTimeDisplay(){this.getMouseTimeDisplay()?.removeForceShow()}getSeekBar(){return this.player().controlBar.getChild(`ProgressControl`)?.getChild(`SeekBar`)}getMouseTimeDisplay(){return this.getSeekBar()?.getChild(`MouseTimeDisplay`)}getTimeTooltip(){return this.getMouseTimeDisplay()?.getChild(`TimeTooltip`)}},me=m.getComponent(`MenuItem`),j=class extends me{constructor(e,t){super(e,t),this.pointsOfInterestVisible=t.pointsOfInterestVisible,this.toggle(this.pointsOfInterestVisible)}handleToggle(){this.toggle(!this.pointsOfInterestVisible)}toggle(e){e?this.toggleOn():this.toggleOff()}toggleOn(){m.dom.addClass(this.toggleEl,`on`),m.dom.setAttribute(this.toggleEl,`aria-checked`,`true`),this.pointsOfInterestVisible=!0,this.player().pointsOfInterestPlugin().togglePointsOfInterest(this.pointsOfInterestVisible)}toggleOff(){m.dom.removeClass(this.toggleEl,`on`),m.dom.setAttribute(this.toggleEl,`aria-checked`,`false`),this.pointsOfInterestVisible=!1,this.player().pointsOfInterestPlugin().togglePointsOfInterest(this.pointsOfInterestVisible)}handleClick(e){e.stopImmediatePropagation()}createEl(e,t,n){this.handlerBound||=(this.handleToggle=this.handleToggle.bind(this),!0),this.toggleEl&&this.toggleEl.removeEventListener(`click`,this.handleToggle),this.toggleEl=m.dom.createEl(`div`,{className:`custom-toggle custom-toggle-info toggle-option float-end`,innerHTML:`<span class="handle"></span></div>`}),m.dom.setAttribute(this.toggleEl,`id`,`poi-toggle`),m.dom.setAttribute(this.toggleEl,`role`,`switch`),this.toggleEl.addEventListener(`click`,this.handleToggle);let r=super.createEl(e,{className:`vjs-menu-item cv-cog-menu-item cv-poi-toggle`,innerHTML:`
|
|
2
2
|
<span for="poi-toggle" class="vjs-menu-item-text">Points of Interest</span>
|
|
3
3
|
<span class="cv-toggle-container"></span>`},n);return r.children[1].appendChild(this.toggleEl),r}};m.registerComponent(`PointsOfInterestMenuItem`,j);var M=m.getPlugin(`plugin`),N=`cvplayer-points-of-interest`,P=class extends M{constructor(e,t){super(e),this.pointOfInterestIndicators=[],this.enabled=!0,this.pointsOfInterest=t?.pointsOfInterest,this.initialize=this.initialize.bind(this),this.updateBuffered=this.updateBuffered.bind(this),this.updatePlaybackProgress=this.updatePlaybackProgress.bind(this),this.player.one(`loadedmetadata`,()=>this.player.ready(this.initialize))}initialize(){this.pointsOfInterest&&(b.hasLocalStorage()&&b.get(N)===`false`&&(this.enabled=!1),this.setupTrack(),this.createPointOfInterestIndicators(),this.addMenuItem(),this.bindListeners())}bindListeners(){this.player.on(`progress`,this.updateBuffered),this.player.on(`timeupdate`,this.updatePlaybackProgress),this.player.on(`dispose`,()=>{this.player?.off(`progress`,this.updateBuffered),this.player?.off(`timeupdate`,this.updatePlaybackProgress)})}togglePointsOfInterest(e){b.set(N,e.toString()),this.pointOfInterestIndicators.forEach(t=>t.toggleVisibility(e))}setupTrack(){let e=this.player.addTextTrack(`metadata`,`pointsofinterest`);this.pointsOfInterest.forEach(t=>{e.addCue({startTime:t.startTime,endTime:t.endTime,text:t.description})}),e.trigger({type:`loadeddata`,target:e})}createPointOfInterestIndicators(){let e=this.player.controlBar.getChild(`ProgressControl`)?.getChild(`SeekBar`);this.pointsOfInterest.forEach(t=>{let n=new pe(this.player,{pointOfInterest:t});this.pointOfInterestIndicators.push(n),e.addChild(n)})}addMenuItem(){(this.player.getChild(`collapserator`)?.getChild(`cogButton`)).addItem({ctor:j,name:`PointsOfInterestMenuItem`,options:{pointsOfInterestVisible:this.enabled}})}updateBuffered(){this.pointOfInterestIndicators.forEach(e=>e.updateBuffered(u(this.player)))}updatePlaybackProgress(){this.pointOfInterestIndicators.forEach(e=>e.updatePlaybackProgress(this.player.currentTime()))}};m.registerPlugin(`pointsOfInterestPlugin`,P);var F=m.getComponent(`Component`),I=class extends F{constructor(e,t){super(e,t),this.initialize()}initialize(){this.setPosition()}buildCSSClass(){return`cv-range-indicator ${super.buildCSSClass()}`}createEl(e,t,n){return super.createEl(e,{...t,className:this.buildCSSClass()},n)}setPosition(){let e=this.player().duration();this.el_.style.left=this.options_.time/e*100+`%`}},L=m.getComponent(`ClickableComponent`),R=class extends L{constructor(e,t){super(e,t)}buildCSSClass(){return`cv-replay-view-button ${super.buildCSSClass()}`}createEl(e,t,n){return super.createEl(e,{...t,innerHTML:`<span class="${this.options_.iconClassName}"></span><span>${this.options_.label}</span>`,className:this.buildCSSClass()},n)}handleClick(){this.options_.onPress()}},z=m.getComponent(`Component`),he=class extends z{constructor(e,t){super(e,t)}buildCSSClass(){return`cv-replay-view ${super.buildCSSClass()}`}createEl(e,t,n){let r=super.createEl(e,{...t,className:this.buildCSSClass()},n),i=m.dom.createEl(`h5`,{innerHTML:this.localize(`This clip has finished`),className:`cv-replay-heading`}),a=m.dom.createEl(`div`,{className:`cv-button-container`}),o=new R(this.player_,{label:this.localize(`Replay clip`),iconClassName:`cv-replay-icon`,onPress:this.options_.onReplayPress}),s=new R(this.player_,{label:this.localize(`Continue watching`),iconClassName:`cv-continue-icon`,onPress:this.options_.onContinuePress});return r.appendChild(i),r.appendChild(a),a.appendChild(o.el()),a.appendChild(s.el()),r}},ge=m.getPlugin(`plugin`),_e=class extends ge{constructor(e,t){if(super(e,t),this.startTime=parseFloat(t.startTime.toPrecision(4)),this.endTime=parseFloat(t.endTime.toPrecision(4)),this.dismissed=!1,this.startTime>this.endTime)throw Error(`Range start cannot be greater than range end`);this.bindFunctions(),this.initialize()}bindFunctions(){this.onReady=this.onReady.bind(this),this.onTimeUpdateOrSeeked=this.onTimeUpdateOrSeeked.bind(this),this.onReplayPress=this.onReplayPress.bind(this),this.onContinuePress=this.onContinuePress.bind(this)}initialize(){this.player.one(`loadedmetadata`,()=>this.player.ready(this.onReady)),this.player.on(`timeupdate`,this.onTimeUpdateOrSeeked),this.player.on(`seeked`,this.onTimeUpdateOrSeeked)}onReady(){this.addCssClasses(),this.showRangeIndicators(),this.addMaskToProgressBar()}onTimeUpdateOrSeeked(){if(this.dismissed)return;let e=this.player.currentTime();if(e<this.startTime){this.player.currentTime(this.startTime);return}if(e>this.endTime){this.showReplayView(),this.disablePlayToggle(),this.player.pause(),this.player.currentTime(this.endTime);return}}onReplayPress(){this.player.currentTime(this.startTime),this.player.play(),this.hideReplayView(),this.enablePlayToggle()}onContinuePress(){this.dismissed=!0,this.player.play(),this.hideRangeIndicators(),this.removeMaskFromProgressBar(),this.hideReplayView(),this.enablePlayToggle(),this.removeCssClasses()}showRangeIndicators(){let e=this.player.controlBar.getChild(`ProgressControl`)?.getChild(`SeekBar`);this.startTimeIndicator||(this.startTimeIndicator=new I(this.player,{time:this.startTime}),e?.addChild(this.startTimeIndicator)),this.endTimeIndicator||(this.endTimeIndicator=new I(this.player,{time:this.endTime}),e?.addChild(this.endTimeIndicator))}hideRangeIndicators(){this.startTimeIndicator?.hide(),this.endTimeIndicator?.hide()}addMaskToProgressBar(){let e=(this.player.controlBar.getChild(`ProgressControl`)?.getChild(`SeekBar`))?.el().getElementsByClassName(`cv-chapter-bar-items`);if(e&&e.length){let t=e[0],n=this.player.duration(),r=this.startTime/n*100,i=100-this.endTime/n*100;t.style.clipPath=`inset(-5em ${i}% -5em ${r}%)`}}removeMaskFromProgressBar(){let e=(this.player.controlBar.getChild(`ProgressControl`)?.getChild(`SeekBar`))?.el().getElementsByClassName(`cv-chapter-bar-items`);if(e&&e.length){let t=e[0];t.style.clipPath=``}}showReplayView(){this.replayView||(this.replayView=new he(this.player,{onContinuePress:this.onContinuePress,onReplayPress:this.onReplayPress}),this.player.addChild(this.replayView)),this.replayView.show()}hideReplayView(){this.replayView?.hide()}getPlayToggle(){return this.player.getChild(`collapserator`)?.getChild(`PlayToggle`)}enablePlayToggle(){let e=this.getPlayToggle();e&&e.enable()}disablePlayToggle(){let e=this.getPlayToggle();e&&e.disable()}addCssClasses(){this.player.addClass(`cv-range-indicator-plugin`)}removeCssClasses(){this.player.removeClass(`cv-range-indicator-plugin`)}dispose(){this.removeCssClasses(),this.player.off(`timeupdate`,this.onTimeUpdateOrSeeked),this.player.off(`seeked`,this.onTimeUpdateOrSeeked),this.startTimeIndicator?.dispose(),this.endTimeIndicator?.dispose(),this.replayView?.dispose(),super.dispose()}};m.registerPlugin(`rangeIndicatorPlugin`,_e);var B={generateRandomId:()=>window.crypto?.randomUUID?.()??Math.random().toString()},ve=class extends ee{constructor(e,t){super(e,t)}getPlayerOptions(){let e=super.getPlayerOptions();return this.options.allowTranscript&&(e.allowTranscript=!0),e.devicesConfig?.canUserCastToDevices?{...e,techOrder:[`devices`,...e.techOrder],devices:{instanceId:B.generateRandomId()}}:e}configurePlugins(){try{this.options.onClickCreateClip&&this.player.createClipButtonPlugin({onClick:this.options.onClickCreateClip}),this.options.onRequestPictureInPicture&&this.player.pictureInPicture({onRequestPictureInPicture:this.options.onRequestPictureInPicture}),this.options.pointsOfInterest?.length&&this.player.pointsOfInterestPlugin({pointsOfInterest:this.options.pointsOfInterest}),this.player.loopVideoPlugin({allowLoop:this.options.allowLoop})}catch(e){console.log(`failed to register plugins`,e)}}setNextVideo(e,t,n){this.player.nextVideoPlugin&&this.player.nextVideoPlugin().setNextVideo(e,t,n)}togglePictureInPicture(e){let t=this.player.pictureInPicture();t&&t.togglePictureInPicture(e)}toggleTheatreMode(e){let t=this.player.theatreModePlugin();t&&t.toggleTheatreMode(e,{shouldLog:!0})}toggleTranscript(e){if(!this.player.viewTranscriptPlugin)return;let t=this.player.viewTranscriptPlugin();t&&t.toggleTranscript(e)}hasStarted(){return this.player.hasStarted()}async additionalSetup(e){if(this.options.onRequestTheatreMode&&this.options.allowTheatreMode&&this.player.theatreModePlugin&&this.player.theatreModePlugin({onRequestTheatreMode:this.options.onRequestTheatreMode,theatreMode:this.options.theatreMode,playbackObject:e}),super.additionalSetup(e),this.options.showResources&&e.resources&&this.player.resourcesPlugin&&this.player.resourcesPlugin({resources:e.resources.list,imageCdnUrl:this.options.imageCdnUrl}),e.mediaType===`MasterClip`){let t=e.additionalData;if(t===null)throw Error(`Invalid clip data`);this.player.clipPlugin({startTime:t.startTime,endTime:t.endTime})}e.mediaType===`MasterVideo`&&this.options.startTime&&this.options.endTime&&this.player.rangeIndicatorPlugin({startTime:this.options.startTime,endTime:this.options.endTime})}setupAnalyticsDependentPlugins(e){super.setupAnalyticsDependentPlugins(e),this.options.allowTranscript&&this.player.viewTranscriptPlugin().registerAnalytics(this.analyticsService,e),this.options.onRequestTheatreMode&&this.options.allowTheatreMode&&this.player.theatreModePlugin&&this.player.theatreModePlugin().registerAnalytics(this.analyticsService),this.options.devicesConfig?.canUserCastToDevices&&this.player.devicesPlugin&&this.player.devicesPlugin({...this.options.devicesConfig,userId:parseInt(e.viewerId),title:e.title,analyticsService:this.analyticsService})}setActivityStatus(e,t){this.player.activityStatusPlugin().setActivityStatus(e,t)}useCurrentTranscript(e,t){p.useMetadataTracks(this.player,`transcript`,e,t)}useChapters(e){p.useChapters(this.player,e)}},V={reconnectIntervalInMilliseconds:3e3,heartbeatEnabled:!1,heartbeatIntervalInMillseconds:1e4,heartbeatMessage:``},ye=class{constructor(e,t=V){this.bindFunctions(),this.url=e,this.options={...V,...t},this.webSocket=this.connect(),this.heartbeat=new E().schedule(()=>this.send(this.options.heartbeatMessage)).every(this.options.heartbeatIntervalInMillseconds)}bindFunctions(){this.cleanup=this.cleanup.bind(this),this.handleOpen=this.handleOpen.bind(this),this.handleMessage=this.handleMessage.bind(this),this.handleClose=this.handleClose.bind(this),this.handleError=this.handleError.bind(this),this.connect=this.connect.bind(this),this.send=this.send.bind(this),this.dipose=this.dipose.bind(this)}cleanup(){this.heartbeat.stop(),this.webSocket.removeEventListener(`error`,this.handleError),this.webSocket.removeEventListener(`message`,this.handleMessage),this.webSocket.removeEventListener(`open`,this.handleOpen),this.webSocket.removeEventListener(`close`,this.handleClose)}handleOpen(e){this.onOpen?.(e),this.options.heartbeatEnabled&&this.heartbeat.start()}handleMessage(e){this.onMessage?.(e)}handleClose(e){this.onClose?.(e),this.cleanup(),setTimeout(()=>{this.webSocket=this.connect()},this.options.reconnectIntervalInMilliseconds)}handleError(e){this.onError?.(e),this.handleClose()}connect(){let e=new WebSocket(this.url);return e.addEventListener(`open`,this.handleOpen),e.addEventListener(`message`,this.handleMessage),e.addEventListener(`close`,this.handleClose),e.addEventListener(`error`,this.handleError),e}send(e){this.webSocket.send(e)}dipose(){this.cleanup(),this.webSocket.close()}},be=2e3,xe=class{constructor(e,t){return this._timerStartedAt=0,this.position=0,this.duration=void 0,this.playing=!1,this.mute=!1,this.videoSource=``,this.subtitleSource=``,this.subtitles=!1,this.volume=0,this.title=e,this.device=t,this.ready=!1,this.playbackFinished=!1,this.debounced=w.withDebouncedSetters(this,be),w.withTimestampedSetters(this)}get position(){return this._position+this.getTimerDurationInSeconds()}set position(e){this._position=e,this.restartTimer()}get playing(){return this._playing}set playing(e){this._playing=e,e?this.restartTimer():(this._position+=this.getTimerDurationInSeconds(),this.stopTimer())}restartTimer(){this._timerStartedAt=Date.now()}stopTimer(){this._timerStartedAt=0}getTimerDurationInSeconds(){return this._timerStartedAt?(Date.now()-this._timerStartedAt)/1e3:0}},H=function(e){return e.Update=`update`,e.Volume=`volume`,e.Playing=`playing`,e.Paused=`paused`,e.NewChapter=`new_chapter`,e.Stopped=`stopped`,e.Ready=`ready`,e.Mute=`mute`,e.Finished=`finished`,e.Subtitles=`subtitles`,e}({}),Se=class extends S{constructor(e,t){super(),this.client=e,this.localState=new xe(t.title,t.device),this.bindFunctions(),this.initialize()}bindFunctions(){this.initialize=this.initialize.bind(this),this.dispose=this.dispose.bind(this),this.handleClientConnected=this.handleClientConnected.bind(this),this.handleDisconnectMessage=this.handleDisconnectMessage.bind(this),this.handleAllVideoMessages=this.handleAllVideoMessages.bind(this),this.handleUpdateMessage=this.handleUpdateMessage.bind(this),this.handleVolumeMessage=this.handleVolumeMessage.bind(this),this.handlePlayingMessage=this.handlePlayingMessage.bind(this),this.handlePausedMessage=this.handlePausedMessage.bind(this),this.handleFinishedMessage=this.handleFinishedMessage.bind(this),this.handleNewChapterMessage=this.handleNewChapterMessage.bind(this),this.handleStoppedMessage=this.handleStoppedMessage.bind(this),this.loadSource=this.loadSource.bind(this),this.play=this.play.bind(this),this.pause=this.pause.bind(this),this.seek=this.seek.bind(this),this.setVolume=this.setVolume.bind(this),this.isPlaying=this.isPlaying.bind(this),this.getPosition=this.getPosition.bind(this),this.getDuration=this.getDuration.bind(this),this.getVolume=this.getVolume.bind(this)}initialize(){this.client.on(`dispose`,this.dispose),this.client.on(`connected`,this.handleClientConnected),this.client.on(`message`,this.handleDisconnectMessage).filter(e=>e.source===this.getDevice().id&&e.message.type===`disconnect`),this.client.on(`message`,this.handleAllVideoMessages).filter(e=>e.source===this.getDevice().id&&e.message.type===`video_event`)}dispose(){this.client.off(`dispose`,this.dispose),this.client.off(`connected`,this.handleClientConnected),this.client.off(`message`,this.handleDisconnectMessage),this.client.off(`message`,this.handleAllVideoMessages),this.client.stop(this.getDevice().id).catch(e=>console.error(e)),super.dispose()}async handleClientConnected(){try{await this.client.joinRoom(this.getDevice().id)}catch(e){this.trigger(`error`,e)}}handleDisconnectMessage(){this.dispose()}handleAllVideoMessages(e){let t=this.localState.debounced,n=e.message.payload.params||{};switch(e.message.payload.event){case H.Update:this.handleUpdateMessage(t,n);break;case H.NewChapter:this.handleNewChapterMessage(t,n);break;case H.Volume:this.handleVolumeMessage(t,n);break;case H.Playing:this.handlePlayingMessage(t);break;case H.Paused:this.handlePausedMessage(t);break;case H.Finished:this.handleFinishedMessage(t);break;case H.Stopped:this.handleStoppedMessage();break}}handleUpdateMessage(e,t){e.duration!==t.duration&&(e.duration=t.duration,this.trigger(`durationchange`,C.void)),e.position!==t.position&&(e.position=t.position,this.trigger(`positionchange`,C.void)),e.subtitles!==t.subtitles&&(e.subtitles=t.subtitles,this.trigger(`subtitleschange`,C.void))}handleVolumeMessage(e,t){e.volume!==t.level&&(e.volume=t.level,e.mute=t.level===0,this.trigger(`volumechange`,C.void))}handlePlayingMessage(e){e.playing!==!0&&(e.playing=!0,e.playbackFinished=!1,this.trigger(`playingchange`,C.void))}handlePausedMessage(e){e.playing!==!1&&(e.playing=!1,this.trigger(`playingchange`,C.void))}handleFinishedMessage(e){e.playbackFinished!==!0&&(e.playing=!1,e.playbackFinished=!0,this.trigger(`playingchange`,C.void))}handleNewChapterMessage(e,t){let n=(t.queue??[]).find(t=>t.url===e.videoSource);if(!n){console.info(`The device is no longer playing the source we loaded - disposing the session`),this.dispose();return}e.subtitleSource!==n.suburl&&(e.subtitleSource=n.suburl,this.trigger(`subtitleschange`,C.void))}handleStoppedMessage(){this.dispose()}async loadSource(e,t){if(!(this.localState.videoSource===e&&this.localState.subtitleSource===t))try{let n=this.getDevice().id,r=this.getPosition();this.localState.videoSource=e,this.localState.subtitleSource=t,this.localState.ready=!1,await this.client.joinRoom(n),await this.client.loadQueue({title:this.getTitle(),roomId:n,videoSource:e,subtitleSource:t}),this.localState.ready=!0,this.trigger(`sourceloaded`,C.void),r>0&&this.seek(r),t&&this.setSubtitles(t)}catch(e){console.error(e),this.trigger(`error`,Error(`Could not load video on Vivi device`))}}play(){this.localState.ready&&this.localState.playing!==!0&&(this.localState.playing=!0,this.client.play(this.getDevice().id),this.trigger(`playingchange`,C.void))}pause(){this.localState.ready&&this.localState.playing!==!1&&(this.localState.playing=!1,this.client.pause(this.getDevice().id),this.trigger(`playingchange`,C.void))}seek(e){this.localState.ready&&this.localState.position!==e&&(this.localState.position=e,this.client.seek(this.getDevice().id,e),this.trigger(`positionchange`,C.void))}setVolume(e){this.localState.ready&&this.localState.volume!==e&&(this.localState.volume=e,this.client.setVolume(this.getDevice().id,e),this.trigger(`volumechange`,C.void))}setMuted(e){this.localState.ready&&this.localState.mute!==e&&(this.localState.mute=e,this.client.setMuted(this.getDevice().id,e),this.trigger(`volumechange`,C.void))}async setSubtitles(e){if(!this.localState.ready)return;e&&await this.loadSource(this.localState.videoSource,e);let t=!!e;this.localState.subtitles!==t&&(this.localState.subtitles=t,this.client.setSubtitles(this.getDevice().id,t),this.trigger(`subtitleschange`,C.void))}isPlaying(){return this.localState.playing}isPlaybackFinished(){return this.localState.playbackFinished}getPosition(){return this.localState.position}getDuration(){return this.localState.duration}getVolume(){return this.localState.volume}getMuted(){return this.localState.mute}getSubtitles(){if(this.localState.subtitles)return this.localState.subtitleSource}getDevice(){return this.localState.device}getTitle(){return this.localState.title}},U=1e4,Ce=500,we=1e4,W=class e extends S{constructor(e){super(),this.options=e,this.accessToken=``,this.devices=[],this.devicesFingerprint=``,this.deviceDiscovery=new E,this.bindFunctions(),this.initialize()}bindFunctions(){this.initialize=this.initialize.bind(this),this.sendMessage=this.sendMessage.bind(this),this.sendMessageDebounced=y(this.sendMessage,Ce,!0),this.beginDeviceDiscovery=this.beginDeviceDiscovery.bind(this),this.dispose=this.dispose.bind(this),this.canCastToDevice=this.canCastToDevice.bind(this),this.getDevices=this.getDevices.bind(this),this.startCastSession=this.startCastSession.bind(this),this.authenticateWithVivi=this.authenticateWithVivi.bind(this),this.getRoomList=this.getRoomList.bind(this),this.joinRoom=this.joinRoom.bind(this),this.query=this.query.bind(this),this.loadQueue=this.loadQueue.bind(this),this.play=this.play.bind(this),this.pause=this.pause.bind(this),this.stop=this.stop.bind(this),this.seek=this.seek.bind(this),this.setVolume=this.setVolume.bind(this),this.setMuted=this.setMuted.bind(this),this.setSubtitles=this.setSubtitles.bind(this)}initialize(){this.webSocket=new ye(this.options.url),this.webSocket.onMessage=e=>this.trigger(`message`,JSON.parse(e.data)),this.webSocket.onOpen=async()=>{try{this.accessToken=await this.options.fetchAccessToken(),await this.authenticateWithVivi(),this.beginDeviceDiscovery(),this.trigger(`connected`,C.void)}catch(e){console.error(e),this.trigger(`error`,Error(`Could not connect to Vivi`))}}}sendMessage(e){this.webSocket?.send(JSON.stringify(e))}beginDeviceDiscovery(){this.deviceDiscovery.every(we).schedule(async()=>{try{let t=await this.getRoomList(),n=e.calculateFingerprint(t);if(n===this.devicesFingerprint)return;let r=new Set(t.map(e=>e.organisation??``)).size,i=new Set(t.map(e=>e.location??``)).size;this.devices=t.map(e=>({id:e.id,name:e.name,schoolName:r>1?e.organisation:``,description:i>1?e.location:``,type:D.Vivi,status:T.Available})),this.devicesFingerprint=n,this.trigger(`deviceschange`,C.void)}catch(e){console.warn(e)}}).trigger().start()}dispose(){this.deviceDiscovery.stop(),this.webSocket?.dipose(),super.dispose()}canCastToDevice(e){return e===D.Vivi}getDevices(){return this.devices}startCastSession(e){return new Se(this,e)}async authenticateWithVivi(){this.sendMessage({destination:`relay`,message:{token:this.accessToken,type:`identify_video_api`}}),await this.one(`message`,e=>e.message.type===`video_api_identified`).timeout(U).catch(()=>{throw Error(`Failed to authenticate with Vivi`)})}async getRoomList(){return this.sendMessage({destination:`relay`,message:{type:`video_api_rooms`}}),(await this.one(`message`,e=>e.message.type===`video_api_rooms`).timeout(U).catch(()=>{throw Error(`Failed to fetch rooms`)})).message.rooms||[]}async joinRoom(e){this.sendMessage({destination:`relay`,message:{destination_type:`box`,new_destination:e,token:this.accessToken,type:`connect`}}),await this.one(`message`,t=>{if(t.source===e&&t.message.type===`connect`||t.message.type===`error`&&t.message.error_type===`already_connected`)return!0}).timeout(U).catch(()=>{throw Error(`Failed to join room`)})}async query(t){let n=e.createAckId();return this.sendMessage({destination:t,message:{type:`message_with_ack`,ack_id:n,name:`query`}}),await this.one(`message`,e=>e.message.ack_id===n).timeout(U).catch(()=>{throw Error(`Failed to fetch query`)})}async loadQueue({roomId:t,title:n,videoSource:r,subtitleSource:i}){this.sendMessage({destination:t,message:{type:`message_with_ack`,ack_id:e.createAckId(),name:`queue_load`,payload:{urls:[{title:n,url:r,suburl:i}]}}}),await this.one(`message`,e=>e.source===t&&e.message.payload?.event===`ready`).timeout(U).catch(()=>{throw Error(`Failed to load media`)})}async play(e){this.sendMessage({destination:e,message:{type:`message`,name:`video_play`,payload:{}}}),await this.one(`message`,t=>t.source===e&&t.message.payload?.event===`playing`).timeout(U).catch(()=>{throw Error(`Failed to play video`)})}async pause(e){this.sendMessage({destination:e,message:{type:`message`,name:`video_pause`}}),await this.one(`message`,t=>t.source===e&&t.message.payload?.event===`paused`).timeout(U).catch(()=>{throw Error(`Failed to pause video`)})}async stop(e){this.sendMessage({destination:e,message:{type:`message`,name:`video_stop`}}),await this.one(`message`,t=>t.source===e&&t.message.payload?.event===`stopped`).timeout(U).catch(()=>{throw Error(`Failed to stop video`)})}async seek(e,t){this.sendMessageDebounced({destination:e,message:{type:`message`,name:`video_seek`,payload:{position:t}}})&&await this.one(`message`,t=>t.source===e&&t.message.payload?.event===`playing`).timeout(U).catch(()=>{throw Error(`Failed to seek video`)})}async setVolume(e,t){this.sendMessageDebounced({destination:e,message:{type:`message`,name:`set_volume`,payload:{volume:t}}})&&await this.one(`message`,t=>t.source===e&&t.message.payload?.event===`volume`).timeout(U).catch(()=>{throw Error(`Failed to set volume`)})}async setMuted(e,t){this.sendMessage({destination:e,message:{type:`message`,name:`set_mute`,payload:{mute:t}}}),await this.one(`message`,t=>t.source===e&&t.message.payload?.event===`mute`).timeout(U).catch(()=>{throw Error(`Failed to set mute`)})}async setSubtitles(t,n){let r=e.createAckId();this.sendMessage({destination:t,message:{type:`message_with_ack`,ack_id:r,name:`set_subtitles`,payload:{subtitles:n}}}),await this.one(`message`,e=>e.source===t&&e.message.payload?.event===`subtitles`).timeout(U).catch(()=>{throw Error(`Failed to set subtitles`)})}static createAckId(){return B.generateRandomId()}static calculateFingerprint(e){return e.map(e=>e.id).sort().join(`,`)}},G=class e extends S{constructor(e){super(),this.instanceId=e,this.clients=[],this.bindFunctions()}bindFunctions(){this.addClient=this.addClient.bind(this),this.hasInstanceOfClient=this.hasInstanceOfClient.bind(this),this.startCastSession=this.startCastSession.bind(this),this.gatherAndPublishDevices=this.gatherAndPublishDevices.bind(this),this.dispose=this.dispose.bind(this)}addClient(e){e.on(`deviceschange`,this.gatherAndPublishDevices),e.on(`error`,e=>this.trigger(`error`,e)),this.clients.push(e)}hasInstanceOfClient(e){return this.clients.some(t=>t instanceof e)}startCastSession(e){if(this.castSession)if(this.castSession.getDevice().id!==e.device.id)this.castSession.dispose();else{console.info(`A session with device ${e.device.id} already exists - this is a no-op`);return}let t=this.clients.find(t=>t.canCastToDevice(e.device.type));t&&(this.castSession=t.startCastSession(e),this.castSession.on(`error`,e=>{this.castSession.dispose(),this.trigger(`error`,e)}),this.castSession.on(`dispose`,()=>{this.castSession=void 0,this.trigger(`castsessionchange`,void 0)}),this.trigger(`castsessionchange`,this.castSession))}getCastSession(){return this.castSession}gatherAndPublishDevices(){let e=this.clients.map(e=>e.getDevices()).reduce((e,t)=>[...e,...t],[]);this.trigger(`deviceschange`,e)}dispose(){this.castSession?.dispose(),this.clients.forEach(e=>e.dispose()),this.castSession=void 0,this.clients=[],super.dispose()}static{this.instances={}}static getOrCreateInstance(t){if(!t)throw Error(`instanceId is required`);return this.instances[t]||(this.instances[t]=new e(t)),this.instances[t]}static disposeAndRemoveInstance(e){e.dispose(),delete this.instances[e.instanceId]}static isActive(){return Object.keys(this.instances).length>0}},Te=m.getComponent(`MenuItem`),K=class extends Te{constructor(e,t){super(e,t),this.isVisible=this.isVisible.bind(this)}createEl(){let e={vivi:`cv-vivi-icon`,"apple-tv":`cv-apple-icon`},t=super.createEl(`li`,{className:`vjs-menu-item cv-device-menu-item`}),n=m.dom.createEl(`div`,{className:`cv-device-menu-item-body`,innerHTML:`
|
|
4
4
|
<span class="cv-device-icon ${e[this.options_.type]}"></span>
|
|
@@ -14,4 +14,4 @@ import{o as e}from"./DAXXjFlN.chunk.js";import{x as t}from"./BftnFbcr.chunk.js";
|
|
|
14
14
|
</div>
|
|
15
15
|
<div class="cv-devices-background" style="background-image: url(${this.poster})"></div>
|
|
16
16
|
`;let t=document.createElement(`button`),n=e=>{e.stopPropagation(),this.options_.onStopCasting()};t.onclick=n,t.ontouchstart=n,t.className=`stop-casting-button`,t.innerHTML=this.localize(`Stop casting`),this.el_.querySelector(`.cv-devices-content`).appendChild(t)}play(){}},Fe=m.getComponent(`Tech`),Ie=class extends Fe{constructor(e,t){super(e,t),this.featuresVolumeControl=!0,this.featuresPlaybackRate=!1,this.movingMediaElementInDOM=!1,this.featuresFullscreenResize=!0,this.featuresTimeupdateEvents=!0,this.featuresProgressEvents=!1,this.featuresNativeTextTracks=!1,this.featuresNativeAudioTracks=!1,this.featuresNativeVideoTracks=!1,this.featuresMuteControl=!0,this.featuresSourceset=!1,this.videojsPlayer=m(this.options_.playerId),this.bindFunctions(),this.bindEventListeners(),this.ready(()=>{this.setSource(this.options_.source)}),this.triggerReady()}bindFunctions(){this.bindEventListeners=this.bindEventListeners.bind(this),this.onTextTrackChanged=this.onTextTrackChanged.bind(this),this.getSelectedTextTrack=this.getSelectedTextTrack.bind(this),this.setSelectedTextTrack=this.setSelectedTextTrack.bind(this),this.showUI=this.showUI.bind(this),this.hideUI=this.hideUI.bind(this),this.dispose=this.dispose.bind(this),this.setSource=this.setSource.bind(this),this.getCastSession=this.getCastSession.bind(this)}bindEventListeners(){let e=this.getCastSession();e&&(this.textTracks().on(`change`,this.onTextTrackChanged),this.videojsPlayer.one(`ended`,()=>{e.dispose()}),e.on(`durationchange`,()=>{this.trigger(`durationchange`)}),e.on(`dispose`,()=>{this.trigger(`ended`),this.hideUI()}),e.on(`playingchange`,()=>{e.isPlaying()?(this.trigger(`play`),this.trigger(`playing`)):this.trigger(`pause`)}),e.on(`volumechange`,()=>{this.trigger(`volumechange`)}),e.on(`sourceloaded`,()=>{this.trigger(`loadeddata`)}),e.on(`subtitleschange`,()=>{this.setSelectedTextTrack(e.getSubtitles())}))}onTextTrackChanged(){let e=this.getSelectedTextTrack();this.getCastSession()?.setSubtitles(e?.src)}getSelectedTextTrack(){return p.findTrackByPredicate(this.videojsPlayer.player_,e=>e.mode===`showing`&&!!e.src)}setSelectedTextTrack(e){p.forEachTrack(this.videojsPlayer.player_,t=>{t.kind===`subtitles`&&(t.src===e?t.mode=`showing`:t.mode=`disabled`)})}showUI(e){this.ui&&(this.ui.setPoster(this.options_.poster),this.ui.setDevice(e),this.ui.show())}hideUI(){this.ui?.hide()}dispose(){this.textTracks().off(`change`,this.onTextTrackChanged);let e=this.getCastSession();e&&e.dispose(),super.cleanupAutoTextTracks(),super.dispose()}createEl(){return this.ui=this.ui||new Pe({onStopCasting:()=>{this.getCastSession()?.dispose()}}),this.ui.el()}setSource(e){let t=this.getCastSession();if(!t)return;this.showUI(t.getDevice()),this.trigger(`loadstart`);let n=this.getSelectedTextTrack();t.loadSource(d.getOriginalUrl(e.src),n?.src)}addRemoteTextTrack(e){return super.addRemoteTextTrack(e,!0)}getCastSession(){return G.getOrCreateInstance(this.options_.instanceId??``).getCastSession()}play(){this.getCastSession()?.play()}pause(){this.getCastSession()?.pause()}paused(){return this.getCastSession()?.isPlaying()===!1}ended(){return this.getCastSession()?.isPlaybackFinished()??!1}setCurrentTime(e){this.getCastSession()?.seek(e??0)}currentTime(){return this.getCastSession()?.getPosition()??0}duration(){return this.getCastSession()?.getDuration()??this.videojsPlayer.duration()}volume(){return this.getCastSession()?.getVolume()??1}setVolume(e){this.getCastSession()?.setVolume(e)}muted(){return this.getCastSession()?.getMuted()??!1}setMuted(e){this.getCastSession()?.setMuted(e)}buffered(){}seekable(){return m.createTimeRanges(0,this.duration())}playbackRate(){return 1}readyState(){return 4}controls(){return!1}playsinline(){return!0}supportsFullScreen(){return!0}setAutoplay(){}preload(){}load(){}setPlaybackRate(){}static canPlayType(){return``}static canPlaySource(e,t){return e.type!==`application/dash+xml`&&!!G.getOrCreateInstance(t?.instanceId??``).getCastSession()}static isSupported(){return G.isActive()}};m.registerTech(`devices`,Ie);var Z=m.getPlugin(`plugin`),Le=class extends Z{constructor(e,t){super(e,t),this.options=t,this.instanceId=this.player.options_.devices?.instanceId??``,this.bindFunctions(),this.initialize()}bindFunctions(){this.initialize=this.initialize.bind(this),this.onReady=this.onReady.bind(this),this.onDevicesChanged=this.onDevicesChanged.bind(this),this.onCastSessionChanged=this.onCastSessionChanged.bind(this),this.onDevicesError=this.onDevicesError.bind(this),this.addViviClient=this.addViviClient.bind(this),this.addAppleTvClient=this.addAppleTvClient.bind(this),this.reloadTech=this.reloadTech.bind(this),this.getSessionManager=this.getSessionManager.bind(this),this.dispose=this.dispose.bind(this)}initialize(){this.player.ready(this.onReady)}onReady(){let e=this.player.getChild(`collapserator`),t=this.getSessionManager();if(!e||!t)return;t.on(`deviceschange`,this.onDevicesChanged),t.on(`castsessionchange`,this.onCastSessionChanged),t.on(`error`,this.onDevicesError);let n=()=>{this.addViviClient(t),this.addAppleTvClient(t)},r=(e,n)=>{t.startCastSession({device:n,title:this.options.title}),this.options.analyticsService?.logUserAction(n,{actionType:c.Select,workflowPhase:a.Complete,descriptor:i.ChangeDevice,entity:s.Device,eventVersion:o.V3})},l=this.options.ctaOptions,u=this.options.vivi,d=this.options.appleTv,f=[];d.enabled||f.push(D.AppleTv),(!u.enabled||!u.accountConnected)&&f.push(D.Vivi);let p={onClick:n,onDeviceMenuItemClick:r,ctaOptions:{...l,inactiveIntegrations:f}};this.devicesButton=e.addChild(`DevicesButton`,p)}onDevicesChanged(e){this.devicesButton?.setDevices(e)}onCastSessionChanged(e){this.devicesButton?.setCastSession(e),this.reloadTech(),e?(this.player.addClass(`cv-device-casting`),this.player.addClass(`cv-device-${e.getDevice().type}`),this.player.isFullscreen()&&this.player.exitFullscreen()):(this.player.removeClass(`cv-device-casting`),this.player.removeClass(`cv-device-${D.AppleTv}`),this.player.removeClass(`cv-device-${D.Vivi}`))}onDevicesError(e){this.player.error(e.message),this.player.pause()}addViviClient(e){if(!this.options.vivi.enabled||!this.options.vivi.accountConnected||!this.options.vivi.apiUrl||e.hasInstanceOfClient(W))return;let t=new W({url:this.options.vivi.apiUrl,fetchAccessToken:this.options.vivi.fetchAccessToken});e.addClient(t)}addAppleTvClient(e){if(!this.options.appleTv.enabled||!this.options.trackingCode||!this.options.userId||e.hasInstanceOfClient(O))return;let t=new O({fetchAccessToken:this.options.appleTv.fetchAccessToken,trackingCode:this.options.trackingCode,userId:this.options.userId});e.addClient(t)}reloadTech(){let e=this.player,t=e.currentSources(),n=e.volume(),r=e.muted(),i=e.currentTime(),a=e.paused();e.src(t),e.one(`playing`,()=>{e.volume(n),e.muted(r),e.currentTime(i),a?e.pause():e.play()})}getSessionManager(){if(this.instanceId)return G.getOrCreateInstance(this.instanceId)}dispose(){let e=this.getSessionManager();e&&(e.off(`deviceschange`,this.onDevicesChanged),e.off(`castsessionchange`,this.onCastSessionChanged),e.off(`error`,this.onDevicesError),G.disposeAndRemoveInstance(e),super.dispose())}};m.registerPlugin(`devicesPlugin`,Le);function Re(e){return(0,J.jsx)(`div`,{className:`cv-resource-item`,children:(0,J.jsx)(l,{data:e.resource,imageCdnUrl:e.imageCdnUrl,titlePosition:`above`,hideTypeBadge:!0})})}var ze=h((e,t)=>(0,J.jsx)(Re,{...t})),Be=m.getComponent(`MenuItem`),Ve=class extends Be{constructor(e,t){super(e,t);let n=new ze(e,{resource:t.resource,imageCdnUrl:t.imageCdnUrl});this.addChild(n)}createEl(e,t={},n){return super.createEl(e,{...t,className:`${t.className} cv-resource-menu-item`},n)}handleClick(e){e.stopImmediatePropagation(),this.options_.downloadResource(this.options_.resource)}},He=m.getComponent(`MenuButton`),Q=class extends He{constructor(...e){super(...e),this.alwaysCollapsed=!1,this.isCollapsed=!1,this.isCollabsible=!0}buildWrapperCSSClass(){return`cv-menu-small cv-resources-button-wrapper ${super.buildWrapperCSSClass()}`}buildCSSClass(){return`cv-resources-button ${super.buildCSSClass()}`}update(){super.update()}createItems(){let e=[];return e.push(new _(this.player_,{label:`Resources`})),this.options_.resources.forEach(t=>{let n=new Ve(this.player(),{resource:t,imageCdnUrl:this.options_.imageCdnUrl,downloadResource:e=>this.downloadResource(e),label:t.name});e.push(n)}),e}downloadResource(e){if(e.type===`link`){t.PageLoad(e.url,!0);return}this.getDownloadIframe().src=e.url}getDownloadIframe(){return this.downloadIframe?this.downloadIframe:(this.downloadIframe=m.dom.createEl(`iframe`),this.downloadIframe.style.display=`none`,m.dom.appendContent(m.dom.$(`body`),this.downloadIframe),this.downloadIframe)}getCollabsibleName(){return this.controlText_}getCollabsibleValue(){return``}showInCollabsibleMenu(){return!0}showCollapsibleMenu(){super.handleClick(null)}};Q.prototype.controlText_=`Resources`,m.registerComponent(`ResourcesButton`,Q);var Ue=m.getPlugin(`plugin`),We=class extends Ue{constructor(e,t){super(e,t),this.options=t,e.ready(()=>this.onReady())}onReady(){this.options.resources.length&&this.player.getChild(`collapserator`).addChild(`ResourcesButton`,{resources:this.options.resources,imageCdnUrl:this.options.imageCdnUrl})}};m.registerPlugin(`resourcesPlugin`,We);function $(e){let{className:t=``,playerApi:n,onReady:r,onDispose:i,...a}=e,o=k.useRef(null);return k.useEffect(()=>{if(!o)return;let e=new ve(o.current,{...a,playerApi:n});return r&&e.ready(()=>{r(x(e))}),i&&e.one(`dispose`,i),()=>{e?.dispose()}},[e.viewKey]),(0,J.jsx)(`div`,{ref:o,className:t})}export{$ as ClickViewPlayer,$ as default};
|
|
17
|
-
//# sourceMappingURL=
|
|
17
|
+
//# sourceMappingURL=CAkqvKfy.chunk.js.map
|