@kodezen/player 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -93,8 +93,7 @@ var Html5Provider = class {
93
93
  }
94
94
  }
95
95
  play() {
96
- void this.video.play().catch(() => {
97
- });
96
+ void this.video.play().catch(() => this.emitter.emit("pause"));
98
97
  }
99
98
  pause() {
100
99
  this.video.pause();
@@ -376,8 +375,8 @@ var VimeoProvider = class {
376
375
  this.emitter.emit("ready");
377
376
  }
378
377
  play() {
379
- var _a, _b;
380
- void ((_b = (_a = this.player) == null ? void 0 : _a.play) == null ? void 0 : _b.call(_a));
378
+ var _a, _b, _c, _d;
379
+ (_d = (_c = (_b = (_a = this.player) == null ? void 0 : _a.play) == null ? void 0 : _b.call(_a)) == null ? void 0 : _c.catch) == null ? void 0 : _d.call(_c, () => this.emitter.emit("pause"));
381
380
  }
382
381
  pause() {
383
382
  var _a, _b;
@@ -591,7 +590,17 @@ var Controls = class {
591
590
  constructor(cb, opts) {
592
591
  this.cb = cb;
593
592
  this.ccActive = -1;
593
+ // Icons currently drawn, so update() only rewrites a button's SVG when it
594
+ // actually changes (see update()).
595
+ this.playIcon = "";
596
+ this.volIcon = "";
594
597
  this.scrubbing = false;
598
+ this.rate = 0;
599
+ this.onOutsideClick = (e) => {
600
+ if (this.el.contains(e.target)) return;
601
+ if (this.speedMenu) this.speedMenu.hidden = true;
602
+ if (this.ccMenu) this.ccMenu.hidden = true;
603
+ };
595
604
  this.seekableMax = Infinity;
596
605
  var _a;
597
606
  this.config = { ...DEFAULT_CONFIG, ...opts.config };
@@ -599,6 +608,7 @@ var Controls = class {
599
608
  this.el = document.createElement("div");
600
609
  this.el.className = "kzp-controls";
601
610
  this.build(opts.speeds, (_a = opts.captionLabels) != null ? _a : []);
611
+ document.addEventListener("click", this.onOutsideClick);
602
612
  }
603
613
  build(speeds, captionLabels) {
604
614
  if (this.config.playPause) {
@@ -759,9 +769,14 @@ var Controls = class {
759
769
  }
760
770
  /** Push the latest state into the DOM. Called on every player timeupdate. */
761
771
  update(state, extras) {
772
+ var _a;
762
773
  if (this.playBtn) {
763
- this.playBtn.innerHTML = icon(state.playing ? ICONS.pause : ICONS.play);
764
- this.playBtn.setAttribute("aria-label", state.playing ? "Pause" : "Play");
774
+ const next = state.playing ? ICONS.pause : ICONS.play;
775
+ if (next !== this.playIcon) {
776
+ this.playIcon = next;
777
+ this.playBtn.innerHTML = icon(next);
778
+ this.playBtn.setAttribute("aria-label", state.playing ? "Pause" : "Play");
779
+ }
765
780
  }
766
781
  if (this.scrubber) {
767
782
  this.seekableMax = this.lockSeek ? state.furthest : Infinity;
@@ -772,14 +787,25 @@ var Controls = class {
772
787
  this.timeEl.textContent = `${fmt(state.current)} / ${fmt(state.duration)}`;
773
788
  }
774
789
  if (this.volBtn) {
775
- this.volBtn.innerHTML = icon(extras.muted || extras.volume === 0 ? ICONS.muted : ICONS.volume);
790
+ const next = extras.muted || extras.volume === 0 ? ICONS.muted : ICONS.volume;
791
+ if (next !== this.volIcon) {
792
+ this.volIcon = next;
793
+ this.volBtn.innerHTML = icon(next);
794
+ }
776
795
  }
777
796
  if (this.volRange && document.activeElement !== this.volRange) {
778
797
  this.volRange.value = String(extras.muted ? 0 : extras.volume);
779
798
  }
780
- if (this.speedBtn) this.speedBtn.textContent = `${extras.rate}x`;
799
+ if (this.speedBtn && extras.rate !== this.rate) {
800
+ this.rate = extras.rate;
801
+ this.speedBtn.textContent = `${extras.rate}x`;
802
+ (_a = this.speedMenu) == null ? void 0 : _a.querySelectorAll("button").forEach((item) => {
803
+ item.classList.toggle("kzp-menu-item--active", Number(item.dataset.rate) === extras.rate);
804
+ });
805
+ }
781
806
  }
782
807
  destroy() {
808
+ document.removeEventListener("click", this.onOutsideClick);
783
809
  this.el.remove();
784
810
  }
785
811
  };
@@ -941,15 +967,24 @@ var Player = class {
941
967
  }
942
968
  }
943
969
  // ---- Public API ----
970
+ // play()/pause() record the intent at once instead of waiting for the
971
+ // provider to confirm: YouTube only reports PLAYING after buffering, and
972
+ // until then a second click read "not playing" and called play() again
973
+ // (a no-op) instead of pausing. The provider's play/pause/ended events
974
+ // still correct it, e.g. when the browser blocks playback.
944
975
  play() {
976
+ this.playing = true;
945
977
  this.provider.play();
978
+ this.render();
946
979
  }
947
980
  pause() {
981
+ this.playing = false;
948
982
  this.provider.pause();
983
+ this.render();
949
984
  }
950
985
  toggle() {
951
- if (this.provider.isPlaying()) this.provider.pause();
952
- else this.provider.play();
986
+ if (this.playing) this.pause();
987
+ else this.play();
953
988
  }
954
989
  seek(seconds) {
955
990
  var _a;
@@ -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/Captions.ts","../src/core/Controls.ts","../src/core/Player.ts","../src/index.ts"],"names":["apiPromise","loadApi","_a"],"mappings":"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","file":"index.cjs","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"]}
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.cjs","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 // A rejected play (autoplay/gesture policy) never starts — report it as\n // paused so the player drops its optimistic \"playing\" state.\n void this.video.play().catch(() => this.emitter.emit('pause'));\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 // A rejected play (autoplay policy) never starts — report it as paused\n // so the player drops its optimistic \"playing\" state.\n this.player?.play?.()?.catch?.(() => this.emitter.emit('pause'));\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 // Icons currently drawn, so update() only rewrites a button's SVG when it\n // actually changes (see update()).\n private playIcon = '';\n private volIcon = '';\n\n private scrubbing = false;\n private rate = 0;\n private onOutsideClick = (e: MouseEvent) => {\n // Close an open menu when clicking anywhere outside the control bar.\n if (this.el.contains(e.target as Node)) return;\n if (this.speedMenu) this.speedMenu.hidden = true;\n if (this.ccMenu) this.ccMenu.hidden = true;\n };\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 document.addEventListener('click', this.onOutsideClick);\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 // update() runs on every tick (~4/s). Rewriting a button's SVG each time\n // swapped the element under the pointer between mousedown and mouseup,\n // so the browser dropped the click — play/pause only worked once\n // playback stopped ticking. Only touch it when the icon changes.\n if (this.playBtn) {\n const next = state.playing ? ICONS.pause : ICONS.play;\n if (next !== this.playIcon) {\n this.playIcon = next;\n this.playBtn.innerHTML = icon(next);\n this.playBtn.setAttribute('aria-label', state.playing ? 'Pause' : 'Play');\n }\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 const next = extras.muted || extras.volume === 0 ? ICONS.muted : ICONS.volume;\n if (next !== this.volIcon) {\n this.volIcon = next;\n this.volBtn.innerHTML = icon(next);\n }\n }\n if (this.volRange && document.activeElement !== this.volRange) {\n this.volRange.value = String(extras.muted ? 0 : extras.volume);\n }\n if (this.speedBtn && extras.rate !== this.rate) {\n this.rate = extras.rate;\n this.speedBtn.textContent = `${extras.rate}x`;\n this.speedMenu?.querySelectorAll<HTMLButtonElement>('button').forEach((item) => {\n item.classList.toggle('kzp-menu-item--active', Number(item.dataset.rate) === extras.rate);\n });\n }\n }\n\n destroy(): void {\n document.removeEventListener('click', this.onOutsideClick);\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()/pause() record the intent at once instead of waiting for the\n // provider to confirm: YouTube only reports PLAYING after buffering, and\n // until then a second click read \"not playing\" and called play() again\n // (a no-op) instead of pausing. The provider's play/pause/ended events\n // still correct it, e.g. when the browser blocks playback.\n play(): void {\n this.playing = true;\n this.provider.play();\n this.render();\n }\n\n pause(): void {\n this.playing = false;\n this.provider.pause();\n this.render();\n }\n\n toggle(): void {\n if (this.playing) this.pause();\n else this.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"]}