UNPKG

@photo-sphere-viewer/video-plugin

Version:
1 lines 47.7 kB
{"version":3,"sources":["src/index.ts","src/components/PlayPauseButton.ts","src/events.ts","src/icons/pause.svg","src/icons/play.svg","src/components/TimeCaption.ts","src/utils.ts","src/components/VolumeButton.ts","src/icons/volume.svg","src/VideoPlugin.ts","src/components/PauseOverlay.ts","src/components/ProgressBar.ts"],"sourcesContent":["import { DEFAULTS, registerButton } from '@photo-sphere-viewer/core';\nimport { PlayPauseButton } from './components/PlayPauseButton';\nimport { TimeCaption } from './components/TimeCaption';\nimport { VolumeButton } from './components/VolumeButton';\nimport * as events from './events';\n\nDEFAULTS.lang[PlayPauseButton.id] = 'Play/Pause';\nDEFAULTS.lang[VolumeButton.id] = 'Volume';\nregisterButton(PlayPauseButton);\nregisterButton(VolumeButton);\nregisterButton(TimeCaption);\nDEFAULTS.navbar.unshift(PlayPauseButton.groupId);\n\nexport { VideoPlugin } from './VideoPlugin';\nexport * from './model';\nexport { events };\n\n/** @internal */\nimport './styles/index.scss';\n","import type { Navbar } from '@photo-sphere-viewer/core';\nimport { AbstractButton } from '@photo-sphere-viewer/core';\nimport { PlayPauseEvent } from '../events';\nimport pauseIcon from '../icons/pause.svg';\nimport playIcon from '../icons/play.svg';\nimport type { VideoPlugin } from '../VideoPlugin';\n\nexport class PlayPauseButton extends AbstractButton {\n static override readonly id = 'videoPlay';\n static override readonly groupId = 'video';\n\n private readonly plugin?: VideoPlugin;\n\n constructor(navbar: Navbar) {\n super(navbar, {\n className: 'psv-video-play-button',\n hoverScale: true,\n collapsable: false,\n tabbable: true,\n icon: playIcon,\n iconActive: pauseIcon,\n });\n\n this.plugin = this.viewer.getPlugin('video');\n\n this.plugin?.addEventListener(PlayPauseEvent.type, this);\n }\n\n override destroy() {\n this.plugin?.removeEventListener(PlayPauseEvent.type, this);\n\n super.destroy();\n }\n\n override isSupported() {\n return !!this.plugin;\n }\n\n handleEvent(e: Event) {\n if (e instanceof PlayPauseEvent) {\n this.toggleActive(e.playing);\n }\n }\n\n onClick() {\n this.plugin.playPause();\n }\n}\n","import { TypedEvent } from '@photo-sphere-viewer/core';\nimport type { VideoPlugin } from './VideoPlugin';\n\n/**\n * @event Triggered when the video starts playing or is paused\n */\nexport class PlayPauseEvent extends TypedEvent<VideoPlugin> {\n static override readonly type = 'play-pause';\n override type: 'play-pause';\n\n /** @internal */\n constructor(public readonly playing: boolean) {\n super(PlayPauseEvent.type);\n }\n}\n\n/**\n * @event Triggered when the video volume changes\n */\nexport class VolumeChangeEvent extends TypedEvent<VideoPlugin> {\n static override readonly type = 'volume-change';\n override type: 'volume-change';\n\n /** @internal */\n constructor(public readonly volume: number) {\n super(VolumeChangeEvent.type);\n }\n}\n\n/**\n * @event Triggered when the video play progression changes\n */\nexport class ProgressEvent extends TypedEvent<VideoPlugin> {\n static override readonly type = 'progress';\n override type: 'progress';\n\n /** @internal */\n constructor(\n public readonly time: number,\n public readonly duration: number,\n public readonly progress: number,\n ) {\n super(ProgressEvent.type);\n }\n}\n\n/**\n * @event Triggered when the video buffer changes\n */\nexport class BufferEvent extends TypedEvent<VideoPlugin> {\n static override readonly type = 'buffer';\n override type: 'buffer';\n\n /** @internal */\n constructor(public readonly maxBuffer: number) {\n super(BufferEvent.type);\n }\n}\n\nexport type VideoPluginEvents =\n | PlayPauseEvent\n | VolumeChangeEvent\n | ProgressEvent\n | BufferEvent;\n","<svg viewBox=\"80 10 540 540\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M80.58 279.67c0-148.76 120.33-269.09 269.09-269.09s269.75 120.33 269.75 269.09-121 269.75-269.75 269.75-269.1-120.99-269.1-269.75zm175.87 105.12V175.2c0-9.26 7.27-15.87 15.86-15.87h39.01c8.6 0 15.87 6.62 15.87 15.87v209.59c0 8.6-7.27 15.87-15.87 15.87h-39c-8.6 0-15.87-7.28-15.87-15.87zm116.36 0V175.2c0-9.26 7.27-15.87 15.86-15.87h38.35c9.26 0 15.87 6.62 15.87 15.87v209.59c0 8.6-6.61 15.87-15.87 15.87h-38.34c-8.6 0-15.87-7.28-15.87-15.87z\" fill-rule=\"evenodd\" fill=\"currentcolor\"/></svg>","<svg viewBox=\"76 5 550 550\" xmlns=\"http://www.w3.org/2000/svg\"><path fill=\"currentcolor\" d=\"M351.1 5.6A274.1 274.1 0 0 0 76.7 280a274.1 274.1 0 0 0 274.4 274.4A274.1 274.1 0 0 0 625.5 280 274.1 274.1 0 0 0 351.1 5.6zm146.7 282.8-219 134.4c-6.6 4-15.6-.6-15.6-8.4V145.6c0-7.8 9-12.9 15.7-8.4l219 134.4a10 10 0 0 1 0 16.8z\"/></svg>","import type { Navbar } from '@photo-sphere-viewer/core';\nimport { AbstractButton, events } from '@photo-sphere-viewer/core';\nimport { ProgressEvent } from '../events';\nimport { formatTime } from '../utils';\nimport type { VideoPlugin } from '../VideoPlugin';\n\nexport class TimeCaption extends AbstractButton {\n static override readonly id = 'videoTime';\n static override readonly groupId = 'video';\n\n private plugin?: VideoPlugin;\n\n private readonly contentElt: HTMLElement;\n\n constructor(navbar: Navbar) {\n super(navbar, {\n className: 'psv-caption psv-video-time',\n hoverScale: false,\n collapsable: false,\n tabbable: false,\n });\n\n this.contentElt = document.createElement('div');\n this.contentElt.className = 'psv-caption-content';\n this.container.appendChild(this.contentElt);\n\n this.plugin = this.viewer.getPlugin('video');\n\n if (this.plugin) {\n this.viewer.addEventListener(events.PanoramaLoadedEvent.type, this);\n this.plugin.addEventListener(ProgressEvent.type, this);\n }\n }\n\n override destroy() {\n if (this.plugin) {\n this.viewer.removeEventListener(events.PanoramaLoadedEvent.type, this);\n this.plugin.removeEventListener(ProgressEvent.type, this);\n }\n\n delete this.plugin;\n\n super.destroy();\n }\n\n handleEvent(e: Event) {\n switch (e.type) {\n case events.PanoramaLoadedEvent.type:\n case ProgressEvent.type: {\n let caption = `<strong>${formatTime(this.plugin.getTime())}</strong>`;\n if (isFinite(this.plugin.getDuration())) {\n caption += ` / ${formatTime(this.plugin.getDuration())}`;\n }\n this.contentElt.innerHTML = caption;\n break;\n }\n }\n }\n\n onClick(): void {\n // nothing\n }\n}\n","export function formatTime(time: number) {\n const seconds = Math.round(time % 60);\n const minutes = Math.round(time - seconds) / 60;\n return `${minutes}:${('0' + seconds).slice(-2)}`;\n}\n","import type { Navbar } from '@photo-sphere-viewer/core';\nimport { AbstractButton, events, utils } from '@photo-sphere-viewer/core';\nimport { PlayPauseEvent, VolumeChangeEvent } from '../events';\nimport volumeIcon from '../icons/volume.svg';\nimport type { VideoPlugin } from '../VideoPlugin';\n\nexport class VolumeButton extends AbstractButton {\n static override readonly id = 'videoVolume';\n static override readonly groupId = 'video';\n\n private readonly plugin?: VideoPlugin;\n\n private readonly rangeContainer: HTMLElement;\n private readonly range: HTMLElement;\n private readonly trackElt: HTMLElement;\n private readonly progressElt: HTMLElement;\n private readonly handleElt: HTMLElement;\n\n private readonly slider: utils.Slider;\n\n constructor(navbar: Navbar) {\n super(navbar, {\n className: 'psv-video-volume-button',\n hoverScale: true,\n collapsable: false,\n tabbable: true,\n icon: volumeIcon,\n });\n\n this.plugin = this.viewer.getPlugin('video');\n\n if (this.plugin) {\n this.rangeContainer = document.createElement('div');\n this.rangeContainer.className = 'psv-video-volume__container';\n this.container.appendChild(this.rangeContainer);\n\n this.range = document.createElement('div');\n this.range.className = 'psv-video-volume__range';\n this.rangeContainer.appendChild(this.range);\n\n this.trackElt = document.createElement('div');\n this.trackElt.className = 'psv-video-volume__track';\n this.range.appendChild(this.trackElt);\n\n this.progressElt = document.createElement('div');\n this.progressElt.className = 'psv-video-volume__progress';\n this.range.appendChild(this.progressElt);\n\n this.handleElt = document.createElement('div');\n this.handleElt.className = 'psv-video-volume__handle';\n this.range.appendChild(this.handleElt);\n\n this.slider = new utils.Slider(\n this.range,\n utils.SliderDirection.VERTICAL,\n this.__onSliderUpdate.bind(this),\n );\n\n this.viewer.addEventListener(events.PanoramaLoadedEvent.type, this);\n this.plugin.addEventListener(PlayPauseEvent.type, this);\n this.plugin.addEventListener(VolumeChangeEvent.type, this);\n\n this.__setVolume(0);\n }\n }\n\n override destroy() {\n if (this.plugin) {\n this.viewer.removeEventListener(events.PanoramaLoadedEvent.type, this);\n this.plugin.removeEventListener(PlayPauseEvent.type, this);\n this.plugin.removeEventListener(VolumeChangeEvent.type, this);\n }\n\n this.slider.destroy();\n\n super.destroy();\n }\n\n override isSupported() {\n return !!this.plugin;\n }\n\n handleEvent(e: Event) {\n switch (e.type) {\n case events.PanoramaLoadedEvent.type:\n case PlayPauseEvent.type:\n case VolumeChangeEvent.type:\n this.__setVolume(this.plugin.getVolume());\n break;\n }\n }\n\n onClick() {\n this.plugin.setMute();\n }\n\n private __onSliderUpdate(data: utils.SliderUpdateData) {\n if (data.mousedown) {\n this.plugin.setVolume(data.value);\n }\n }\n\n private __setVolume(volume: number) {\n let level;\n if (volume === 0) level = 0;\n else if (volume < 0.333) level = 1;\n else if (volume < 0.666) level = 2;\n else level = 3;\n\n utils.toggleClass(this.container, 'psv-video-volume-button--0', level === 0);\n utils.toggleClass(this.container, 'psv-video-volume-button--1', level === 1);\n utils.toggleClass(this.container, 'psv-video-volume-button--2', level === 2);\n utils.toggleClass(this.container, 'psv-video-volume-button--3', level === 3);\n\n this.handleElt.style.bottom = `${volume * 100}%`;\n this.progressElt.style.height = `${volume * 100}%`;\n }\n}\n","<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"17 16 71 71\"><path fill=\"currentColor\" d=\"M20.19 61.66H32.9c.54 0 1.07.16 1.52.47L51.02 73.5a2.7 2.7 0 0 0 4.22-2.23V28.74a2.7 2.7 0 0 0-4.22-2.23L34.43 37.87c-.45.3-.98.47-1.52.47H20.19a2.7 2.7 0 0 0-2.7 2.7v17.92a2.7 2.7 0 0 0 2.7 2.7z\"/><path id=\"lvl0\" fill=\"currentColor\" d=\"M63.802 58.834c.39.39.902.586 1.414.586s1.023-.195 1.414-.586l7.234-7.233 7.234 7.233c.39.39.902.586 1.414.586s1.023-.195 1.414-.586a2 2 0 0 0 0-2.828l-7.234-7.234 7.234-7.233a2 2 0 1 0-2.828-2.828l-7.234 7.233-7.234-7.233a2 2 0 1 0-2.828 2.828l7.234 7.233-7.234 7.234a2 2 0 0 0 0 2.828z\"/><path id=\"lvl1\" fill=\"currentColor\" d=\"M59.573 59.65c.39.394.904.59 1.418.59.51 0 1.02-.194 1.41-.582A13.53 13.53 0 0 0 66.411 50a13.56 13.56 0 0 0-3.996-9.654 2 2 0 0 0-2.828 2.829A9.586 9.586 0 0 1 62.41 50a9.56 9.56 0 0 1-2.83 6.823 2 2 0 0 0-.008 2.828z\"/><path id=\"lvl2\" fill=\"currentColor\" d=\"M72.501 50c0 5.267-2.055 10.227-5.786 13.967a2 2 0 0 0 2.832 2.825C74.03 62.297 76.5 56.333 76.5 50s-2.47-12.297-6.954-16.792a2 2 0 0 0-2.832 2.825c3.731 3.74 5.786 8.7 5.786 13.967z\"/><path id=\"lvl3\" fill=\"currentColor\" d=\"M83.001 50c0 8.084-3.147 15.679-8.863 21.384a2 2 0 0 0 2.826 2.831C83.437 67.754 87 59.155 87 50c0-9.154-3.564-17.753-10.037-24.215a2 2 0 0 0-2.826 2.83C79.854 34.323 83 41.917 83 50z\"/><!--Created by Rudez Studio from the Noun Project--></svg>","import type { AutorotatePlugin } from '@photo-sphere-viewer/autorotate-plugin';\nimport type { AbstractAdapter, PluginConstructor, Position, TextureData, Viewer } from '@photo-sphere-viewer/core';\nimport { AbstractConfigurablePlugin, CONSTANTS, events, PSVError, utils } from '@photo-sphere-viewer/core';\nimport type { MarkersPlugin } from '@photo-sphere-viewer/markers-plugin';\nimport { MathUtils, SplineCurve, Texture, Vector2 } from 'three';\nimport { PauseOverlay } from './components/PauseOverlay';\nimport { ProgressBar } from './components/ProgressBar';\nimport { BufferEvent, PlayPauseEvent, ProgressEvent, VideoPluginEvents, VolumeChangeEvent } from './events';\nimport { VideoKeypoint, VideoPluginConfig } from './model';\n// import { debugCurve } from '../../shared/autorotate-utils';\n\nconst getConfig = utils.getConfigParser<VideoPluginConfig>({\n progressbar: true,\n bigbutton: true,\n keypoints: null,\n});\n\n/**\n * Controls a video adapter\n */\nexport class VideoPlugin extends AbstractConfigurablePlugin<\n VideoPluginConfig,\n VideoPluginConfig,\n never,\n VideoPluginEvents\n> {\n static override readonly id = 'video';\n static override readonly VERSION = PKG_VERSION;\n static override readonly configParser = getConfig;\n static override readonly readonlyOptions = Object.keys(getConfig.defaults);\n\n private readonly state = {\n curve: null as SplineCurve,\n start: null as VideoKeypoint,\n end: null as VideoKeypoint,\n waiting: false,\n keypoints: null as VideoKeypoint[],\n };\n\n private video?: HTMLVideoElement;\n private progressbar?: ProgressBar;\n private overlay?: PauseOverlay;\n\n private autorotate?: AutorotatePlugin;\n private markers?: MarkersPlugin;\n\n static withConfig(config: VideoPluginConfig): [PluginConstructor, any] {\n return [VideoPlugin, config];\n }\n\n constructor(viewer: Viewer, config: VideoPluginConfig) {\n super(viewer, config);\n\n if (!(this.viewer.adapter.constructor as typeof AbstractAdapter).id.includes('video')) {\n throw new PSVError('VideoPlugin can only be used with a video adapter.');\n }\n\n if (this.config.progressbar) {\n this.progressbar = new ProgressBar(this, viewer);\n }\n\n if (this.config.bigbutton) {\n this.overlay = new PauseOverlay(this, viewer);\n }\n }\n\n /**\n * @internal\n */\n override init() {\n super.init();\n\n utils.checkStylesheet(this.viewer.container, 'video-plugin');\n\n this.markers = this.viewer.getPlugin('markers');\n this.autorotate = this.viewer.getPlugin('autorotate');\n\n if (this.autorotate) {\n this.autorotate.config.autostartDelay = 0;\n this.autorotate.config.autostartOnIdle = false;\n }\n\n if (this.config.keypoints) {\n this.setKeypoints(this.config.keypoints);\n delete this.config.keypoints;\n }\n\n this.autorotate?.addEventListener('autorotate', this);\n this.viewer.addEventListener(events.BeforeRenderEvent.type, this);\n this.viewer.addEventListener(events.PanoramaLoadedEvent.type, this);\n this.viewer.addEventListener(events.KeypressEvent.type, this);\n }\n\n /**\n * @internal\n */\n override destroy() {\n this.autorotate?.removeEventListener('autorotate', this);\n this.viewer.removeEventListener(events.BeforeRenderEvent.type, this);\n this.viewer.removeEventListener(events.PanoramaLoadedEvent.type, this);\n this.viewer.removeEventListener(events.KeypressEvent.type, this);\n\n delete this.progressbar;\n delete this.overlay;\n delete this.markers;\n\n super.destroy();\n }\n\n /**\n * @internal\n */\n handleEvent(e: Event) {\n switch (e.type) {\n case events.BeforeRenderEvent.type:\n this.__autorotate();\n break;\n case 'autorotate':\n this.__configureAutorotate();\n break;\n case events.PanoramaLoadedEvent.type:\n this.__bindVideo((e as events.PanoramaLoadedEvent).data);\n this.progressbar?.show();\n break;\n case events.KeypressEvent.type:\n this.__onKeyPress((e as events.KeypressEvent).originalEvent);\n break;\n case 'play':\n if (this.state.waiting) {\n this.viewer.loader.showUndefined();\n }\n this.dispatchEvent(new PlayPauseEvent(true));\n break;\n case 'pause':\n if (this.state.waiting) {\n this.viewer.loader.hide();\n }\n this.dispatchEvent(new PlayPauseEvent(false));\n break;\n case 'progress':\n this.dispatchEvent(new BufferEvent(this.getBufferProgress()));\n break;\n case 'volumechange':\n this.dispatchEvent(new VolumeChangeEvent(this.getVolume()));\n break;\n case 'timeupdate':\n this.dispatchEvent(new ProgressEvent(this.getTime(), this.getDuration(), this.getProgress()));\n break;\n case 'playing':\n this.state.waiting = false;\n this.viewer.loader.hide();\n break;\n case 'waiting':\n this.state.waiting = true;\n this.viewer.loader.showUndefined();\n break;\n }\n }\n\n private __bindVideo(textureData: TextureData) {\n if (this.video) {\n this.video.removeEventListener('play', this);\n this.video.removeEventListener('pause', this);\n this.video.removeEventListener('progress', this);\n this.video.removeEventListener('volumechange', this);\n this.video.removeEventListener('timeupdate', this);\n this.video.removeEventListener('playing', this);\n this.video.removeEventListener('waiting', this);\n }\n\n this.video = (textureData as TextureData<Texture>).texture.image;\n this.state.waiting = false;\n\n this.video.addEventListener('play', this);\n this.video.addEventListener('pause', this);\n this.video.addEventListener('progress', this);\n this.video.addEventListener('volumechange', this);\n this.video.addEventListener('timeupdate', this);\n this.video.addEventListener('playing', this);\n this.video.addEventListener('waiting', this);\n }\n\n private __onKeyPress(e: KeyboardEvent) {\n if (e.key === CONSTANTS.KEY_CODES.Space && !e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey) {\n this.playPause();\n e.preventDefault();\n }\n }\n\n /**\n * Returns the durection of the video\n */\n getDuration(): number {\n return this.video?.duration ?? 0;\n }\n\n /**\n * Returns the current time of the video\n */\n getTime(): number {\n return this.video?.currentTime ?? 0;\n }\n\n /**\n * Returns the play progression of the video\n */\n getProgress(): number {\n return this.video ? this.video.currentTime / this.video.duration : 0;\n }\n\n /**\n * Returns if the video is playing\n */\n isPlaying(): boolean {\n return this.video ? !this.video.paused : false;\n }\n\n /**\n * Returns the video volume\n */\n getVolume(): number {\n return this.video?.muted ? 0 : this.video?.volume ?? 0;\n }\n\n /**\n * Starts or pause the video\n */\n playPause() {\n if (this.video) {\n if (this.video.paused) {\n this.video.play();\n } else {\n this.video.pause();\n }\n }\n }\n\n /**\n * Starts the video if paused\n */\n play() {\n if (this.video?.paused) {\n this.video.play();\n }\n }\n\n /**\n * Pauses the cideo if playing\n */\n pause() {\n if (this.video && !this.video.paused) {\n this.video.pause();\n }\n }\n\n /**\n * Sets the volume of the video\n */\n setVolume(volume: number) {\n if (this.video) {\n this.video.muted = false;\n this.video.volume = MathUtils.clamp(volume, 0, 1);\n }\n }\n\n /**\n * (Un)mutes the video\n * @param [mute] - toggle if undefined\n */\n setMute(mute?: boolean) {\n if (this.video) {\n this.video.muted = mute === undefined ? !this.video.muted : mute;\n if (!this.video.muted && this.video.volume === 0) {\n this.video.volume = 0.1;\n }\n }\n }\n\n /**\n * Changes the current time of the video\n */\n setTime(time: number) {\n if (this.video) {\n this.video.currentTime = time;\n }\n }\n\n /**\n * Changes the progression of the video\n */\n setProgress(progress: number) {\n if (this.video) {\n this.video.currentTime = this.video.duration * progress;\n }\n }\n\n /**\n * @internal\n */\n getBufferProgress() {\n if (this.video) {\n let maxBuffer = 0;\n\n const buffer = this.video.buffered;\n\n for (let i = 0, l = buffer.length; i < l; i++) {\n if (buffer.start(i) <= this.video.currentTime && buffer.end(i) >= this.video.currentTime) {\n maxBuffer = buffer.end(i);\n break;\n }\n }\n\n return Math.max(this.video.currentTime, maxBuffer) / this.video.duration;\n } else {\n return 0;\n }\n }\n\n /**\n * Changes the keypoints\n * @throws {@link PSVError} if the configuration is invalid\n */\n setKeypoints(keypoints?: VideoKeypoint[] | null) {\n if (!this.autorotate) {\n throw new PSVError('Video keypoints required the AutorotatePlugin');\n }\n\n if (!keypoints) {\n this.state.keypoints = null;\n this.__configureAutorotate();\n return;\n }\n\n if (keypoints.length < 2) {\n throw new PSVError('At least two points are required');\n }\n\n this.state.keypoints = utils.clone(keypoints);\n\n if (this.state.keypoints) {\n this.state.keypoints.forEach((pt, i) => {\n if (pt.position) {\n pt.position = this.viewer.dataHelper.cleanPosition(pt.position);\n } else {\n throw new PSVError(`Keypoint #${i} is missing marker or position`);\n }\n\n if (utils.isNil(pt.time)) {\n throw new PSVError(`Keypoint #${i} is missing time`);\n }\n });\n\n this.state.keypoints.sort((a, b) => a.time - b.time);\n }\n\n this.__configureAutorotate();\n }\n\n private __configureAutorotate() {\n delete this.state.curve;\n delete this.state.start;\n delete this.state.end;\n\n if (this.autorotate.isEnabled() && this.state.keypoints) {\n // cancel core rotation\n this.viewer.dynamics.position.stop();\n }\n }\n\n private __autorotate() {\n if (!this.autorotate?.isEnabled() || !this.state.keypoints) {\n return;\n }\n\n const currentTime = this.getTime();\n const autorotate = this.state;\n\n if (!autorotate.curve || currentTime < autorotate.start.time || currentTime >= autorotate.end.time) {\n this.__autorotateNext(currentTime);\n }\n\n if (autorotate.start === autorotate.end) {\n this.viewer.rotate(autorotate.start.position);\n } else {\n const progress = (currentTime - autorotate.start.time) / (autorotate.end.time - autorotate.start.time);\n // only the middle segment contains the current section\n const pt = autorotate.curve.getPoint(1 / 3 + progress / 3);\n\n this.viewer.dynamics.position.goto({ yaw: pt.x, pitch: pt.y });\n }\n }\n\n private __autorotateNext(currentTime: number) {\n let k1 = null;\n let k2 = null;\n\n const keypoints = this.state.keypoints;\n const l = keypoints.length - 1;\n\n if (currentTime < keypoints[0].time) {\n k1 = 0;\n k2 = 0;\n }\n for (let i = 0; i < l; i++) {\n if (currentTime >= keypoints[i].time && currentTime < keypoints[i + 1].time) {\n k1 = i;\n k2 = i + 1;\n break;\n }\n }\n if (currentTime >= keypoints[l].time) {\n k1 = l;\n k2 = l;\n }\n\n // get the 4 points necessary to compute the current movement\n // one point before and two points after the current\n const workPoints: Position[] = [\n keypoints[Math.max(0, k1 - 1)].position as Position,\n keypoints[k1].position as Position,\n keypoints[k2].position as Position,\n keypoints[Math.min(l, k2 + 1)].position as Position,\n ];\n\n // apply offsets to avoid crossing the origin\n const workVectors = [new Vector2(workPoints[0].yaw, workPoints[0].pitch)];\n\n let k = 0;\n for (let i = 1; i <= 3; i++) {\n const d = workPoints[i - 1].yaw - workPoints[i].yaw;\n if (d > Math.PI) {\n // crossed the origin left to right\n k += 1;\n } else if (d < -Math.PI) {\n // crossed the origin right to left\n k -= 1;\n }\n if (k !== 0 && i === 1) {\n // do not modify first point, apply the reverse offset the the previous point instead\n workVectors[0].x -= k * 2 * Math.PI;\n k = 0;\n }\n workVectors.push(new Vector2(workPoints[i].yaw + k * 2 * Math.PI, workPoints[i].pitch));\n }\n\n this.state.curve = new SplineCurve(workVectors);\n this.state.start = keypoints[k1];\n this.state.end = keypoints[k2];\n\n // debugCurve(this.markers, this.autorotate.curve.getPoints(16 * 3).map(p => ([p.x, p.y])), 16);\n }\n}\n","import type { Viewer } from '@photo-sphere-viewer/core';\nimport { AbstractComponent, CONSTANTS, events, utils } from '@photo-sphere-viewer/core';\nimport { PlayPauseEvent } from '../events';\nimport playIcon from '../icons/play.svg';\nimport { VideoPlugin } from '../VideoPlugin';\n\nexport class PauseOverlay extends AbstractComponent {\n private readonly button: HTMLElement;\n\n constructor(\n private readonly plugin: VideoPlugin,\n viewer: Viewer,\n ) {\n super(viewer, {\n className: 'psv-video-overlay',\n });\n\n this.button = document.createElement('button');\n this.button.className = `psv-video-bigbutton ${CONSTANTS.CAPTURE_EVENTS_CLASS}`;\n this.button.innerHTML = playIcon;\n this.container.appendChild(this.button);\n\n this.viewer.addEventListener(events.PanoramaLoadedEvent.type, this);\n this.plugin.addEventListener(PlayPauseEvent.type, this);\n this.button.addEventListener('click', this);\n }\n\n override destroy() {\n this.viewer.removeEventListener(events.PanoramaLoadedEvent.type, this);\n this.plugin.removeEventListener(PlayPauseEvent.type, this);\n\n super.destroy();\n }\n\n handleEvent(e: Event) {\n switch (e.type) {\n case events.PanoramaLoadedEvent.type:\n case PlayPauseEvent.type:\n utils.toggleClass(this.button, 'psv-video-bigbutton--pause', !this.plugin.isPlaying());\n break;\n case 'click':\n this.plugin.playPause();\n break;\n }\n }\n}\n","import type { Viewer } from '@photo-sphere-viewer/core';\nimport { AbstractComponent, events, Tooltip, utils } from '@photo-sphere-viewer/core';\nimport { BufferEvent, ProgressEvent } from '../events';\nimport { formatTime } from '../utils';\nimport type { VideoPlugin } from '../VideoPlugin';\n\nexport class ProgressBar extends AbstractComponent {\n private readonly bufferElt: HTMLElement;\n private readonly progressElt: HTMLElement;\n private readonly handleElt: HTMLElement;\n\n private readonly slider: utils.Slider;\n\n protected override readonly state = {\n visible: true,\n req: null as ReturnType<typeof requestAnimationFrame>,\n tooltip: null as Tooltip,\n };\n\n constructor(\n private readonly plugin: VideoPlugin,\n viewer: Viewer,\n ) {\n super(viewer, {\n className: 'psv-video-progressbar',\n });\n\n this.bufferElt = document.createElement('div');\n this.bufferElt.className = 'psv-video-progressbar__buffer';\n this.container.appendChild(this.bufferElt);\n\n this.progressElt = document.createElement('div');\n this.progressElt.className = 'psv-video-progressbar__progress';\n this.container.appendChild(this.progressElt);\n\n this.handleElt = document.createElement('div');\n this.handleElt.className = 'psv-video-progressbar__handle';\n this.container.appendChild(this.handleElt);\n\n this.slider = new utils.Slider(\n this.container,\n utils.SliderDirection.HORIZONTAL,\n this.__onSliderUpdate.bind(this),\n );\n\n this.viewer.addEventListener(events.PanoramaLoadedEvent.type, this);\n this.plugin.addEventListener(BufferEvent.type, this);\n this.plugin.addEventListener(ProgressEvent.type, this);\n\n this.state.req = window.requestAnimationFrame(() => this.__updateProgress());\n\n this.hide();\n }\n\n override destroy() {\n this.viewer.removeEventListener(events.PanoramaLoadedEvent.type, this);\n this.plugin.removeEventListener(BufferEvent.type, this);\n this.plugin.removeEventListener(ProgressEvent.type, this);\n\n this.slider.destroy();\n this.state.tooltip?.hide();\n window.cancelAnimationFrame(this.state.req);\n\n delete this.state.tooltip;\n\n super.destroy();\n }\n\n /**\n * @internal\n */\n handleEvent(e: Event) {\n switch (e.type) {\n case events.PanoramaLoadedEvent.type:\n case BufferEvent.type:\n case ProgressEvent.type:\n this.bufferElt.style.width = `${this.plugin.getBufferProgress() * 100}%`;\n break;\n }\n }\n\n private __updateProgress() {\n this.progressElt.style.width = `${this.plugin.getProgress() * 100}%`;\n\n this.state.req = window.requestAnimationFrame(() => this.__updateProgress());\n }\n\n private __onSliderUpdate(data: utils.SliderUpdateData) {\n if (data.mouseover) {\n this.handleElt.style.display = 'block';\n this.handleElt.style.left = `${data.value * 100}%`;\n\n const time = formatTime(this.plugin.getDuration() * data.value);\n\n if (!this.state.tooltip) {\n this.state.tooltip = this.viewer.createTooltip({\n top: data.cursor.clientY,\n left: data.cursor.clientX,\n content: time,\n });\n } else {\n this.state.tooltip.update(time, {\n top: data.cursor.clientY,\n left: data.cursor.clientX,\n });\n }\n } else {\n this.handleElt.style.display = 'none';\n\n this.state.tooltip?.hide();\n delete this.state.tooltip;\n }\n if (data.click) {\n this.plugin.setProgress(data.value);\n }\n }\n}\n"],"mappings":"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","names":["import_core","import_core","import_core","import_core","import_core","import_core","import_core"]}