@kodezen/player 1.0.1 → 1.0.3
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/README.md +21 -1
- package/dist/index.cjs +200 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +17 -3
- package/dist/index.d.ts +17 -3
- package/dist/index.js +200 -9
- package/dist/index.js.map +1 -1
- package/dist/react/index.cjs +204 -11
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +2 -2
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.js +204 -11
- package/dist/react/index.js.map +1 -1
- package/dist/styles.css +72 -0
- package/dist/{types-TFltFgey.d.cts → types-30yBj4ll.d.cts} +20 -1
- package/dist/{types-TFltFgey.d.ts → types-30yBj4ll.d.ts} +20 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/emitter.ts","../src/providers/html5.ts","../src/providers/youtube.ts","../src/providers/vimeo.ts","../src/providers/index.ts","../src/core/Controls.ts","../src/core/Player.ts","../src/index.ts"],"names":["apiPromise","loadApi"],"mappings":"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","file":"index.js","sourcesContent":["/** Minimal typed event emitter shared by the player core and providers. */\nexport class Emitter<Events extends Record<keyof Events, (...args: never[]) => void>> {\n private listeners = new Map<keyof Events, Set<(...args: never[]) => void>>();\n\n on<K extends keyof Events>(name: K, cb: Events[K]): () => void {\n let set = this.listeners.get(name);\n if (!set) {\n set = new Set();\n this.listeners.set(name, set);\n }\n set.add(cb as (...args: never[]) => void);\n return () => this.off(name, cb);\n }\n\n off<K extends keyof Events>(name: K, cb: Events[K]): void {\n this.listeners.get(name)?.delete(cb as (...args: never[]) => void);\n }\n\n emit<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): void {\n // Copy to a static array so a listener removing itself mid-dispatch is safe.\n const set = this.listeners.get(name);\n if (!set) return;\n for (const cb of [...set]) (cb as (...a: Parameters<Events[K]>) => void)(...args);\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import { Emitter } from '../emitter';\nimport type { Provider, ProviderCapabilities, ProviderEvents, Source } from '../types';\n\nconst HLS_EXTENSION = /\\.m3u8($|\\?)/i;\nconst HLS_MIME = /mpegurl/i;\n\nfunction isHls(source: Source): boolean {\n return HLS_MIME.test(source.mime ?? '') || HLS_EXTENSION.test(source.url ?? '');\n}\n\n/**\n * HTML5 provider — self-hosted / external mp4 & webm, and HLS (`.m3u8`, e.g.\n * Mux) via a native <video>. There's no distinct \"Mux provider\": Mux is\n * plain HLS streaming, so it's just this provider picking `hls.js` for\n * browsers without native HLS (Safari has it built in; others don't).\n */\nexport class Html5Provider implements Provider {\n readonly capabilities: ProviderCapabilities = { seekable: true, rate: true, volume: true };\n\n private emitter = new Emitter<ProviderEvents>();\n private video: HTMLVideoElement;\n private disposers: Array<() => void> = [];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private hls: any = null;\n\n constructor(private source: Source) {\n this.video = document.createElement('video');\n this.video.className = 'kzp-media';\n this.video.playsInline = true;\n this.video.preload = 'metadata';\n this.video.controls = false;\n if (source.poster) this.video.poster = source.poster;\n }\n\n async mount(container: HTMLElement): Promise<void> {\n const src = this.source.url ?? '';\n container.appendChild(this.video);\n\n const on = (name: string, handler: EventListener) => {\n this.video.addEventListener(name, handler);\n this.disposers.push(() => this.video.removeEventListener(name, handler));\n };\n\n on('loadedmetadata', () => {\n this.emitter.emit('durationchange', this.getDuration());\n this.emitter.emit('ready');\n });\n on('durationchange', () => this.emitter.emit('durationchange', this.getDuration()));\n on('timeupdate', () => this.emitter.emit('timeupdate', this.video.currentTime));\n on('play', () => this.emitter.emit('play'));\n on('pause', () => this.emitter.emit('pause'));\n on('ended', () => this.emitter.emit('ended'));\n\n if (isHls(this.source) && !this.video.canPlayType('application/vnd.apple.mpegurl')) {\n on('error', () => this.emitter.emit('error', 'Media failed to load.'));\n // Safari plays HLS natively; every other browser needs hls.js. Loaded\n // lazily so mp4/webm playback never pays for a library it doesn't use.\n const { default: Hls } = await import('hls.js');\n if (!Hls.isSupported()) {\n this.emitter.emit('error', 'HLS playback is not supported in this browser.');\n return;\n }\n this.hls = new Hls();\n this.hls.on(Hls.Events.ERROR, (_event: unknown, data: { fatal: boolean }) => {\n if (data.fatal) this.emitter.emit('error', 'Media failed to load.');\n });\n this.hls.loadSource(src);\n this.hls.attachMedia(this.video);\n } else {\n const el = document.createElement('source');\n el.src = src;\n el.type = this.source.mime ?? (isHls(this.source) ? 'application/vnd.apple.mpegurl' : 'video/mp4');\n this.video.appendChild(el);\n on('error', () => this.emitter.emit('error', 'Media failed to load.'));\n }\n\n // Some browsers fire loadedmetadata before listeners attach on cached media.\n if (this.video.readyState >= 1) {\n this.emitter.emit('durationchange', this.getDuration());\n this.emitter.emit('ready');\n }\n }\n\n play(): void {\n void this.video.play().catch(() => {\n /* autoplay/gesture rejection is not fatal — surfaced via the play button. */\n });\n }\n\n pause(): void {\n this.video.pause();\n }\n\n seek(seconds: number): void {\n const d = this.getDuration();\n this.video.currentTime = d > 0 ? Math.min(seconds, d) : Math.max(0, seconds);\n }\n\n getCurrentTime(): number {\n return this.video.currentTime || 0;\n }\n\n getDuration(): number {\n return Number.isFinite(this.video.duration) ? this.video.duration : 0;\n }\n\n setVolume(v: number): void {\n this.video.volume = Math.min(1, Math.max(0, v));\n }\n\n getVolume(): number {\n return this.video.volume;\n }\n\n setMuted(m: boolean): void {\n this.video.muted = m;\n }\n\n isMuted(): boolean {\n return this.video.muted;\n }\n\n setRate(r: number): void {\n this.video.playbackRate = r;\n }\n\n getRate(): number {\n return this.video.playbackRate;\n }\n\n isPlaying(): boolean {\n return !this.video.paused && !this.video.ended;\n }\n\n on<K extends keyof ProviderEvents>(event: K, cb: ProviderEvents[K]): () => void {\n return this.emitter.on(event, cb);\n }\n\n destroy(): void {\n for (const dispose of this.disposers) dispose();\n this.disposers = [];\n this.emitter.clear();\n this.hls?.destroy();\n this.hls = null;\n this.video.removeAttribute('src');\n this.video.load();\n this.video.remove();\n }\n}\n","import { Emitter } from '../emitter';\nimport type { Provider, ProviderCapabilities, ProviderEvents, Source } from '../types';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ndeclare global {\n interface Window {\n YT?: any;\n onYouTubeIframeAPIReady?: () => void;\n }\n}\n\nlet apiPromise: Promise<any> | null = null;\n\n/** Lazy-load the YouTube IFrame API once, chaining any existing global callback. */\nfunction loadApi(): Promise<any> {\n if (typeof window === 'undefined') return Promise.reject(new Error('no window'));\n if (window.YT && window.YT.Player) return Promise.resolve(window.YT);\n if (apiPromise) return apiPromise;\n apiPromise = new Promise((resolve) => {\n const prev = window.onYouTubeIframeAPIReady;\n window.onYouTubeIframeAPIReady = () => {\n prev?.();\n resolve(window.YT);\n };\n const tag = document.createElement('script');\n tag.src = 'https://www.youtube.com/iframe_api';\n document.head.appendChild(tag);\n });\n return apiPromise;\n}\n\nfunction parseId(source: Source): string {\n if (source.id) return source.id;\n const url = source.url ?? '';\n const m = url.match(/(?:youtu\\.be\\/|[?&]v=|\\/embed\\/|\\/shorts\\/)([\\w-]{11})/);\n return m?.[1] ?? url;\n}\n\n/** YouTube provider — drives an IFrame API player behind our own control bar. */\nexport class YouTubeProvider implements Provider {\n readonly capabilities: ProviderCapabilities = { seekable: true, rate: true, volume: true };\n\n private emitter = new Emitter<ProviderEvents>();\n private yt: any = null;\n private host?: HTMLElement;\n private current = 0;\n private duration = 0;\n private rate = 1;\n private muted = false;\n private volume = 1;\n private playing = false;\n private ticker: number | null = null;\n\n constructor(private source: Source) {}\n\n async mount(container: HTMLElement): Promise<void> {\n const host = document.createElement('div');\n host.className = 'kzp-media kzp-embed';\n container.appendChild(host);\n this.host = host;\n\n const YT = await loadApi();\n this.yt = new YT.Player(host, {\n videoId: parseId(this.source),\n playerVars: {\n controls: 0,\n modestbranding: 1,\n rel: 0,\n playsinline: 1,\n disablekb: 1,\n iv_load_policy: 3,\n },\n events: {\n onReady: () => {\n this.duration = this.yt.getDuration() || 0;\n this.volume = (this.yt.getVolume?.() ?? 100) / 100;\n this.emitter.emit('durationchange', this.duration);\n this.emitter.emit('ready');\n },\n onStateChange: (e: any) => {\n const S = YT.PlayerState;\n if (e.data === S.PLAYING) {\n this.playing = true;\n this.duration = this.yt.getDuration() || this.duration;\n this.emitter.emit('durationchange', this.duration);\n this.emitter.emit('play');\n this.startTicker();\n } else if (e.data === S.PAUSED) {\n this.playing = false;\n this.emitter.emit('pause');\n this.stopTicker();\n } else if (e.data === S.ENDED) {\n this.playing = false;\n this.emitter.emit('ended');\n this.stopTicker();\n }\n },\n onError: () => this.emitter.emit('error', 'YouTube playback error.'),\n },\n });\n }\n\n private startTicker(): void {\n this.stopTicker();\n this.ticker = window.setInterval(() => {\n if (!this.yt) return;\n this.current = this.yt.getCurrentTime() || 0;\n this.emitter.emit('timeupdate', this.current);\n }, 250);\n }\n\n private stopTicker(): void {\n if (this.ticker !== null) {\n clearInterval(this.ticker);\n this.ticker = null;\n }\n }\n\n play(): void {\n this.yt?.playVideo?.();\n }\n\n pause(): void {\n this.yt?.pauseVideo?.();\n }\n\n seek(seconds: number): void {\n const s = Math.max(0, seconds);\n this.yt?.seekTo?.(s, true);\n this.current = s;\n }\n\n getCurrentTime(): number {\n return this.current;\n }\n\n getDuration(): number {\n return this.duration;\n }\n\n setVolume(v: number): void {\n this.volume = Math.min(1, Math.max(0, v));\n this.yt?.setVolume?.(this.volume * 100);\n }\n\n getVolume(): number {\n return this.volume;\n }\n\n setMuted(m: boolean): void {\n this.muted = m;\n if (m) this.yt?.mute?.();\n else this.yt?.unMute?.();\n }\n\n isMuted(): boolean {\n return this.muted;\n }\n\n setRate(r: number): void {\n this.rate = r;\n this.yt?.setPlaybackRate?.(r);\n }\n\n getRate(): number {\n return this.rate;\n }\n\n isPlaying(): boolean {\n return this.playing;\n }\n\n on<K extends keyof ProviderEvents>(event: K, cb: ProviderEvents[K]): () => void {\n return this.emitter.on(event, cb);\n }\n\n destroy(): void {\n this.stopTicker();\n this.emitter.clear();\n this.yt?.destroy?.();\n this.host?.remove();\n }\n}\n","import { Emitter } from '../emitter';\nimport type { Provider, ProviderCapabilities, ProviderEvents, Source } from '../types';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ndeclare global {\n interface Window {\n Vimeo?: any;\n }\n}\n\nlet apiPromise: Promise<any> | null = null;\n\n/** Lazy-load the Vimeo Player API once. */\nfunction loadApi(): Promise<any> {\n if (typeof window === 'undefined') return Promise.reject(new Error('no window'));\n if (window.Vimeo && window.Vimeo.Player) return Promise.resolve(window.Vimeo);\n if (apiPromise) return apiPromise;\n apiPromise = new Promise((resolve, reject) => {\n const tag = document.createElement('script');\n tag.src = 'https://player.vimeo.com/api/player.js';\n tag.onload = () => resolve(window.Vimeo);\n tag.onerror = () => reject(new Error('Vimeo API failed to load'));\n document.head.appendChild(tag);\n });\n return apiPromise;\n}\n\nfunction parseSource(source: Source): { id?: number; url?: string } {\n if (source.id) return { id: Number(source.id) };\n const url = source.url ?? '';\n const m = url.match(/vimeo\\.com\\/(?:video\\/)?(\\d+)/);\n if (m?.[1]) return { id: Number(m[1]) };\n return { url };\n}\n\n/**\n * Vimeo provider. The Vimeo SDK is promise-based, so getCurrentTime/getDuration\n * return values cached from timeupdate/ready events (the Provider getters are sync).\n */\nexport class VimeoProvider implements Provider {\n readonly capabilities: ProviderCapabilities = { seekable: true, rate: true, volume: true };\n\n private emitter = new Emitter<ProviderEvents>();\n private player: any = null;\n private host?: HTMLElement;\n private current = 0;\n private duration = 0;\n private rate = 1;\n private muted = false;\n private volume = 1;\n private playing = false;\n\n constructor(private source: Source) {}\n\n async mount(container: HTMLElement): Promise<void> {\n const host = document.createElement('div');\n host.className = 'kzp-media kzp-embed';\n container.appendChild(host);\n this.host = host;\n\n const Vimeo = await loadApi();\n const opts: any = { controls: false, responsive: false, ...parseSource(this.source) };\n this.player = new Vimeo.Player(host, opts);\n\n this.player.on('timeupdate', (d: any) => {\n this.current = d.seconds ?? this.current;\n if (d.duration) this.duration = d.duration;\n this.emitter.emit('timeupdate', this.current);\n });\n this.player.on('play', () => {\n this.playing = true;\n this.emitter.emit('play');\n });\n this.player.on('pause', () => {\n this.playing = false;\n this.emitter.emit('pause');\n });\n this.player.on('ended', () => {\n this.playing = false;\n this.emitter.emit('ended');\n });\n this.player.on('error', () => this.emitter.emit('error', 'Vimeo playback error.'));\n\n try {\n this.duration = (await this.player.getDuration()) || 0;\n this.emitter.emit('durationchange', this.duration);\n } catch {\n /* duration resolves later via timeupdate */\n }\n this.emitter.emit('ready');\n }\n\n play(): void {\n void this.player?.play?.();\n }\n\n pause(): void {\n void this.player?.pause?.();\n }\n\n seek(seconds: number): void {\n this.current = Math.max(0, seconds);\n void this.player?.setCurrentTime?.(this.current);\n }\n\n getCurrentTime(): number {\n return this.current;\n }\n\n getDuration(): number {\n return this.duration;\n }\n\n setVolume(v: number): void {\n this.volume = Math.min(1, Math.max(0, v));\n void this.player?.setVolume?.(this.volume);\n }\n\n getVolume(): number {\n return this.volume;\n }\n\n setMuted(m: boolean): void {\n this.muted = m;\n void this.player?.setVolume?.(m ? 0 : this.volume);\n }\n\n isMuted(): boolean {\n return this.muted;\n }\n\n setRate(r: number): void {\n this.rate = r;\n void this.player?.setPlaybackRate?.(r);\n }\n\n getRate(): number {\n return this.rate;\n }\n\n isPlaying(): boolean {\n return this.playing;\n }\n\n on<K extends keyof ProviderEvents>(event: K, cb: ProviderEvents[K]): () => void {\n return this.emitter.on(event, cb);\n }\n\n destroy(): void {\n this.emitter.clear();\n void this.player?.destroy?.();\n this.host?.remove();\n }\n}\n","import type { Provider, Source } from '../types';\nimport { Html5Provider } from './html5';\nimport { YouTubeProvider } from './youtube';\nimport { VimeoProvider } from './vimeo';\n\n/**\n * Resolve a Source to a concrete provider. Every provider implements the same\n * Provider interface, so the player core is agnostic to which one is chosen.\n */\nexport function createProvider(source: Source): Provider {\n switch (source.type) {\n case 'html5':\n case 'external':\n return new Html5Provider(source);\n case 'youtube':\n return new YouTubeProvider(source);\n case 'vimeo':\n return new VimeoProvider(source);\n default:\n throw new Error(`[kodezen-player] Unknown source type \"${String(source.type)}\".`);\n }\n}\n","import type { ControlsConfig, PlayerState } from '../types';\n\nconst ICONS = {\n play: '<path d=\"M8 5v14l11-7z\"/>',\n pause: '<path d=\"M6 5h4v14H6zM14 5h4v14h-4z\"/>',\n volume: '<path d=\"M3 10v4h4l5 5V5L7 10H3zm13.5 2a4.5 4.5 0 0 0-2.5-4v8a4.5 4.5 0 0 0 2.5-4z\"/>',\n muted: '<path d=\"M3 10v4h4l5 5V5L7 10H3zm13 2 3 3 1-1-3-3 3-3-1-1-3 3-3-3-1 1 3 3-3 3 1 1z\"/>',\n full: '<path d=\"M4 4h6v2H6v4H4V4zm10 0h6v6h-2V6h-4V4zM4 14h2v4h4v2H4v-6zm14 0h2v6h-6v-2h4v-4z\"/>',\n} as const;\n\nfunction icon(paths: string): string {\n return `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">${paths}</svg>`;\n}\n\nfunction fmt(sec: number): string {\n if (!Number.isFinite(sec) || sec < 0) sec = 0;\n const s = Math.floor(sec % 60);\n const m = Math.floor((sec / 60) % 60);\n const h = Math.floor(sec / 3600);\n const mm = h > 0 ? String(m).padStart(2, '0') : String(m);\n const ss = String(s).padStart(2, '0');\n return h > 0 ? `${h}:${mm}:${ss}` : `${mm}:${ss}`;\n}\n\nexport interface ControlsCallbacks {\n onToggle(): void;\n /** Requested seek (seconds). The player clamps this when lockSeek is on. */\n onSeek(seconds: number): void;\n onVolume(v: number): void;\n onMuteToggle(): void;\n onRate(rate: number): void;\n onFullscreen(): void;\n}\n\nconst DEFAULT_CONFIG: ControlsConfig = {\n playPause: true,\n seek: true,\n time: true,\n volume: true,\n speed: true,\n fullscreen: true,\n};\n\n/** Vanilla DOM control bar. Framework-agnostic; the player drives it via update(). */\nexport class Controls {\n readonly el: HTMLElement;\n private config: ControlsConfig;\n\n private playBtn?: HTMLButtonElement;\n private scrubber?: HTMLInputElement;\n private timeEl?: HTMLElement;\n private volBtn?: HTMLButtonElement;\n private volRange?: HTMLInputElement;\n private speedBtn?: HTMLButtonElement;\n private speedMenu?: HTMLElement;\n\n private scrubbing = false;\n private lockSeek: boolean;\n private seekableMax = Infinity;\n\n constructor(\n private cb: ControlsCallbacks,\n opts: { config?: Partial<ControlsConfig>; speeds: number[]; lockSeek: boolean },\n ) {\n this.config = { ...DEFAULT_CONFIG, ...opts.config };\n this.lockSeek = opts.lockSeek;\n this.el = document.createElement('div');\n this.el.className = 'kzp-controls';\n this.build(opts.speeds);\n }\n\n private build(speeds: number[]): void {\n if (this.config.playPause) {\n this.playBtn = this.button('kzp-play', 'Play', ICONS.play);\n this.playBtn.addEventListener('click', () => this.cb.onToggle());\n this.el.appendChild(this.playBtn);\n }\n\n if (this.config.seek) {\n this.scrubber = document.createElement('input');\n this.scrubber.type = 'range';\n this.scrubber.className = 'kzp-scrubber';\n this.scrubber.min = '0';\n this.scrubber.max = '0';\n this.scrubber.step = '0.1';\n this.scrubber.value = '0';\n this.scrubber.setAttribute('aria-label', 'Seek');\n const commit = () => this.cb.onSeek(this.clamp(Number(this.scrubber!.value)));\n // Seek-lock blocks the drag/click at its source (pointerdown/keydown)\n // rather than via the `disabled` attribute or `pointer-events`, so the\n // scrubber keeps its normal look *and* its own `cursor` still applies —\n // both are lost once an element stops receiving pointer events at all.\n this.scrubber.addEventListener('pointerdown', (e) => {\n if (this.lockSeek) {\n e.preventDefault();\n return;\n }\n this.scrubbing = true;\n });\n this.scrubber.addEventListener('keydown', (e) => {\n if (this.lockSeek) e.preventDefault();\n });\n this.scrubber.addEventListener('input', commit);\n this.scrubber.addEventListener('change', () => {\n commit();\n this.scrubbing = false;\n });\n this.el.appendChild(this.scrubber);\n }\n\n if (this.config.time) {\n this.timeEl = document.createElement('span');\n this.timeEl.className = 'kzp-time';\n this.timeEl.textContent = '0:00 / 0:00';\n this.el.appendChild(this.timeEl);\n }\n\n if (this.config.volume) {\n const wrap = document.createElement('div');\n wrap.className = 'kzp-volume';\n this.volBtn = this.button('kzp-mute', 'Mute', ICONS.volume);\n this.volBtn.addEventListener('click', () => this.cb.onMuteToggle());\n this.volRange = document.createElement('input');\n this.volRange.type = 'range';\n this.volRange.className = 'kzp-vol-range';\n this.volRange.min = '0';\n this.volRange.max = '1';\n this.volRange.step = '0.05';\n this.volRange.value = '1';\n this.volRange.setAttribute('aria-label', 'Volume');\n this.volRange.addEventListener('input', () => this.cb.onVolume(Number(this.volRange!.value)));\n wrap.append(this.volBtn, this.volRange);\n this.el.appendChild(wrap);\n }\n\n if (this.config.speed && speeds.length > 1) {\n const wrap = document.createElement('div');\n wrap.className = 'kzp-speed';\n this.speedBtn = this.button('kzp-speed-btn', 'Playback speed', '');\n this.speedBtn.textContent = '1x';\n this.speedMenu = document.createElement('div');\n this.speedMenu.className = 'kzp-speed-menu';\n this.speedMenu.hidden = true;\n for (const rate of speeds) {\n const item = document.createElement('button');\n item.type = 'button';\n item.textContent = `${rate}x`;\n item.dataset.rate = String(rate);\n item.addEventListener('click', () => {\n this.cb.onRate(rate);\n this.speedMenu!.hidden = true;\n });\n this.speedMenu.appendChild(item);\n }\n this.speedBtn.addEventListener('click', () => {\n this.speedMenu!.hidden = !this.speedMenu!.hidden;\n });\n wrap.append(this.speedBtn, this.speedMenu);\n this.el.appendChild(wrap);\n }\n\n if (this.config.fullscreen) {\n const btn = this.button('kzp-full', 'Fullscreen', ICONS.full);\n btn.addEventListener('click', () => this.cb.onFullscreen());\n this.el.appendChild(btn);\n }\n }\n\n private button(cls: string, label: string, svg: string): HTMLButtonElement {\n const b = document.createElement('button');\n b.type = 'button';\n b.className = cls;\n b.setAttribute('aria-label', label);\n if (svg) b.innerHTML = icon(svg);\n return b;\n }\n\n private clamp(value: number): number {\n return this.lockSeek ? Math.min(value, this.seekableMax) : value;\n }\n\n setLockSeek(locked: boolean): void {\n this.lockSeek = locked;\n }\n\n /** Push the latest state into the DOM. Called on every player timeupdate. */\n update(state: PlayerState, extras: { muted: boolean; volume: number; rate: number }): void {\n if (this.playBtn) {\n this.playBtn.innerHTML = icon(state.playing ? ICONS.pause : ICONS.play);\n this.playBtn.setAttribute('aria-label', state.playing ? 'Pause' : 'Play');\n }\n if (this.scrubber) {\n this.seekableMax = this.lockSeek ? state.furthest : Infinity;\n this.scrubber.max = String(state.duration || 0);\n if (!this.scrubbing) this.scrubber.value = String(state.current);\n }\n if (this.timeEl) {\n this.timeEl.textContent = `${fmt(state.current)} / ${fmt(state.duration)}`;\n }\n if (this.volBtn) {\n this.volBtn.innerHTML = icon(extras.muted || extras.volume === 0 ? ICONS.muted : ICONS.volume);\n }\n if (this.volRange && document.activeElement !== this.volRange) {\n this.volRange.value = String(extras.muted ? 0 : extras.volume);\n }\n if (this.speedBtn) this.speedBtn.textContent = `${extras.rate}x`;\n }\n\n destroy(): void {\n this.el.remove();\n }\n}\n","import { Emitter } from '../emitter';\nimport { createProvider } from '../providers';\nimport type {\n KodezenPlayerInstance,\n PlayerEvents,\n PlayerOptions,\n PlayerState,\n Provider,\n} from '../types';\nimport { Controls } from './Controls';\n\nconst DEFAULT_SPEEDS = [0.5, 1, 1.25, 1.5, 2];\n/** A forward jump larger than this (seconds) between ticks is treated as a seek, not playback. */\nconst NATURAL_ADVANCE_MAX = 2;\n\nexport class Player implements KodezenPlayerInstance {\n private emitter = new Emitter<PlayerEvents>();\n private provider: Provider;\n private controls: Controls;\n private root: HTMLElement;\n private stage: HTMLElement;\n\n private furthest = 0;\n private lastTick = 0;\n private duration = 0;\n private playing = false;\n private ready = false;\n private disposers: Array<() => void> = [];\n\n constructor(private container: HTMLElement, private options: PlayerOptions) {\n const speeds = options.speeds ?? DEFAULT_SPEEDS;\n\n this.root = document.createElement('div');\n this.root.className = 'kzp' + (options.className ? ` ${options.className}` : '');\n if (options.lockSeek) this.root.classList.add('kzp--locked');\n\n this.stage = document.createElement('div');\n this.stage.className = 'kzp-stage';\n this.root.appendChild(this.stage);\n\n // YouTube/Vimeo's own iframe chrome (title bar, related-video card, its\n // own control bar) still appears on hover even with their controls\n // disabled — it renders *inside* the stage, so our own control bar can't\n // cover it. This transparent layer sits on top of the embed instead, so\n // the mouse never actually reaches it, and forwards a plain click to the\n // same play/pause toggle the embed itself would otherwise handle.\n const hitLayer = document.createElement('div');\n hitLayer.className = 'kzp-hit-layer';\n hitLayer.addEventListener('click', () => this.toggle());\n this.stage.appendChild(hitLayer);\n\n // Built before Controls so a provider that can't seek/rate-change/volume\n // (e.g. a live stream) hides those controls from the start, instead of\n // rendering them non-functional.\n this.provider = createProvider(options.source);\n const caps = this.provider.capabilities;\n\n this.controls = new Controls(\n {\n onToggle: () => this.toggle(),\n onSeek: (s) => this.seek(s),\n onVolume: (v) => {\n this.provider.setMuted(false);\n this.provider.setVolume(v);\n this.render();\n },\n onMuteToggle: () => {\n this.provider.setMuted(!this.provider.isMuted());\n this.render();\n },\n onRate: (r) => {\n this.provider.setRate(r);\n this.render();\n },\n onFullscreen: () => this.toggleFullscreen(),\n },\n {\n config: {\n ...options.controls,\n seek: (options.controls?.seek ?? true) && caps.seekable,\n speed: (options.controls?.speed ?? true) && caps.rate,\n volume: (options.controls?.volume ?? true) && caps.volume,\n },\n speeds,\n lockSeek: !!options.lockSeek,\n },\n );\n this.root.appendChild(this.controls.el);\n this.container.appendChild(this.root);\n\n this.wireProvider();\n void this.provider.mount(this.stage);\n }\n\n private wireProvider(): void {\n const p = this.provider;\n this.disposers.push(\n p.on('ready', () => this.onReady()),\n p.on('durationchange', (d) => {\n this.duration = d;\n this.emitter.emit('durationchange', d);\n this.render();\n }),\n p.on('timeupdate', (current) => this.onTimeUpdate(current)),\n p.on('play', () => {\n this.playing = true;\n this.emitter.emit('play');\n this.render();\n }),\n p.on('pause', () => {\n this.playing = false;\n this.emitter.emit('pause');\n this.render();\n }),\n p.on('ended', () => {\n this.playing = false;\n this.emitter.emit('ended');\n this.render();\n }),\n p.on('error', (msg) => this.emitter.emit('error', msg)),\n );\n }\n\n private onReady(): void {\n if (this.ready) return;\n this.ready = true;\n this.duration = this.provider.getDuration();\n\n if (this.options.muted) this.provider.setMuted(true);\n\n const resume = this.options.resumeAt ?? 0;\n if (resume > 0 && (this.duration === 0 || resume < this.duration - 2)) {\n this.provider.seek(resume);\n this.furthest = resume;\n this.lastTick = resume;\n }\n\n this.emitter.emit('ready', { duration: this.duration });\n if (this.options.autoplay) this.provider.play();\n this.render();\n }\n\n private onTimeUpdate(current: number): void {\n // Grow furthest only on natural forward advance so a seek can't inflate it.\n const advance = current - this.lastTick;\n if (advance > 0 && advance <= NATURAL_ADVANCE_MAX && current > this.furthest) {\n this.furthest = current;\n } else if (this.options.lockSeek && current > this.furthest) {\n // A jump that lands past furthest without qualifying as natural\n // advance above didn't come through our own clamped `seek()` (that\n // never lets `current` land past `furthest`) — it reached the\n // provider directly. That's the normal case for YouTube/Vimeo:\n // `controls: 0` / `disablekb: 1` are just hints their iframe doesn't\n // always honor (a double-tap skip gesture, a click landing before the\n // hit layer catches it), unlike html5's fully-hidden native UI, which\n // nothing else can reach. Force the position back instead of leaving\n // playback running from an unwatched point.\n this.provider.seek(this.furthest);\n }\n this.lastTick = current;\n this.emitter.emit('timeupdate', this.snapshot());\n this.render();\n }\n\n private snapshot(): PlayerState {\n const current = this.provider.getCurrentTime();\n const duration = this.duration || this.provider.getDuration();\n const percent = duration > 0 ? Math.min(100, Math.round((this.furthest / duration) * 100)) : 0;\n return { current, furthest: this.furthest, duration, percent, playing: this.playing };\n }\n\n private render(): void {\n this.controls.update(this.snapshot(), {\n muted: this.provider.isMuted(),\n volume: this.provider.getVolume(),\n rate: this.provider.getRate(),\n });\n }\n\n private toggleFullscreen(): void {\n if (document.fullscreenElement === this.root) {\n void document.exitFullscreen?.();\n } else {\n void this.root.requestFullscreen?.();\n }\n }\n\n // ---- Public API ----\n\n play(): void {\n this.provider.play();\n }\n\n pause(): void {\n this.provider.pause();\n }\n\n toggle(): void {\n if (this.provider.isPlaying()) this.provider.pause();\n else this.provider.play();\n }\n\n seek(seconds: number): void {\n // A non-seekable provider (e.g. a live stream) has no position to jump\n // to — ignore even a direct call through the public API, not just the\n // hidden scrubber.\n if (!this.provider.capabilities.seekable) return;\n // Enforce the seek lock: never allow scrubbing past the furthest watched point.\n const target =\n this.options.lockSeek && seconds > this.furthest ? this.furthest : Math.max(0, seconds);\n this.provider.seek(target);\n this.lastTick = target;\n this.render();\n }\n\n setLockSeek(locked: boolean): void {\n this.options.lockSeek = locked;\n this.controls.setLockSeek(locked);\n this.root.classList.toggle('kzp--locked', locked);\n this.render();\n }\n\n getState(): PlayerState {\n return this.snapshot();\n }\n\n on<K extends keyof PlayerEvents>(event: K, cb: PlayerEvents[K]): () => void {\n return this.emitter.on(event, cb);\n }\n\n off<K extends keyof PlayerEvents>(event: K, cb: PlayerEvents[K]): void {\n this.emitter.off(event, cb);\n }\n\n destroy(): void {\n for (const dispose of this.disposers) dispose();\n this.disposers = [];\n this.provider.destroy();\n this.controls.destroy();\n this.emitter.clear();\n this.root.remove();\n }\n}\n","import { Player } from './core/Player';\nimport type { KodezenPlayerInstance, PlayerOptions } from './types';\n\n/**\n * Create a player instance mounted inside `container`.\n *\n * The library never persists anything. Subscribe to `timeupdate` to save\n * progress and pass `resumeAt` to restore it — the host owns all tracking and\n * completion logic.\n */\nexport function createPlayer(\n container: HTMLElement,\n options: PlayerOptions,\n): KodezenPlayerInstance {\n return new Player(container, options);\n}\n\nexport { Player } from './core/Player';\nexport type {\n ControlsConfig,\n KodezenPlayerInstance,\n PlayerEvents,\n PlayerOptions,\n PlayerState,\n Provider,\n ProviderCapabilities,\n ProviderEvents,\n ReadyPayload,\n Source,\n SourceType,\n TimeUpdatePayload,\n} from './types';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/emitter.ts","../src/providers/html5.ts","../src/providers/youtube.ts","../src/providers/vimeo.ts","../src/providers/index.ts","../src/core/Captions.ts","../src/core/Controls.ts","../src/core/Player.ts","../src/index.ts"],"names":["apiPromise","loadApi","_a"],"mappings":"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","file":"index.js","sourcesContent":["/** Minimal typed event emitter shared by the player core and providers. */\nexport class Emitter<Events extends Record<keyof Events, (...args: never[]) => void>> {\n private listeners = new Map<keyof Events, Set<(...args: never[]) => void>>();\n\n on<K extends keyof Events>(name: K, cb: Events[K]): () => void {\n let set = this.listeners.get(name);\n if (!set) {\n set = new Set();\n this.listeners.set(name, set);\n }\n set.add(cb as (...args: never[]) => void);\n return () => this.off(name, cb);\n }\n\n off<K extends keyof Events>(name: K, cb: Events[K]): void {\n this.listeners.get(name)?.delete(cb as (...args: never[]) => void);\n }\n\n emit<K extends keyof Events>(name: K, ...args: Parameters<Events[K]>): void {\n // Copy to a static array so a listener removing itself mid-dispatch is safe.\n const set = this.listeners.get(name);\n if (!set) return;\n for (const cb of [...set]) (cb as (...a: Parameters<Events[K]>) => void)(...args);\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import { Emitter } from '../emitter';\nimport type { Provider, ProviderCapabilities, ProviderEvents, Source } from '../types';\n\nconst HLS_EXTENSION = /\\.m3u8($|\\?)/i;\nconst HLS_MIME = /mpegurl/i;\n\nfunction isHls(source: Source): boolean {\n return HLS_MIME.test(source.mime ?? '') || HLS_EXTENSION.test(source.url ?? '');\n}\n\n/**\n * HTML5 provider — self-hosted / external mp4 & webm, and HLS (`.m3u8`, e.g.\n * Mux) via a native <video>. There's no distinct \"Mux provider\": Mux is\n * plain HLS streaming, so it's just this provider picking `hls.js` for\n * browsers without native HLS (Safari has it built in; others don't).\n */\nexport class Html5Provider implements Provider {\n readonly capabilities: ProviderCapabilities = { seekable: true, rate: true, volume: true };\n\n private emitter = new Emitter<ProviderEvents>();\n private video: HTMLVideoElement;\n private disposers: Array<() => void> = [];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private hls: any = null;\n\n constructor(private source: Source) {\n this.video = document.createElement('video');\n this.video.className = 'kzp-media';\n this.video.playsInline = true;\n this.video.preload = 'metadata';\n this.video.controls = false;\n if (source.poster) this.video.poster = source.poster;\n }\n\n async mount(container: HTMLElement): Promise<void> {\n const src = this.source.url ?? '';\n container.appendChild(this.video);\n\n const on = (name: string, handler: EventListener) => {\n this.video.addEventListener(name, handler);\n this.disposers.push(() => this.video.removeEventListener(name, handler));\n };\n\n on('loadedmetadata', () => {\n this.emitter.emit('durationchange', this.getDuration());\n this.emitter.emit('ready');\n });\n on('durationchange', () => this.emitter.emit('durationchange', this.getDuration()));\n on('timeupdate', () => this.emitter.emit('timeupdate', this.video.currentTime));\n on('play', () => this.emitter.emit('play'));\n on('pause', () => this.emitter.emit('pause'));\n on('ended', () => this.emitter.emit('ended'));\n\n if (isHls(this.source) && !this.video.canPlayType('application/vnd.apple.mpegurl')) {\n on('error', () => this.emitter.emit('error', 'Media failed to load.'));\n // Safari plays HLS natively; every other browser needs hls.js. Loaded\n // lazily so mp4/webm playback never pays for a library it doesn't use.\n const { default: Hls } = await import('hls.js');\n if (!Hls.isSupported()) {\n this.emitter.emit('error', 'HLS playback is not supported in this browser.');\n return;\n }\n this.hls = new Hls();\n this.hls.on(Hls.Events.ERROR, (_event: unknown, data: { fatal: boolean }) => {\n if (data.fatal) this.emitter.emit('error', 'Media failed to load.');\n });\n this.hls.loadSource(src);\n this.hls.attachMedia(this.video);\n } else {\n const el = document.createElement('source');\n el.src = src;\n el.type = this.source.mime ?? (isHls(this.source) ? 'application/vnd.apple.mpegurl' : 'video/mp4');\n this.video.appendChild(el);\n on('error', () => this.emitter.emit('error', 'Media failed to load.'));\n }\n\n // Some browsers fire loadedmetadata before listeners attach on cached media.\n if (this.video.readyState >= 1) {\n this.emitter.emit('durationchange', this.getDuration());\n this.emitter.emit('ready');\n }\n }\n\n play(): void {\n void this.video.play().catch(() => {\n /* autoplay/gesture rejection is not fatal — surfaced via the play button. */\n });\n }\n\n pause(): void {\n this.video.pause();\n }\n\n seek(seconds: number): void {\n const d = this.getDuration();\n this.video.currentTime = d > 0 ? Math.min(seconds, d) : Math.max(0, seconds);\n }\n\n getCurrentTime(): number {\n return this.video.currentTime || 0;\n }\n\n getDuration(): number {\n return Number.isFinite(this.video.duration) ? this.video.duration : 0;\n }\n\n setVolume(v: number): void {\n this.video.volume = Math.min(1, Math.max(0, v));\n }\n\n getVolume(): number {\n return this.video.volume;\n }\n\n setMuted(m: boolean): void {\n this.video.muted = m;\n }\n\n isMuted(): boolean {\n return this.video.muted;\n }\n\n setRate(r: number): void {\n this.video.playbackRate = r;\n }\n\n getRate(): number {\n return this.video.playbackRate;\n }\n\n isPlaying(): boolean {\n return !this.video.paused && !this.video.ended;\n }\n\n on<K extends keyof ProviderEvents>(event: K, cb: ProviderEvents[K]): () => void {\n return this.emitter.on(event, cb);\n }\n\n destroy(): void {\n for (const dispose of this.disposers) dispose();\n this.disposers = [];\n this.emitter.clear();\n this.hls?.destroy();\n this.hls = null;\n this.video.removeAttribute('src');\n this.video.load();\n this.video.remove();\n }\n}\n","import { Emitter } from '../emitter';\nimport type { Provider, ProviderCapabilities, ProviderEvents, Source } from '../types';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ndeclare global {\n interface Window {\n YT?: any;\n onYouTubeIframeAPIReady?: () => void;\n }\n}\n\nlet apiPromise: Promise<any> | null = null;\n\n/** Lazy-load the YouTube IFrame API once, chaining any existing global callback. */\nfunction loadApi(): Promise<any> {\n if (typeof window === 'undefined') return Promise.reject(new Error('no window'));\n if (window.YT && window.YT.Player) return Promise.resolve(window.YT);\n if (apiPromise) return apiPromise;\n apiPromise = new Promise((resolve) => {\n const prev = window.onYouTubeIframeAPIReady;\n window.onYouTubeIframeAPIReady = () => {\n prev?.();\n resolve(window.YT);\n };\n const tag = document.createElement('script');\n tag.src = 'https://www.youtube.com/iframe_api';\n document.head.appendChild(tag);\n });\n return apiPromise;\n}\n\nfunction parseId(source: Source): string {\n if (source.id) return source.id;\n const url = source.url ?? '';\n const m = url.match(/(?:youtu\\.be\\/|[?&]v=|\\/embed\\/|\\/shorts\\/)([\\w-]{11})/);\n return m?.[1] ?? url;\n}\n\n/** YouTube provider — drives an IFrame API player behind our own control bar. */\nexport class YouTubeProvider implements Provider {\n readonly capabilities: ProviderCapabilities = { seekable: true, rate: true, volume: true };\n\n private emitter = new Emitter<ProviderEvents>();\n private yt: any = null;\n private host?: HTMLElement;\n private current = 0;\n private duration = 0;\n private rate = 1;\n private muted = false;\n private volume = 1;\n private playing = false;\n private ticker: number | null = null;\n\n constructor(private source: Source) {}\n\n async mount(container: HTMLElement): Promise<void> {\n const host = document.createElement('div');\n host.className = 'kzp-media kzp-embed';\n container.appendChild(host);\n this.host = host;\n\n const YT = await loadApi();\n this.yt = new YT.Player(host, {\n videoId: parseId(this.source),\n playerVars: {\n controls: 0,\n modestbranding: 1,\n rel: 0,\n playsinline: 1,\n disablekb: 1,\n iv_load_policy: 3,\n },\n events: {\n onReady: () => {\n this.duration = this.yt.getDuration() || 0;\n this.volume = (this.yt.getVolume?.() ?? 100) / 100;\n this.emitter.emit('durationchange', this.duration);\n this.emitter.emit('ready');\n },\n onStateChange: (e: any) => {\n const S = YT.PlayerState;\n if (e.data === S.PLAYING) {\n this.playing = true;\n this.duration = this.yt.getDuration() || this.duration;\n this.emitter.emit('durationchange', this.duration);\n this.emitter.emit('play');\n this.startTicker();\n } else if (e.data === S.PAUSED) {\n this.playing = false;\n this.emitter.emit('pause');\n this.stopTicker();\n } else if (e.data === S.ENDED) {\n this.playing = false;\n this.emitter.emit('ended');\n this.stopTicker();\n }\n },\n onError: () => this.emitter.emit('error', 'YouTube playback error.'),\n },\n });\n }\n\n private startTicker(): void {\n this.stopTicker();\n this.ticker = window.setInterval(() => {\n if (!this.yt) return;\n this.current = this.yt.getCurrentTime() || 0;\n this.emitter.emit('timeupdate', this.current);\n }, 250);\n }\n\n private stopTicker(): void {\n if (this.ticker !== null) {\n clearInterval(this.ticker);\n this.ticker = null;\n }\n }\n\n play(): void {\n this.yt?.playVideo?.();\n }\n\n pause(): void {\n this.yt?.pauseVideo?.();\n }\n\n seek(seconds: number): void {\n const s = Math.max(0, seconds);\n this.yt?.seekTo?.(s, true);\n this.current = s;\n }\n\n getCurrentTime(): number {\n return this.current;\n }\n\n getDuration(): number {\n return this.duration;\n }\n\n setVolume(v: number): void {\n this.volume = Math.min(1, Math.max(0, v));\n this.yt?.setVolume?.(this.volume * 100);\n }\n\n getVolume(): number {\n return this.volume;\n }\n\n setMuted(m: boolean): void {\n this.muted = m;\n if (m) this.yt?.mute?.();\n else this.yt?.unMute?.();\n }\n\n isMuted(): boolean {\n return this.muted;\n }\n\n setRate(r: number): void {\n this.rate = r;\n this.yt?.setPlaybackRate?.(r);\n }\n\n getRate(): number {\n return this.rate;\n }\n\n isPlaying(): boolean {\n return this.playing;\n }\n\n on<K extends keyof ProviderEvents>(event: K, cb: ProviderEvents[K]): () => void {\n return this.emitter.on(event, cb);\n }\n\n destroy(): void {\n this.stopTicker();\n this.emitter.clear();\n this.yt?.destroy?.();\n this.host?.remove();\n }\n}\n","import { Emitter } from '../emitter';\nimport type { Provider, ProviderCapabilities, ProviderEvents, Source } from '../types';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ndeclare global {\n interface Window {\n Vimeo?: any;\n }\n}\n\nlet apiPromise: Promise<any> | null = null;\n\n/** Lazy-load the Vimeo Player API once. */\nfunction loadApi(): Promise<any> {\n if (typeof window === 'undefined') return Promise.reject(new Error('no window'));\n if (window.Vimeo && window.Vimeo.Player) return Promise.resolve(window.Vimeo);\n if (apiPromise) return apiPromise;\n apiPromise = new Promise((resolve, reject) => {\n const tag = document.createElement('script');\n tag.src = 'https://player.vimeo.com/api/player.js';\n tag.onload = () => resolve(window.Vimeo);\n tag.onerror = () => reject(new Error('Vimeo API failed to load'));\n document.head.appendChild(tag);\n });\n return apiPromise;\n}\n\nfunction parseSource(source: Source): { id?: number; url?: string } {\n if (source.id) return { id: Number(source.id) };\n const url = source.url ?? '';\n const m = url.match(/vimeo\\.com\\/(?:video\\/)?(\\d+)/);\n if (m?.[1]) return { id: Number(m[1]) };\n return { url };\n}\n\n/**\n * Vimeo provider. The Vimeo SDK is promise-based, so getCurrentTime/getDuration\n * return values cached from timeupdate/ready events (the Provider getters are sync).\n */\nexport class VimeoProvider implements Provider {\n readonly capabilities: ProviderCapabilities = { seekable: true, rate: true, volume: true };\n\n private emitter = new Emitter<ProviderEvents>();\n private player: any = null;\n private host?: HTMLElement;\n private current = 0;\n private duration = 0;\n private rate = 1;\n private muted = false;\n private volume = 1;\n private playing = false;\n\n constructor(private source: Source) {}\n\n async mount(container: HTMLElement): Promise<void> {\n const host = document.createElement('div');\n host.className = 'kzp-media kzp-embed';\n container.appendChild(host);\n this.host = host;\n\n const Vimeo = await loadApi();\n const opts: any = { controls: false, responsive: false, ...parseSource(this.source) };\n this.player = new Vimeo.Player(host, opts);\n\n this.player.on('timeupdate', (d: any) => {\n this.current = d.seconds ?? this.current;\n if (d.duration) this.duration = d.duration;\n this.emitter.emit('timeupdate', this.current);\n });\n this.player.on('play', () => {\n this.playing = true;\n this.emitter.emit('play');\n });\n this.player.on('pause', () => {\n this.playing = false;\n this.emitter.emit('pause');\n });\n this.player.on('ended', () => {\n this.playing = false;\n this.emitter.emit('ended');\n });\n this.player.on('error', () => this.emitter.emit('error', 'Vimeo playback error.'));\n\n try {\n this.duration = (await this.player.getDuration()) || 0;\n this.emitter.emit('durationchange', this.duration);\n } catch {\n /* duration resolves later via timeupdate */\n }\n this.emitter.emit('ready');\n }\n\n play(): void {\n void this.player?.play?.();\n }\n\n pause(): void {\n void this.player?.pause?.();\n }\n\n seek(seconds: number): void {\n this.current = Math.max(0, seconds);\n void this.player?.setCurrentTime?.(this.current);\n }\n\n getCurrentTime(): number {\n return this.current;\n }\n\n getDuration(): number {\n return this.duration;\n }\n\n setVolume(v: number): void {\n this.volume = Math.min(1, Math.max(0, v));\n void this.player?.setVolume?.(this.volume);\n }\n\n getVolume(): number {\n return this.volume;\n }\n\n setMuted(m: boolean): void {\n this.muted = m;\n void this.player?.setVolume?.(m ? 0 : this.volume);\n }\n\n isMuted(): boolean {\n return this.muted;\n }\n\n setRate(r: number): void {\n this.rate = r;\n void this.player?.setPlaybackRate?.(r);\n }\n\n getRate(): number {\n return this.rate;\n }\n\n isPlaying(): boolean {\n return this.playing;\n }\n\n on<K extends keyof ProviderEvents>(event: K, cb: ProviderEvents[K]): () => void {\n return this.emitter.on(event, cb);\n }\n\n destroy(): void {\n this.emitter.clear();\n void this.player?.destroy?.();\n this.host?.remove();\n }\n}\n","import type { Provider, Source } from '../types';\nimport { Html5Provider } from './html5';\nimport { YouTubeProvider } from './youtube';\nimport { VimeoProvider } from './vimeo';\n\n/**\n * Resolve a Source to a concrete provider. Every provider implements the same\n * Provider interface, so the player core is agnostic to which one is chosen.\n */\nexport function createProvider(source: Source): Provider {\n switch (source.type) {\n case 'html5':\n case 'external':\n return new Html5Provider(source);\n case 'youtube':\n return new YouTubeProvider(source);\n case 'vimeo':\n return new VimeoProvider(source);\n default:\n throw new Error(`[kodezen-player] Unknown source type \"${String(source.type)}\".`);\n }\n}\n","import type { CaptionTrack } from '../types';\n\nexport interface Cue {\n start: number;\n end: number;\n text: string;\n}\n\n// `00:01:02.500 --> 00:01:04.000 align:start` — hours optional; a comma\n// decimal (SRT style) is accepted too, since hand-converted files often keep it.\nconst TIMING = /^\\s*((?:\\d+:)?\\d{1,2}:\\d{2}[.,]\\d{1,3})\\s+-->\\s+((?:\\d+:)?\\d{1,2}:\\d{2}[.,]\\d{1,3})/;\n\nconst ENTITIES: Record<string, string> = {\n amp: '&',\n lt: '<',\n gt: '>',\n quot: '\"',\n apos: \"'\",\n nbsp: ' ',\n lrm: '',\n rlm: '',\n};\n\nfunction toSeconds(stamp: string): number {\n const [clock = '', fraction = '0'] = stamp.replace(',', '.').split('.');\n const seconds = clock.split(':').reduce((total, part) => total * 60 + Number(part), 0);\n return seconds + Number(`0.${fraction}`);\n}\n\n/** Cue text as plain text: markup (`<v Speaker>`, `<i>`, inline timestamps) dropped, entities decoded. */\nfunction plainText(text: string): string {\n return text\n .replace(/<[^>]*>/g, '')\n .replace(/&(amp|lt|gt|quot|apos|nbsp|lrm|rlm);/g, (_, name: string) => ENTITIES[name] ?? '')\n .replace(/&#(\\d+);/g, (_, code: string) => String.fromCodePoint(Number(code)));\n}\n\n/**\n * Parse a WebVTT file into cues. Blocks without a timing line (the `WEBVTT`\n * header, NOTE, STYLE, REGION) are skipped; cue identifiers and cue settings\n * are ignored — captions render as plain centred text.\n */\nexport function parseVtt(input: string): Cue[] {\n const cues: Cue[] = [];\n const blocks = input.replace(/^/, '').replace(/\\r\\n?/g, '\\n').split(/\\n{2,}/);\n for (const block of blocks) {\n const lines = block.split('\\n');\n const timingAt = lines.findIndex((line) => line.includes('-->'));\n const timing = TIMING.exec(lines[timingAt] ?? '');\n if (!timing?.[1] || !timing[2]) continue;\n const text = plainText(lines.slice(timingAt + 1).join('\\n')).trim();\n if (!text) continue;\n cues.push({ start: toSeconds(timing[1]), end: toSeconds(timing[2]), text });\n }\n return cues.sort((a, b) => a.start - b.start);\n}\n\ninterface LoadedTrack {\n info: CaptionTrack;\n cues: Cue[] | null;\n failed: boolean;\n}\n\n/**\n * Fetches the caption files and draws the active track's current cue in an\n * overlay above the media. Rendering it ourselves (rather than a native\n * `<track>`) is what makes one `.vtt` work for html5, YouTube and Vimeo alike.\n */\nexport class Captions {\n readonly el: HTMLElement;\n private text: HTMLElement;\n private tracks: LoadedTrack[];\n private active = -1;\n private time = 0;\n private abort = new AbortController();\n\n /** `onChange` fires when the active track or track availability changes. */\n constructor(tracks: CaptionTrack[], private onChange: () => void) {\n this.el = document.createElement('div');\n this.el.className = 'kzp-captions';\n this.el.setAttribute('aria-live', 'off');\n this.text = document.createElement('span');\n this.text.className = 'kzp-captions-text';\n this.text.hidden = true;\n this.el.appendChild(this.text);\n\n this.tracks = tracks.map((info) => ({ info, cues: null, failed: false }));\n const preferred = tracks.findIndex((t) => t.default);\n this.tracks.forEach((track, index) => {\n void this.load(track).then(() => {\n // Turn the default track on once it's ready (unless the viewer\n // already picked one in the meantime).\n if (index === preferred && this.active === -1 && track.cues) this.select(index);\n else this.onChange();\n });\n });\n }\n\n private async load(track: LoadedTrack): Promise<void> {\n try {\n const res = await fetch(track.info.src, { signal: this.abort.signal, credentials: 'same-origin' });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n track.cues = parseVtt(await res.text());\n } catch (err) {\n if (this.abort.signal.aborted) return;\n track.failed = true;\n // eslint-disable-next-line no-console\n console.warn(`@kodezen/player: could not load captions from ${track.info.src}`, err);\n }\n }\n\n /** Labels for the menu, one per track (falls back to the language, then a number). */\n labels(): string[] {\n return this.tracks.map((t, i) => t.info.label || t.info.srclang || `Track ${i + 1}`);\n }\n\n /** Whether each track loaded (a failed track is hidden from the controls). */\n available(): boolean[] {\n return this.tracks.map((t) => !t.failed);\n }\n\n getActive(): number {\n return this.active;\n }\n\n /** Show track `index`, or turn captions off with -1. */\n select(index: number): void {\n const track = this.tracks[index];\n this.active = track && !track.failed ? index : -1;\n this.el.lang = track?.info.srclang ?? '';\n this.render();\n this.onChange();\n }\n\n /** Called with the playhead position on every tick and after a seek. */\n update(time: number): void {\n this.time = time;\n this.render();\n }\n\n private render(): void {\n const cues = this.tracks[this.active]?.cues ?? [];\n const text = cues\n .filter((cue) => this.time >= cue.start && this.time < cue.end)\n .map((cue) => cue.text)\n .join('\\n');\n if (text !== this.text.textContent) this.text.textContent = text;\n this.text.hidden = !text;\n }\n\n destroy(): void {\n this.abort.abort();\n this.el.remove();\n }\n}\n","import type { ControlsConfig, PlayerState } from '../types';\n\nconst ICONS = {\n play: '<path d=\"M8 5v14l11-7z\"/>',\n pause: '<path d=\"M6 5h4v14H6zM14 5h4v14h-4z\"/>',\n volume: '<path d=\"M3 10v4h4l5 5V5L7 10H3zm13.5 2a4.5 4.5 0 0 0-2.5-4v8a4.5 4.5 0 0 0 2.5-4z\"/>',\n muted: '<path d=\"M3 10v4h4l5 5V5L7 10H3zm13 2 3 3 1-1-3-3 3-3-1-1-3 3-3-3-1 1 3 3-3 3 1 1z\"/>',\n full: '<path d=\"M4 4h6v2H6v4H4V4zm10 0h6v6h-2V6h-4V4zM4 14h2v4h4v2H4v-6zm14 0h2v6h-6v-2h4v-4z\"/>',\n captions:\n '<path d=\"M19 4H5a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm-8 7H9.5v-.5h-2v3h2V13H11v1a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1zm7 0h-1.5v-.5h-2v3h2V13H18v1a1 1 0 0 1-1 1h-3a1 1 0 0 1-1-1v-4a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v1z\"/>',\n} as const;\n\nfunction icon(paths: string): string {\n return `<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">${paths}</svg>`;\n}\n\nfunction fmt(sec: number): string {\n if (!Number.isFinite(sec) || sec < 0) sec = 0;\n const s = Math.floor(sec % 60);\n const m = Math.floor((sec / 60) % 60);\n const h = Math.floor(sec / 3600);\n const mm = h > 0 ? String(m).padStart(2, '0') : String(m);\n const ss = String(s).padStart(2, '0');\n return h > 0 ? `${h}:${mm}:${ss}` : `${mm}:${ss}`;\n}\n\nexport interface ControlsCallbacks {\n onToggle(): void;\n /** Requested seek (seconds). The player clamps this when lockSeek is on. */\n onSeek(seconds: number): void;\n onVolume(v: number): void;\n onMuteToggle(): void;\n onRate(rate: number): void;\n /** Show caption track `index`, or turn captions off with -1. */\n onCaptions(index: number): void;\n onFullscreen(): void;\n}\n\nconst DEFAULT_CONFIG: ControlsConfig = {\n playPause: true,\n seek: true,\n time: true,\n volume: true,\n speed: true,\n captions: true,\n fullscreen: true,\n};\n\n/** Vanilla DOM control bar. Framework-agnostic; the player drives it via update(). */\nexport class Controls {\n readonly el: HTMLElement;\n private config: ControlsConfig;\n\n private playBtn?: HTMLButtonElement;\n private scrubber?: HTMLInputElement;\n private timeEl?: HTMLElement;\n private volBtn?: HTMLButtonElement;\n private volRange?: HTMLInputElement;\n private speedBtn?: HTMLButtonElement;\n private speedMenu?: HTMLElement;\n private ccWrap?: HTMLElement;\n private ccBtn?: HTMLButtonElement;\n private ccMenu?: HTMLElement;\n private ccActive = -1;\n\n private scrubbing = false;\n private lockSeek: boolean;\n private seekableMax = Infinity;\n\n constructor(\n private cb: ControlsCallbacks,\n opts: {\n config?: Partial<ControlsConfig>;\n speeds: number[];\n lockSeek: boolean;\n /** One label per caption track; the CC control only renders when given. */\n captionLabels?: string[];\n },\n ) {\n this.config = { ...DEFAULT_CONFIG, ...opts.config };\n this.lockSeek = opts.lockSeek;\n this.el = document.createElement('div');\n this.el.className = 'kzp-controls';\n this.build(opts.speeds, opts.captionLabels ?? []);\n }\n\n private build(speeds: number[], captionLabels: string[]): void {\n if (this.config.playPause) {\n this.playBtn = this.button('kzp-play', 'Play', ICONS.play);\n this.playBtn.addEventListener('click', () => this.cb.onToggle());\n this.el.appendChild(this.playBtn);\n }\n\n if (this.config.seek) {\n this.scrubber = document.createElement('input');\n this.scrubber.type = 'range';\n this.scrubber.className = 'kzp-scrubber';\n this.scrubber.min = '0';\n this.scrubber.max = '0';\n this.scrubber.step = '0.1';\n this.scrubber.value = '0';\n this.scrubber.setAttribute('aria-label', 'Seek');\n const commit = () => this.cb.onSeek(this.clamp(Number(this.scrubber!.value)));\n // Seek-lock blocks the drag/click at its source (pointerdown/keydown)\n // rather than via the `disabled` attribute or `pointer-events`, so the\n // scrubber keeps its normal look *and* its own `cursor` still applies —\n // both are lost once an element stops receiving pointer events at all.\n this.scrubber.addEventListener('pointerdown', (e) => {\n if (this.lockSeek) {\n e.preventDefault();\n return;\n }\n this.scrubbing = true;\n });\n this.scrubber.addEventListener('keydown', (e) => {\n if (this.lockSeek) e.preventDefault();\n });\n this.scrubber.addEventListener('input', commit);\n this.scrubber.addEventListener('change', () => {\n commit();\n this.scrubbing = false;\n });\n this.el.appendChild(this.scrubber);\n }\n\n if (this.config.time) {\n this.timeEl = document.createElement('span');\n this.timeEl.className = 'kzp-time';\n this.timeEl.textContent = '0:00 / 0:00';\n this.el.appendChild(this.timeEl);\n }\n\n if (this.config.volume) {\n const wrap = document.createElement('div');\n wrap.className = 'kzp-volume';\n this.volBtn = this.button('kzp-mute', 'Mute', ICONS.volume);\n this.volBtn.addEventListener('click', () => this.cb.onMuteToggle());\n this.volRange = document.createElement('input');\n this.volRange.type = 'range';\n this.volRange.className = 'kzp-vol-range';\n this.volRange.min = '0';\n this.volRange.max = '1';\n this.volRange.step = '0.05';\n this.volRange.value = '1';\n this.volRange.setAttribute('aria-label', 'Volume');\n this.volRange.addEventListener('input', () => this.cb.onVolume(Number(this.volRange!.value)));\n wrap.append(this.volBtn, this.volRange);\n this.el.appendChild(wrap);\n }\n\n if (this.config.speed && speeds.length > 1) {\n const wrap = document.createElement('div');\n wrap.className = 'kzp-speed';\n this.speedBtn = this.button('kzp-speed-btn', 'Playback speed', '');\n this.speedBtn.textContent = '1x';\n this.speedMenu = document.createElement('div');\n this.speedMenu.className = 'kzp-speed-menu';\n this.speedMenu.hidden = true;\n for (const rate of speeds) {\n const item = document.createElement('button');\n item.type = 'button';\n item.textContent = `${rate}x`;\n item.dataset.rate = String(rate);\n item.addEventListener('click', () => {\n this.cb.onRate(rate);\n this.speedMenu!.hidden = true;\n });\n this.speedMenu.appendChild(item);\n }\n this.speedBtn.addEventListener('click', () => {\n this.speedMenu!.hidden = !this.speedMenu!.hidden;\n if (this.ccMenu) this.ccMenu.hidden = true;\n });\n wrap.append(this.speedBtn, this.speedMenu);\n this.el.appendChild(wrap);\n }\n\n if (this.config.captions && captionLabels.length) {\n this.buildCaptions(captionLabels);\n }\n\n if (this.config.fullscreen) {\n const btn = this.button('kzp-full', 'Fullscreen', ICONS.full);\n btn.addEventListener('click', () => this.cb.onFullscreen());\n this.el.appendChild(btn);\n }\n }\n\n /**\n * One track: the CC button toggles it. Several: it opens a menu (Off + each\n * track), styled like the speed menu. Sits left of the speed control.\n */\n private buildCaptions(labels: string[]): void {\n const wrap = document.createElement('div');\n wrap.className = 'kzp-cc';\n this.ccBtn = this.button('kzp-cc-btn', 'Subtitles/closed captions', ICONS.captions);\n this.ccBtn.setAttribute('aria-pressed', 'false');\n wrap.appendChild(this.ccBtn);\n\n if (labels.length === 1) {\n this.ccBtn.addEventListener('click', () => this.cb.onCaptions(this.ccActive === -1 ? 0 : -1));\n } else {\n this.ccMenu = document.createElement('div');\n this.ccMenu.className = 'kzp-speed-menu kzp-cc-menu';\n this.ccMenu.hidden = true;\n const items = [{ index: -1, label: 'Off' }, ...labels.map((label, index) => ({ index, label }))];\n for (const { index, label } of items) {\n const item = document.createElement('button');\n item.type = 'button';\n item.textContent = label;\n item.dataset.track = String(index);\n item.addEventListener('click', () => {\n this.cb.onCaptions(index);\n this.ccMenu!.hidden = true;\n });\n this.ccMenu.appendChild(item);\n }\n this.ccBtn.addEventListener('click', () => {\n this.ccMenu!.hidden = !this.ccMenu!.hidden;\n if (this.speedMenu) this.speedMenu.hidden = true;\n });\n wrap.appendChild(this.ccMenu);\n }\n\n this.ccWrap = wrap;\n // Captions sit just left of the speed control (or of fullscreen).\n const speed = this.el.querySelector('.kzp-speed');\n this.el.insertBefore(wrap, speed);\n }\n\n /** Reflect the active caption track, and hide tracks (or the whole control) that failed to load. */\n setCaptions(active: number, available: boolean[]): void {\n this.ccActive = active;\n if (!this.ccBtn || !this.ccWrap) return;\n this.ccWrap.hidden = !available.some(Boolean);\n this.ccBtn.classList.toggle('kzp-cc-btn--on', active !== -1);\n this.ccBtn.setAttribute('aria-pressed', String(active !== -1));\n this.ccMenu?.querySelectorAll<HTMLButtonElement>('button').forEach((item) => {\n const index = Number(item.dataset.track);\n item.hidden = index !== -1 && !available[index];\n item.classList.toggle('kzp-menu-item--active', index === active);\n });\n }\n\n private button(cls: string, label: string, svg: string): HTMLButtonElement {\n const b = document.createElement('button');\n b.type = 'button';\n b.className = cls;\n b.setAttribute('aria-label', label);\n if (svg) b.innerHTML = icon(svg);\n return b;\n }\n\n private clamp(value: number): number {\n return this.lockSeek ? Math.min(value, this.seekableMax) : value;\n }\n\n setLockSeek(locked: boolean): void {\n this.lockSeek = locked;\n }\n\n /** Push the latest state into the DOM. Called on every player timeupdate. */\n update(state: PlayerState, extras: { muted: boolean; volume: number; rate: number }): void {\n if (this.playBtn) {\n this.playBtn.innerHTML = icon(state.playing ? ICONS.pause : ICONS.play);\n this.playBtn.setAttribute('aria-label', state.playing ? 'Pause' : 'Play');\n }\n if (this.scrubber) {\n this.seekableMax = this.lockSeek ? state.furthest : Infinity;\n this.scrubber.max = String(state.duration || 0);\n if (!this.scrubbing) this.scrubber.value = String(state.current);\n }\n if (this.timeEl) {\n this.timeEl.textContent = `${fmt(state.current)} / ${fmt(state.duration)}`;\n }\n if (this.volBtn) {\n this.volBtn.innerHTML = icon(extras.muted || extras.volume === 0 ? ICONS.muted : ICONS.volume);\n }\n if (this.volRange && document.activeElement !== this.volRange) {\n this.volRange.value = String(extras.muted ? 0 : extras.volume);\n }\n if (this.speedBtn) this.speedBtn.textContent = `${extras.rate}x`;\n }\n\n destroy(): void {\n this.el.remove();\n }\n}\n","import { Emitter } from '../emitter';\nimport { createProvider } from '../providers';\nimport type {\n KodezenPlayerInstance,\n PlayerEvents,\n PlayerOptions,\n PlayerState,\n Provider,\n} from '../types';\nimport { Captions } from './Captions';\nimport { Controls } from './Controls';\n\nconst DEFAULT_SPEEDS = [0.5, 1, 1.25, 1.5, 2];\n/** A forward jump larger than this (seconds) between ticks is treated as a seek, not playback. */\nconst NATURAL_ADVANCE_MAX = 2;\n\nexport class Player implements KodezenPlayerInstance {\n private emitter = new Emitter<PlayerEvents>();\n private provider: Provider;\n private controls: Controls;\n private root: HTMLElement;\n private stage: HTMLElement;\n private captions: Captions | null = null;\n\n private furthest = 0;\n private lastTick = 0;\n private duration = 0;\n private playing = false;\n private ready = false;\n private disposers: Array<() => void> = [];\n\n constructor(private container: HTMLElement, private options: PlayerOptions) {\n const speeds = options.speeds ?? DEFAULT_SPEEDS;\n\n this.root = document.createElement('div');\n this.root.className = 'kzp' + (options.className ? ` ${options.className}` : '');\n // Per-provider modifier (e.g. `kzp--youtube`) for provider-specific styling.\n this.root.classList.add(`kzp--${options.source.type}`);\n if (options.lockSeek) this.root.classList.add('kzp--locked');\n\n this.stage = document.createElement('div');\n this.stage.className = 'kzp-stage';\n this.root.appendChild(this.stage);\n\n // YouTube/Vimeo's own iframe chrome (title bar, related-video card, its\n // own control bar) still appears on hover even with their controls\n // disabled — it renders *inside* the stage, so our own control bar can't\n // cover it. This transparent layer sits on top of the embed instead, so\n // the mouse never actually reaches it, and forwards a plain click to the\n // same play/pause toggle the embed itself would otherwise handle.\n const hitLayer = document.createElement('div');\n hitLayer.className = 'kzp-hit-layer';\n hitLayer.addEventListener('click', () => this.toggle());\n this.stage.appendChild(hitLayer);\n\n // Built before Controls so a provider that can't seek/rate-change/volume\n // (e.g. a live stream) hides those controls from the start, instead of\n // rendering them non-functional.\n this.provider = createProvider(options.source);\n const caps = this.provider.capabilities;\n\n // Caption overlay: a sibling of the stage (so it isn't clipped with the\n // embed's cropped chrome) painted between the media and the control bar.\n if (options.tracks?.length) {\n this.captions = new Captions(options.tracks, () => this.syncCaptions());\n this.root.appendChild(this.captions.el);\n }\n\n this.controls = new Controls(\n {\n onToggle: () => this.toggle(),\n onSeek: (s) => this.seek(s),\n onVolume: (v) => {\n this.provider.setMuted(false);\n this.provider.setVolume(v);\n this.render();\n },\n onMuteToggle: () => {\n this.provider.setMuted(!this.provider.isMuted());\n this.render();\n },\n onRate: (r) => {\n this.provider.setRate(r);\n this.render();\n },\n onCaptions: (index) => this.captions?.select(index),\n onFullscreen: () => this.toggleFullscreen(),\n },\n {\n config: {\n ...options.controls,\n seek: (options.controls?.seek ?? true) && caps.seekable,\n speed: (options.controls?.speed ?? true) && caps.rate,\n volume: (options.controls?.volume ?? true) && caps.volume,\n },\n speeds,\n lockSeek: !!options.lockSeek,\n captionLabels: this.captions?.labels(),\n },\n );\n this.root.appendChild(this.controls.el);\n this.container.appendChild(this.root);\n\n this.wireProvider();\n void this.provider.mount(this.stage);\n }\n\n private wireProvider(): void {\n const p = this.provider;\n this.disposers.push(\n p.on('ready', () => this.onReady()),\n p.on('durationchange', (d) => {\n this.duration = d;\n this.emitter.emit('durationchange', d);\n this.render();\n }),\n p.on('timeupdate', (current) => this.onTimeUpdate(current)),\n p.on('play', () => {\n this.playing = true;\n this.emitter.emit('play');\n this.render();\n }),\n p.on('pause', () => {\n this.playing = false;\n this.emitter.emit('pause');\n this.render();\n }),\n p.on('ended', () => {\n this.playing = false;\n this.emitter.emit('ended');\n this.render();\n }),\n p.on('error', (msg) => this.emitter.emit('error', msg)),\n );\n }\n\n private onReady(): void {\n if (this.ready) return;\n this.ready = true;\n this.duration = this.provider.getDuration();\n\n if (this.options.muted) this.provider.setMuted(true);\n\n const resume = this.options.resumeAt ?? 0;\n if (resume > 0 && (this.duration === 0 || resume < this.duration - 2)) {\n this.provider.seek(resume);\n this.furthest = resume;\n this.lastTick = resume;\n }\n\n this.emitter.emit('ready', { duration: this.duration });\n if (this.options.autoplay) this.provider.play();\n this.render();\n }\n\n private onTimeUpdate(current: number): void {\n // Grow furthest only on natural forward advance so a seek can't inflate it.\n const advance = current - this.lastTick;\n if (advance > 0 && advance <= NATURAL_ADVANCE_MAX && current > this.furthest) {\n this.furthest = current;\n } else if (this.options.lockSeek && current > this.furthest) {\n // A jump that lands past furthest without qualifying as natural\n // advance above didn't come through our own clamped `seek()` (that\n // never lets `current` land past `furthest`) — it reached the\n // provider directly. That's the normal case for YouTube/Vimeo:\n // `controls: 0` / `disablekb: 1` are just hints their iframe doesn't\n // always honor (a double-tap skip gesture, a click landing before the\n // hit layer catches it), unlike html5's fully-hidden native UI, which\n // nothing else can reach. Force the position back instead of leaving\n // playback running from an unwatched point.\n this.provider.seek(this.furthest);\n }\n this.lastTick = current;\n this.captions?.update(current);\n this.emitter.emit('timeupdate', this.snapshot());\n this.render();\n }\n\n private syncCaptions(): void {\n if (!this.captions) return;\n this.controls.setCaptions(this.captions.getActive(), this.captions.available());\n }\n\n private snapshot(): PlayerState {\n const current = this.provider.getCurrentTime();\n const duration = this.duration || this.provider.getDuration();\n const percent = duration > 0 ? Math.min(100, Math.round((this.furthest / duration) * 100)) : 0;\n return { current, furthest: this.furthest, duration, percent, playing: this.playing };\n }\n\n private render(): void {\n this.controls.update(this.snapshot(), {\n muted: this.provider.isMuted(),\n volume: this.provider.getVolume(),\n rate: this.provider.getRate(),\n });\n }\n\n private toggleFullscreen(): void {\n if (document.fullscreenElement === this.root) {\n void document.exitFullscreen?.();\n } else {\n void this.root.requestFullscreen?.();\n }\n }\n\n // ---- Public API ----\n\n play(): void {\n this.provider.play();\n }\n\n pause(): void {\n this.provider.pause();\n }\n\n toggle(): void {\n if (this.provider.isPlaying()) this.provider.pause();\n else this.provider.play();\n }\n\n seek(seconds: number): void {\n // A non-seekable provider (e.g. a live stream) has no position to jump\n // to — ignore even a direct call through the public API, not just the\n // hidden scrubber.\n if (!this.provider.capabilities.seekable) return;\n // Enforce the seek lock: never allow scrubbing past the furthest watched point.\n const target =\n this.options.lockSeek && seconds > this.furthest ? this.furthest : Math.max(0, seconds);\n this.provider.seek(target);\n this.lastTick = target;\n this.captions?.update(target);\n this.render();\n }\n\n setLockSeek(locked: boolean): void {\n this.options.lockSeek = locked;\n this.controls.setLockSeek(locked);\n this.root.classList.toggle('kzp--locked', locked);\n this.render();\n }\n\n getState(): PlayerState {\n return this.snapshot();\n }\n\n on<K extends keyof PlayerEvents>(event: K, cb: PlayerEvents[K]): () => void {\n return this.emitter.on(event, cb);\n }\n\n off<K extends keyof PlayerEvents>(event: K, cb: PlayerEvents[K]): void {\n this.emitter.off(event, cb);\n }\n\n destroy(): void {\n for (const dispose of this.disposers) dispose();\n this.disposers = [];\n this.provider.destroy();\n this.captions?.destroy();\n this.controls.destroy();\n this.emitter.clear();\n this.root.remove();\n }\n}\n","import { Player } from './core/Player';\nimport type { KodezenPlayerInstance, PlayerOptions } from './types';\n\n/**\n * Create a player instance mounted inside `container`.\n *\n * The library never persists anything. Subscribe to `timeupdate` to save\n * progress and pass `resumeAt` to restore it — the host owns all tracking and\n * completion logic.\n */\nexport function createPlayer(\n container: HTMLElement,\n options: PlayerOptions,\n): KodezenPlayerInstance {\n return new Player(container, options);\n}\n\nexport { Player } from './core/Player';\nexport { parseVtt } from './core/Captions';\nexport type { Cue } from './core/Captions';\nexport type {\n CaptionTrack,\n ControlsConfig,\n KodezenPlayerInstance,\n PlayerEvents,\n PlayerOptions,\n PlayerState,\n Provider,\n ProviderCapabilities,\n ProviderEvents,\n ReadyPayload,\n Source,\n SourceType,\n TimeUpdatePayload,\n} from './types';\n"]}
|