@kodezen/player 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +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","../../src/react/index.tsx"],"names":["apiPromise","loadApi","KodezenPlayer","_a","_b"],"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 }\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","import {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n} from 'react';\nimport { createPlayer } from '../index';\nimport type {\n KodezenPlayerInstance,\n PlayerOptions,\n ReadyPayload,\n Source,\n TimeUpdatePayload,\n} from '../types';\n\nexport interface KodezenPlayerProps\n extends Omit<PlayerOptions, 'source'> {\n source: Source;\n onReady?: (payload: ReadyPayload) => void;\n onTimeUpdate?: (payload: TimeUpdatePayload) => void;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onError?: (message: string) => void;\n style?: React.CSSProperties;\n wrapperClassName?: string;\n}\n\nexport type KodezenPlayerHandle = KodezenPlayerInstance;\n\n/**\n * Thin React wrapper around the framework-agnostic core. Re-instantiates the\n * player only when the source changes; event callbacks are read from refs so\n * updating them never remounts the media.\n */\nexport const KodezenPlayer = forwardRef<KodezenPlayerHandle, KodezenPlayerProps>(\n function KodezenPlayer(props, ref) {\n const hostRef = useRef<HTMLDivElement | null>(null);\n const playerRef = useRef<KodezenPlayerInstance | null>(null);\n const propsRef = useRef(props);\n propsRef.current = props;\n\n useImperativeHandle(ref, () => ({\n play: () => playerRef.current?.play(),\n pause: () => playerRef.current?.pause(),\n toggle: () => playerRef.current?.toggle(),\n seek: (s: number) => playerRef.current?.seek(s),\n setLockSeek: (locked: boolean) => playerRef.current?.setLockSeek(locked),\n getState: () =>\n playerRef.current?.getState() ?? {\n current: 0,\n furthest: 0,\n duration: 0,\n percent: 0,\n playing: false,\n },\n on: (event, cb) => playerRef.current?.on(event, cb) ?? (() => {}),\n off: (event, cb) => playerRef.current?.off(event, cb),\n destroy: () => playerRef.current?.destroy(),\n }));\n\n // Re-mount when the source identity changes.\n const sourceKey = `${props.source.type}|${props.source.url ?? ''}|${props.source.id ?? ''}`;\n\n useEffect(() => {\n if (!hostRef.current) return;\n const p = propsRef.current;\n const player = createPlayer(hostRef.current, {\n source: p.source,\n resumeAt: p.resumeAt,\n lockSeek: p.lockSeek,\n autoplay: p.autoplay,\n muted: p.muted,\n speeds: p.speeds,\n controls: p.controls,\n className: p.className,\n });\n playerRef.current = player;\n\n const offs = [\n player.on('ready', (x) => propsRef.current.onReady?.(x)),\n player.on('timeupdate', (x) => propsRef.current.onTimeUpdate?.(x)),\n player.on('play', () => propsRef.current.onPlay?.()),\n player.on('pause', () => propsRef.current.onPause?.()),\n player.on('ended', () => propsRef.current.onEnded?.()),\n player.on('error', (m) => propsRef.current.onError?.(m)),\n ];\n\n return () => {\n for (const off of offs) off();\n player.destroy();\n playerRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sourceKey]);\n\n // `lockSeek` can flip after the player has already mounted for this\n // source (e.g. gate data arriving right after an optimistic first\n // render) — the mount effect above only re-runs on a source change, so\n // this keeps a live player's lock in sync without recreating it.\n useEffect(() => {\n playerRef.current?.setLockSeek(!!props.lockSeek);\n }, [props.lockSeek]);\n\n return (\n <div\n ref={hostRef}\n className={props.wrapperClassName}\n style={props.style}\n />\n );\n },\n);\n\nexport type {\n KodezenPlayerInstance,\n PlayerOptions,\n PlayerState,\n ReadyPayload,\n Source,\n SourceType,\n TimeUpdatePayload,\n} from '../types';\n"]}
@@ -0,0 +1,172 @@
1
+ /* @kodezen/player — control-bar styles. Import once: `@kodezen/player/styles.css`. */
2
+
3
+ .kzp {
4
+ position: relative;
5
+ width: 100%;
6
+ background: #000;
7
+ border-radius: 8px;
8
+ overflow: hidden;
9
+ font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
10
+ color: #fff;
11
+ }
12
+
13
+ .kzp-stage {
14
+ position: relative;
15
+ /* Without an explicit z-index, `position: relative` alone does NOT open a
16
+ stacking context — .kzp-hit-layer's z-index would then be compared
17
+ directly against .kzp-controls (a sibling, one level up) instead of
18
+ being contained in here, and could win despite being visually "behind"
19
+ the control bar. This scopes it correctly. */
20
+ z-index: 0;
21
+ width: 100%;
22
+ aspect-ratio: 16 / 9;
23
+ background: #000;
24
+ }
25
+
26
+ .kzp-media {
27
+ position: absolute;
28
+ inset: 0;
29
+ width: 100%;
30
+ height: 100%;
31
+ object-fit: contain;
32
+ display: block;
33
+ }
34
+
35
+ /* YouTube / Vimeo mount their iframe inside this host element. */
36
+ .kzp-embed,
37
+ .kzp-stage iframe {
38
+ position: absolute;
39
+ inset: 0;
40
+ width: 100%;
41
+ height: 100%;
42
+ border: 0;
43
+ }
44
+
45
+ /* Sits above the media/embed so the mouse never reaches it directly — see
46
+ the comment in Player.ts. Scoped inside .kzp-stage's own stacking context
47
+ (see its z-index above), so .kzp-controls — a later sibling of .kzp-stage —
48
+ still paints above this and stays clickable. */
49
+ .kzp-hit-layer {
50
+ position: absolute;
51
+ inset: 0;
52
+ z-index: 2;
53
+ cursor: pointer;
54
+ background: transparent;
55
+ }
56
+
57
+ .kzp-controls {
58
+ display: flex;
59
+ align-items: center;
60
+ gap: 8px;
61
+ padding: 8px 10px;
62
+ background: linear-gradient(180deg, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.7) 100%);
63
+ position: absolute;
64
+ left: 0;
65
+ right: 0;
66
+ bottom: 0;
67
+ transition: opacity 0.2s ease;
68
+ }
69
+
70
+ .kzp:not(:hover) .kzp-controls {
71
+ opacity: 0.85;
72
+ }
73
+
74
+ .kzp-controls button {
75
+ appearance: none;
76
+ border: 0;
77
+ background: transparent;
78
+ color: #fff;
79
+ cursor: pointer;
80
+ padding: 4px;
81
+ display: inline-flex;
82
+ align-items: center;
83
+ justify-content: center;
84
+ border-radius: 4px;
85
+ line-height: 0;
86
+ }
87
+
88
+ .kzp-controls button:hover {
89
+ background: rgba(255, 255, 255, 0.15);
90
+ }
91
+
92
+ .kzp-controls svg {
93
+ width: 22px;
94
+ height: 22px;
95
+ fill: currentColor;
96
+ }
97
+
98
+ .kzp-scrubber {
99
+ flex: 1 1 auto;
100
+ min-width: 60px;
101
+ accent-color: #fff;
102
+ cursor: pointer;
103
+ }
104
+
105
+ /* Non-interactive while seek-lock is on (blocked in JS — see Controls.ts)
106
+ but stays visually identical to the normal scrubber otherwise. Using
107
+ `pointer-events` here instead would also suppress this `cursor` rule,
108
+ since a pointer-events:none element is transparent to hit-testing and so
109
+ never gets to apply its own cursor. */
110
+ .kzp--locked .kzp-scrubber {
111
+ cursor: not-allowed;
112
+ }
113
+
114
+ .kzp-time {
115
+ font-size: 12px;
116
+ font-variant-numeric: tabular-nums;
117
+ white-space: nowrap;
118
+ opacity: 0.9;
119
+ }
120
+
121
+ .kzp-volume {
122
+ display: inline-flex;
123
+ align-items: center;
124
+ gap: 4px;
125
+ }
126
+
127
+ .kzp-vol-range {
128
+ width: 64px;
129
+ accent-color: #fff;
130
+ cursor: pointer;
131
+ }
132
+
133
+ .kzp-speed {
134
+ position: relative;
135
+ }
136
+
137
+ .kzp-speed-btn {
138
+ font-size: 12px;
139
+ font-weight: 600;
140
+ min-width: 34px;
141
+ }
142
+
143
+ .kzp-speed-menu {
144
+ position: absolute;
145
+ bottom: calc(100% + 6px);
146
+ right: 0;
147
+ background: rgba(20, 20, 20, 0.96);
148
+ border-radius: 6px;
149
+ padding: 4px;
150
+ display: flex;
151
+ flex-direction: column;
152
+ gap: 2px;
153
+ min-width: 64px;
154
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
155
+ }
156
+
157
+ .kzp-speed-menu[hidden] {
158
+ display: none;
159
+ }
160
+
161
+ .kzp-speed-menu button {
162
+ justify-content: flex-start;
163
+ font-size: 12px;
164
+ padding: 6px 10px;
165
+ width: 100%;
166
+ }
167
+
168
+ @media (max-width: 480px) {
169
+ .kzp-vol-range {
170
+ display: none;
171
+ }
172
+ }
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Public types for @kodezen/player.
3
+ *
4
+ * The library is intentionally tracking-free: it plays media, renders a control
5
+ * bar, emits progress events, and accepts a resume position. Persistence,
6
+ * completion gating, analytics, etc. are the host's responsibility.
7
+ */
8
+ type SourceType = 'html5' | 'external' | 'youtube' | 'vimeo';
9
+ interface Source {
10
+ type: SourceType;
11
+ /** Direct media URL (html5 / external mp4) or watch/embed URL (youtube / vimeo). */
12
+ url?: string;
13
+ /** Provider asset id (e.g. YouTube / Vimeo video id). Optional when `url` is given. */
14
+ id?: string;
15
+ /** Poster image shown before playback. */
16
+ poster?: string;
17
+ /** MIME type hint for html5 sources (defaults to video/mp4). */
18
+ mime?: string;
19
+ }
20
+ interface ControlsConfig {
21
+ playPause: boolean;
22
+ seek: boolean;
23
+ volume: boolean;
24
+ time: boolean;
25
+ speed: boolean;
26
+ fullscreen: boolean;
27
+ }
28
+ interface PlayerOptions {
29
+ source: Source;
30
+ /** Seconds to resume from on ready. Ignored if within 2s of the end. */
31
+ resumeAt?: number;
32
+ /**
33
+ * When true, the user cannot seek past the furthest point they have played.
34
+ * This is what keeps a furthest-position watch gate honest.
35
+ */
36
+ lockSeek?: boolean;
37
+ autoplay?: boolean;
38
+ muted?: boolean;
39
+ /** Playback rates offered in the speed menu. */
40
+ speeds?: number[];
41
+ /** Toggle individual controls off. Everything defaults to on. */
42
+ controls?: Partial<ControlsConfig>;
43
+ /** Extra class added to the player root for host styling. */
44
+ className?: string;
45
+ }
46
+ /** Emitted on every provider timeupdate. `percent` is furthest / duration. */
47
+ interface TimeUpdatePayload {
48
+ /** Current playhead position in seconds. */
49
+ current: number;
50
+ /** Furthest point reached by natural playback, in seconds. */
51
+ furthest: number;
52
+ /** Media duration in seconds (0 until known). */
53
+ duration: number;
54
+ /** Watched percentage 0..100, derived from furthest / duration. */
55
+ percent: number;
56
+ }
57
+ interface ReadyPayload {
58
+ duration: number;
59
+ }
60
+ interface PlayerEvents {
61
+ ready: (payload: ReadyPayload) => void;
62
+ play: () => void;
63
+ pause: () => void;
64
+ timeupdate: (payload: TimeUpdatePayload) => void;
65
+ durationchange: (duration: number) => void;
66
+ ended: () => void;
67
+ error: (message: string) => void;
68
+ }
69
+ /**
70
+ * Uniform interface every provider (html5, youtube, vimeo) implements so the
71
+ * orchestrator and control bar never touch a concrete media element.
72
+ */
73
+ interface ProviderEvents {
74
+ ready: () => void;
75
+ play: () => void;
76
+ pause: () => void;
77
+ timeupdate: (current: number) => void;
78
+ durationchange: (duration: number) => void;
79
+ ended: () => void;
80
+ error: (message: string) => void;
81
+ }
82
+ interface ProviderCapabilities {
83
+ /** Provider can report/scrub arbitrary positions (false for opaque embeds). */
84
+ seekable: boolean;
85
+ /** Provider supports playback-rate changes. */
86
+ rate: boolean;
87
+ /** Provider supports independent volume control. */
88
+ volume: boolean;
89
+ }
90
+ interface Provider {
91
+ readonly capabilities: ProviderCapabilities;
92
+ mount(container: HTMLElement): void | Promise<void>;
93
+ play(): void;
94
+ pause(): void;
95
+ seek(seconds: number): void;
96
+ getCurrentTime(): number;
97
+ getDuration(): number;
98
+ setVolume(v: number): void;
99
+ getVolume(): number;
100
+ setMuted(m: boolean): void;
101
+ isMuted(): boolean;
102
+ setRate(r: number): void;
103
+ getRate(): number;
104
+ isPlaying(): boolean;
105
+ on<K extends keyof ProviderEvents>(event: K, cb: ProviderEvents[K]): () => void;
106
+ destroy(): void;
107
+ }
108
+ interface PlayerState {
109
+ current: number;
110
+ furthest: number;
111
+ duration: number;
112
+ percent: number;
113
+ playing: boolean;
114
+ }
115
+ interface KodezenPlayerInstance {
116
+ play(): void;
117
+ pause(): void;
118
+ toggle(): void;
119
+ seek(seconds: number): void;
120
+ /** Update the seek lock on a live player without recreating it. */
121
+ setLockSeek(locked: boolean): void;
122
+ getState(): PlayerState;
123
+ on<K extends keyof PlayerEvents>(event: K, cb: PlayerEvents[K]): () => void;
124
+ off<K extends keyof PlayerEvents>(event: K, cb: PlayerEvents[K]): void;
125
+ destroy(): void;
126
+ }
127
+
128
+ export type { ControlsConfig as C, KodezenPlayerInstance as K, PlayerOptions as P, ReadyPayload as R, Source as S, TimeUpdatePayload as T, PlayerState as a, PlayerEvents as b, Provider as c, ProviderCapabilities as d, ProviderEvents as e, SourceType as f };
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Public types for @kodezen/player.
3
+ *
4
+ * The library is intentionally tracking-free: it plays media, renders a control
5
+ * bar, emits progress events, and accepts a resume position. Persistence,
6
+ * completion gating, analytics, etc. are the host's responsibility.
7
+ */
8
+ type SourceType = 'html5' | 'external' | 'youtube' | 'vimeo';
9
+ interface Source {
10
+ type: SourceType;
11
+ /** Direct media URL (html5 / external mp4) or watch/embed URL (youtube / vimeo). */
12
+ url?: string;
13
+ /** Provider asset id (e.g. YouTube / Vimeo video id). Optional when `url` is given. */
14
+ id?: string;
15
+ /** Poster image shown before playback. */
16
+ poster?: string;
17
+ /** MIME type hint for html5 sources (defaults to video/mp4). */
18
+ mime?: string;
19
+ }
20
+ interface ControlsConfig {
21
+ playPause: boolean;
22
+ seek: boolean;
23
+ volume: boolean;
24
+ time: boolean;
25
+ speed: boolean;
26
+ fullscreen: boolean;
27
+ }
28
+ interface PlayerOptions {
29
+ source: Source;
30
+ /** Seconds to resume from on ready. Ignored if within 2s of the end. */
31
+ resumeAt?: number;
32
+ /**
33
+ * When true, the user cannot seek past the furthest point they have played.
34
+ * This is what keeps a furthest-position watch gate honest.
35
+ */
36
+ lockSeek?: boolean;
37
+ autoplay?: boolean;
38
+ muted?: boolean;
39
+ /** Playback rates offered in the speed menu. */
40
+ speeds?: number[];
41
+ /** Toggle individual controls off. Everything defaults to on. */
42
+ controls?: Partial<ControlsConfig>;
43
+ /** Extra class added to the player root for host styling. */
44
+ className?: string;
45
+ }
46
+ /** Emitted on every provider timeupdate. `percent` is furthest / duration. */
47
+ interface TimeUpdatePayload {
48
+ /** Current playhead position in seconds. */
49
+ current: number;
50
+ /** Furthest point reached by natural playback, in seconds. */
51
+ furthest: number;
52
+ /** Media duration in seconds (0 until known). */
53
+ duration: number;
54
+ /** Watched percentage 0..100, derived from furthest / duration. */
55
+ percent: number;
56
+ }
57
+ interface ReadyPayload {
58
+ duration: number;
59
+ }
60
+ interface PlayerEvents {
61
+ ready: (payload: ReadyPayload) => void;
62
+ play: () => void;
63
+ pause: () => void;
64
+ timeupdate: (payload: TimeUpdatePayload) => void;
65
+ durationchange: (duration: number) => void;
66
+ ended: () => void;
67
+ error: (message: string) => void;
68
+ }
69
+ /**
70
+ * Uniform interface every provider (html5, youtube, vimeo) implements so the
71
+ * orchestrator and control bar never touch a concrete media element.
72
+ */
73
+ interface ProviderEvents {
74
+ ready: () => void;
75
+ play: () => void;
76
+ pause: () => void;
77
+ timeupdate: (current: number) => void;
78
+ durationchange: (duration: number) => void;
79
+ ended: () => void;
80
+ error: (message: string) => void;
81
+ }
82
+ interface ProviderCapabilities {
83
+ /** Provider can report/scrub arbitrary positions (false for opaque embeds). */
84
+ seekable: boolean;
85
+ /** Provider supports playback-rate changes. */
86
+ rate: boolean;
87
+ /** Provider supports independent volume control. */
88
+ volume: boolean;
89
+ }
90
+ interface Provider {
91
+ readonly capabilities: ProviderCapabilities;
92
+ mount(container: HTMLElement): void | Promise<void>;
93
+ play(): void;
94
+ pause(): void;
95
+ seek(seconds: number): void;
96
+ getCurrentTime(): number;
97
+ getDuration(): number;
98
+ setVolume(v: number): void;
99
+ getVolume(): number;
100
+ setMuted(m: boolean): void;
101
+ isMuted(): boolean;
102
+ setRate(r: number): void;
103
+ getRate(): number;
104
+ isPlaying(): boolean;
105
+ on<K extends keyof ProviderEvents>(event: K, cb: ProviderEvents[K]): () => void;
106
+ destroy(): void;
107
+ }
108
+ interface PlayerState {
109
+ current: number;
110
+ furthest: number;
111
+ duration: number;
112
+ percent: number;
113
+ playing: boolean;
114
+ }
115
+ interface KodezenPlayerInstance {
116
+ play(): void;
117
+ pause(): void;
118
+ toggle(): void;
119
+ seek(seconds: number): void;
120
+ /** Update the seek lock on a live player without recreating it. */
121
+ setLockSeek(locked: boolean): void;
122
+ getState(): PlayerState;
123
+ on<K extends keyof PlayerEvents>(event: K, cb: PlayerEvents[K]): () => void;
124
+ off<K extends keyof PlayerEvents>(event: K, cb: PlayerEvents[K]): void;
125
+ destroy(): void;
126
+ }
127
+
128
+ export type { ControlsConfig as C, KodezenPlayerInstance as K, PlayerOptions as P, ReadyPayload as R, Source as S, TimeUpdatePayload as T, PlayerState as a, PlayerEvents as b, Provider as c, ProviderCapabilities as d, ProviderEvents as e, SourceType as f };