@livepeer-frameworks/player-wc 0.2.7 → 0.2.9
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/LICENSE.md +24 -0
- package/README.md +30 -30
- package/dist/esm/components/controls/fw-skip-button.js +1 -1
- package/dist/esm/components/controls/fw-skip-button.js.map +1 -1
- package/dist/esm/components/fw-dev-mode-panel.js +21 -11
- package/dist/esm/components/fw-dev-mode-panel.js.map +1 -1
- package/dist/esm/components/fw-player-controls.js +6 -5
- package/dist/esm/components/fw-player-controls.js.map +1 -1
- package/dist/esm/components/fw-player.js +17 -13
- package/dist/esm/components/fw-player.js.map +1 -1
- package/dist/esm/components/fw-seek-bar.js +18 -10
- package/dist/esm/components/fw-seek-bar.js.map +1 -1
- package/dist/esm/components/fw-subtitle-renderer.js +2 -2
- package/dist/esm/components/fw-subtitle-renderer.js.map +1 -1
- package/dist/esm/controllers/player-controller-host.js +6 -2
- package/dist/esm/controllers/player-controller-host.js.map +1 -1
- package/dist/esm/styles/shared-styles.js +40 -4
- package/dist/esm/styles/shared-styles.js.map +1 -1
- package/dist/fw-player.iife.js +250 -203
- package/package.json +15 -15
- package/src/components/controls/fw-skip-button.ts +1 -1
- package/src/components/fw-dev-mode-panel.ts +21 -11
- package/src/components/fw-player-controls.ts +10 -7
- package/src/components/fw-player.ts +17 -13
- package/src/components/fw-seek-bar.ts +18 -10
- package/src/components/fw-subtitle-renderer.ts +2 -2
- package/src/controllers/player-controller-host.ts +6 -2
- package/src/styles/shared-styles.ts +40 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fw-seek-bar.js","sources":["../../../../src/components/fw-seek-bar.ts"],"sourcesContent":["/**\n * <fw-seek-bar> — Video seek bar with buffer visualization, drag, and live tooltips.\n * Behavioral parity with react/svelte SeekBar implementations.\n */\nimport { LitElement, html, css, nothing } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { sharedStyles } from \"../styles/shared-styles.js\";\n\ninterface BufferedSegment {\n startPercent: number;\n endPercent: number;\n}\n\n@customElement(\"fw-seek-bar\")\nexport class FwSeekBar extends LitElement {\n @property({ type: Number }) currentTime = 0;\n @property({ type: Number }) duration = 0;\n @property({ attribute: false }) buffered: TimeRanges | null = null;\n @property({ type: Boolean }) disabled = false;\n @property({ type: Boolean, attribute: \"is-live\" }) isLive = false;\n @property({ type: Number, attribute: \"seekable-start\" }) seekableStart = 0;\n @property({ type: Number, attribute: \"live-edge\" }) liveEdge?: number;\n @property({ type: Boolean, attribute: \"commit-on-release\" }) commitOnRelease = false;\n\n @state() private _hovering = false;\n @state() private _dragging = false;\n @state() private _dragTime: number | null = null;\n @state() private _hoverPosition = 0;\n @state() private _hoverTime = 0;\n\n private _trackRect: DOMRect | null = null;\n private _activePointerId: number | null = null;\n\n static styles = [\n sharedStyles,\n css`\n :host {\n display: block;\n width: 100%;\n }\n\n .seek-root {\n position: relative;\n width: 100%;\n height: 1.5rem;\n display: flex;\n align-items: center;\n cursor: pointer;\n }\n\n .seek-root--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `,\n ];\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._detachDragListeners();\n }\n\n private get _effectiveLiveEdge(): number {\n if (typeof this.liveEdge === \"number\" && Number.isFinite(this.liveEdge)) {\n return this.liveEdge;\n }\n return this.duration;\n }\n\n private get _seekableWindow(): number {\n return this._effectiveLiveEdge - this.seekableStart;\n }\n\n private get _displayTime(): number {\n return this._dragTime ?? this.currentTime;\n }\n\n private get _progressPercent(): number {\n const displayTime = this._displayTime;\n\n if (this.isLive && this._seekableWindow > 0) {\n const positionInWindow = displayTime - this.seekableStart;\n return Math.min(100, Math.max(0, (positionInWindow / this._seekableWindow) * 100));\n }\n\n if (!Number.isFinite(this.duration) || this.duration <= 0) {\n return 0;\n }\n\n return Math.min(100, Math.max(0, (displayTime / this.duration) * 100));\n }\n\n private get _bufferedSegments(): BufferedSegment[] {\n const buffered = this.buffered;\n if (!buffered || buffered.length === 0) {\n return [];\n }\n\n const rangeEnd = this.isLive ? this._effectiveLiveEdge : this.duration;\n const rangeStart = this.isLive ? this.seekableStart : 0;\n const rangeSize = rangeEnd - rangeStart;\n\n if (!Number.isFinite(rangeSize) || rangeSize <= 0) {\n return [];\n }\n\n const segments: BufferedSegment[] = [];\n for (let i = 0; i < buffered.length; i += 1) {\n const start = buffered.start(i);\n const end = buffered.end(i);\n const relativeStart = start - rangeStart;\n const relativeEnd = end - rangeStart;\n\n segments.push({\n startPercent: Math.min(100, Math.max(0, (relativeStart / rangeSize) * 100)),\n endPercent: Math.min(100, Math.max(0, (relativeEnd / rangeSize) * 100)),\n });\n }\n\n return segments;\n }\n\n private _formatTime(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds < 0) {\n return \"0:00\";\n }\n\n const total = Math.floor(seconds);\n const hours = Math.floor(total / 3600);\n const minutes = Math.floor((total % 3600) / 60);\n const secs = total % 60;\n\n if (hours > 0) {\n return `${hours}:${String(minutes).padStart(2, \"0\")}:${String(secs).padStart(2, \"0\")}`;\n }\n\n return `${minutes}:${String(secs).padStart(2, \"0\")}`;\n }\n\n private _formatLiveTime(seconds: number, edge: number): string {\n const behindSeconds = edge - seconds;\n if (behindSeconds < 1) {\n return \"LIVE\";\n }\n\n const total = Math.floor(behindSeconds);\n const hours = Math.floor(total / 3600);\n const minutes = Math.floor((total % 3600) / 60);\n const secs = total % 60;\n\n if (hours > 0) {\n return `-${hours}:${String(minutes).padStart(2, \"0\")}:${String(secs).padStart(2, \"0\")}`;\n }\n\n return `-${minutes}:${String(secs).padStart(2, \"0\")}`;\n }\n\n private _getTrackRect(): DOMRect | null {\n const track = this.renderRoot.querySelector(\".seek-root\") as HTMLDivElement | null;\n if (!track) {\n return null;\n }\n\n this._trackRect = track.getBoundingClientRect();\n return this._trackRect;\n }\n\n private _getTimeFromClientX(clientX: number): number {\n const rect = this._getTrackRect();\n if (!rect || rect.width <= 0) {\n return 0;\n }\n\n const x = clientX - rect.left;\n const percent = Math.min(1, Math.max(0, x / rect.width));\n\n if (this.isLive && Number.isFinite(this._seekableWindow) && this._seekableWindow > 0) {\n return this.seekableStart + percent * this._seekableWindow;\n }\n\n if (Number.isFinite(this.duration) && this.duration > 0) {\n return percent * this.duration;\n }\n\n if (Number.isFinite(this._effectiveLiveEdge) && this._effectiveLiveEdge > 0) {\n const start = Number.isFinite(this.seekableStart) ? this.seekableStart : 0;\n const window = this._effectiveLiveEdge - start;\n if (window > 0) {\n return start + percent * window;\n }\n }\n\n return percent * (this.currentTime || 1);\n }\n\n private _updateHover(clientX: number): void {\n const rect = this._getTrackRect();\n if (!rect || rect.width <= 0) {\n return;\n }\n\n const x = clientX - rect.left;\n const percent = Math.min(1, Math.max(0, x / rect.width));\n this._hoverPosition = percent * 100;\n this._hoverTime = this._getTimeFromClientX(clientX);\n }\n\n private _emitSeek(time: number): void {\n this.dispatchEvent(\n new CustomEvent(\"fw-seek\", { detail: { time }, bubbles: true, composed: true })\n );\n }\n\n private _onKeyDown = (event: KeyboardEvent) => {\n if (this.disabled) {\n return;\n }\n\n const step = event.shiftKey ? 10 : 5;\n const rawRangeEnd = this.isLive ? this._effectiveLiveEdge : this.duration;\n const rangeEnd = Number.isFinite(rawRangeEnd) ? rawRangeEnd : this.currentTime + step;\n const rangeStart = this.isLive ? this.seekableStart : 0;\n\n let newTime: number | null = null;\n switch (event.key) {\n case \"ArrowLeft\":\n case \"ArrowDown\":\n newTime = Math.max(rangeStart, this.currentTime - step);\n break;\n case \"ArrowRight\":\n case \"ArrowUp\":\n newTime = Math.min(rangeEnd, this.currentTime + step);\n break;\n case \"Home\":\n newTime = rangeStart;\n break;\n case \"End\":\n newTime = rangeEnd;\n break;\n default:\n return;\n }\n\n if (newTime != null) {\n event.preventDefault();\n this._emitSeek(newTime);\n }\n };\n\n private _onPointerEnter = () => {\n if (this.disabled) {\n return;\n }\n this._hovering = true;\n };\n\n private _onPointerLeave = () => {\n this._hovering = false;\n this._trackRect = null;\n };\n\n private _onPointerMove = (event: PointerEvent) => {\n if (this.disabled || (!this._hovering && !this._dragging)) {\n return;\n }\n this._updateHover(event.clientX);\n };\n\n private _onPointerDown = (event: PointerEvent) => {\n if (this.disabled) {\n return;\n }\n\n if (!this.isLive && !Number.isFinite(this.duration)) {\n return;\n }\n\n event.preventDefault();\n this._activePointerId = event.pointerId;\n this._dragging = true;\n this._hovering = true;\n\n const initialTime = this._getTimeFromClientX(event.clientX);\n this._updateHover(event.clientX);\n\n if (this.commitOnRelease) {\n this._dragTime = initialTime;\n } else {\n this._emitSeek(initialTime);\n }\n\n this._attachDragListeners();\n };\n\n private _onGlobalPointerMove = (event: PointerEvent) => {\n if (!this._dragging || this._activePointerId !== event.pointerId) {\n return;\n }\n\n const time = this._getTimeFromClientX(event.clientX);\n this._updateHover(event.clientX);\n\n if (this.commitOnRelease) {\n this._dragTime = time;\n } else {\n this._emitSeek(time);\n }\n };\n\n private _onGlobalPointerUp = (event: PointerEvent) => {\n if (!this._dragging || this._activePointerId !== event.pointerId) {\n return;\n }\n\n if (this.commitOnRelease && this._dragTime != null) {\n this._emitSeek(this._dragTime);\n }\n\n this._dragging = false;\n this._dragTime = null;\n this._activePointerId = null;\n this._detachDragListeners();\n };\n\n private _attachDragListeners(): void {\n window.addEventListener(\"pointermove\", this._onGlobalPointerMove);\n window.addEventListener(\"pointerup\", this._onGlobalPointerUp);\n window.addEventListener(\"pointercancel\", this._onGlobalPointerUp);\n }\n\n private _detachDragListeners(): void {\n window.removeEventListener(\"pointermove\", this._onGlobalPointerMove);\n window.removeEventListener(\"pointerup\", this._onGlobalPointerUp);\n window.removeEventListener(\"pointercancel\", this._onGlobalPointerUp);\n }\n\n protected render() {\n const progressPercent = this._progressPercent;\n const showThumb = this._hovering || this._dragging;\n const canShowTooltip = this.isLive ? this._seekableWindow > 0 : Number.isFinite(this.duration);\n\n return html`\n <div\n class=${classMap({\n \"seek-root\": true,\n \"seek-root--disabled\": this.disabled,\n \"fw-seek-root\": true,\n })}\n @pointerenter=${this._onPointerEnter}\n @pointerleave=${this._onPointerLeave}\n @pointermove=${this._onPointerMove}\n @pointerdown=${this._onPointerDown}\n role=\"slider\"\n aria-label=\"Seek\"\n aria-valuemin=${this.isLive ? this.seekableStart : 0}\n aria-valuemax=${this.isLive\n ? this._effectiveLiveEdge\n : Number.isFinite(this.duration)\n ? this.duration\n : 100}\n aria-valuenow=${this._displayTime}\n aria-valuetext=${this.isLive\n ? this._formatLiveTime(this._displayTime, this._effectiveLiveEdge)\n : this._formatTime(this._displayTime)}\n tabindex=${this.disabled ? -1 : 0}\n @keydown=${this._onKeyDown}\n >\n <div class=${classMap({ \"fw-seek-track\": true, \"fw-seek-track--active\": this._dragging })}>\n ${this._bufferedSegments.map(\n (segment) => html`\n <div\n class=\"fw-seek-buffered\"\n style=${styleMap({\n left: `${segment.startPercent}%`,\n width: `${segment.endPercent - segment.startPercent}%`,\n })}\n ></div>\n `\n )}\n <div class=\"fw-seek-progress\" style=${styleMap({ width: `${progressPercent}%` })}></div>\n </div>\n\n <div\n class=${classMap({\n \"fw-seek-thumb\": true,\n \"fw-seek-thumb--active\": showThumb,\n \"fw-seek-thumb--hidden\": !showThumb,\n })}\n style=${styleMap({ left: `${progressPercent}%` })}\n ></div>\n\n ${this._hovering && !this._dragging && canShowTooltip\n ? html`\n <div class=\"fw-seek-tooltip\" style=${styleMap({ left: `${this._hoverPosition}%` })}>\n ${this.isLive\n ? this._formatLiveTime(this._hoverTime, this._effectiveLiveEdge)\n : this._formatTime(this._hoverTime)}\n </div>\n `\n : nothing}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-seek-bar\": FwSeekBar;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fw-seek-bar.js","sources":["../../../../src/components/fw-seek-bar.ts"],"sourcesContent":["/**\n * <fw-seek-bar> — Video seek bar with buffer visualization, drag, and live tooltips.\n * Behavioral parity with react/svelte SeekBar implementations.\n */\nimport { LitElement, html, css, nothing } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { sharedStyles } from \"../styles/shared-styles.js\";\n\ninterface BufferedSegment {\n startPercent: number;\n endPercent: number;\n}\n\n@customElement(\"fw-seek-bar\")\nexport class FwSeekBar extends LitElement {\n @property({ type: Number }) currentTime = 0;\n @property({ type: Number }) duration = 0;\n @property({ attribute: false }) buffered: TimeRanges | null = null;\n @property({ type: Boolean }) disabled = false;\n @property({ type: Boolean, attribute: \"is-live\" }) isLive = false;\n @property({ type: Number, attribute: \"seekable-start\" }) seekableStart = 0;\n @property({ type: Number, attribute: \"live-edge\" }) liveEdge?: number;\n @property({ type: Boolean, attribute: \"commit-on-release\" }) commitOnRelease = false;\n\n @state() private _hovering = false;\n @state() private _dragging = false;\n @state() private _dragTime: number | null = null;\n @state() private _hoverPosition = 0;\n @state() private _hoverTime = 0;\n\n private _trackRect: DOMRect | null = null;\n private _activePointerId: number | null = null;\n\n static styles = [\n sharedStyles,\n css`\n :host {\n display: block;\n width: 100%;\n }\n\n .seek-root {\n position: relative;\n width: 100%;\n height: 1.5rem;\n display: flex;\n align-items: center;\n cursor: pointer;\n }\n\n .seek-root--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n `,\n ];\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._detachDragListeners();\n }\n\n private get _effectiveLiveEdge(): number {\n if (typeof this.liveEdge === \"number\" && Number.isFinite(this.liveEdge)) {\n return this.liveEdge;\n }\n return this.duration;\n }\n\n private get _seekableWindow(): number {\n return this._effectiveLiveEdge - this.seekableStart;\n }\n\n private get _displayTime(): number {\n return this._dragTime ?? this.currentTime;\n }\n\n private get _progressPercent(): number {\n const displayTime = this._displayTime;\n\n if (this.isLive && this._seekableWindow > 0) {\n const positionInWindow = displayTime - this.seekableStart;\n return Math.min(100, Math.max(0, (positionInWindow / this._seekableWindow) * 100));\n }\n\n if (!Number.isFinite(this.duration) || this.duration <= 0) {\n return 0;\n }\n\n return Math.min(100, Math.max(0, (displayTime / this.duration) * 100));\n }\n\n private get _bufferedSegments(): BufferedSegment[] {\n const buffered = this.buffered;\n if (!buffered || buffered.length === 0) {\n return [];\n }\n\n const rangeEnd = this.isLive ? this._effectiveLiveEdge : this.duration;\n const rangeStart = this.isLive ? this.seekableStart : 0;\n const rangeSize = rangeEnd - rangeStart;\n\n if (!Number.isFinite(rangeSize) || rangeSize <= 0) {\n return [];\n }\n\n const segments: BufferedSegment[] = [];\n for (let i = 0; i < buffered.length; i += 1) {\n // buffered TimeRanges are in seconds (browser API), convert to ms\n const start = buffered.start(i) * 1000;\n const end = buffered.end(i) * 1000;\n const relativeStart = start - rangeStart;\n const relativeEnd = end - rangeStart;\n\n segments.push({\n startPercent: Math.min(100, Math.max(0, (relativeStart / rangeSize) * 100)),\n endPercent: Math.min(100, Math.max(0, (relativeEnd / rangeSize) * 100)),\n });\n }\n\n return segments;\n }\n\n private _formatTime(ms: number): string {\n if (!Number.isFinite(ms) || ms < 0) {\n return \"0:00\";\n }\n\n const total = Math.floor(ms / 1000);\n const hours = Math.floor(total / 3600);\n const minutes = Math.floor((total % 3600) / 60);\n const secs = total % 60;\n\n if (hours > 0) {\n return `${hours}:${String(minutes).padStart(2, \"0\")}:${String(secs).padStart(2, \"0\")}`;\n }\n\n return `${minutes}:${String(secs).padStart(2, \"0\")}`;\n }\n\n private _formatLiveTime(ms: number, edgeMs: number): string {\n const behindMs = edgeMs - ms;\n if (behindMs < 1000) {\n return \"LIVE\";\n }\n\n const total = Math.floor(behindMs / 1000);\n const hours = Math.floor(total / 3600);\n const minutes = Math.floor((total % 3600) / 60);\n const secs = total % 60;\n\n if (hours > 0) {\n return `-${hours}:${String(minutes).padStart(2, \"0\")}:${String(secs).padStart(2, \"0\")}`;\n }\n\n return `-${minutes}:${String(secs).padStart(2, \"0\")}`;\n }\n\n private _getTrackRect(): DOMRect | null {\n const track = this.renderRoot.querySelector(\".seek-root\") as HTMLDivElement | null;\n if (!track) {\n return null;\n }\n\n this._trackRect = track.getBoundingClientRect();\n return this._trackRect;\n }\n\n private _getTimeFromClientX(clientX: number): number {\n const rect = this._getTrackRect();\n if (!rect || rect.width <= 0) {\n return 0;\n }\n\n const x = clientX - rect.left;\n const percent = Math.min(1, Math.max(0, x / rect.width));\n\n if (this.isLive && Number.isFinite(this._seekableWindow) && this._seekableWindow > 0) {\n return this.seekableStart + percent * this._seekableWindow;\n }\n\n if (Number.isFinite(this.duration) && this.duration > 0) {\n return percent * this.duration;\n }\n\n if (Number.isFinite(this._effectiveLiveEdge) && this._effectiveLiveEdge > 0) {\n const start = Number.isFinite(this.seekableStart) ? this.seekableStart : 0;\n const window = this._effectiveLiveEdge - start;\n if (window > 0) {\n return start + percent * window;\n }\n }\n\n return percent * (this.currentTime || 1);\n }\n\n private _updateHover(clientX: number): void {\n const rect = this._getTrackRect();\n if (!rect || rect.width <= 0) {\n return;\n }\n\n const x = clientX - rect.left;\n const percent = Math.min(1, Math.max(0, x / rect.width));\n this._hoverPosition = percent * 100;\n this._hoverTime = this._getTimeFromClientX(clientX);\n }\n\n private _emitSeek(time: number): void {\n this.dispatchEvent(\n new CustomEvent(\"fw-seek\", { detail: { time }, bubbles: true, composed: true })\n );\n }\n\n private _onKeyDown = (event: KeyboardEvent) => {\n if (this.disabled) {\n return;\n }\n\n const step = event.shiftKey ? 10000 : 5000;\n const rawRangeEnd = this.isLive ? this._effectiveLiveEdge : this.duration;\n const rangeEnd = Number.isFinite(rawRangeEnd) ? rawRangeEnd : this.currentTime + step;\n const rangeStart = this.isLive ? this.seekableStart : 0;\n\n let newTime: number | null = null;\n switch (event.key) {\n case \"ArrowLeft\":\n case \"ArrowDown\":\n newTime = Math.max(rangeStart, this.currentTime - step);\n break;\n case \"ArrowRight\":\n case \"ArrowUp\":\n newTime = Math.min(rangeEnd, this.currentTime + step);\n break;\n case \"Home\":\n newTime = rangeStart;\n break;\n case \"End\":\n newTime = rangeEnd;\n break;\n default:\n return;\n }\n\n if (newTime != null) {\n event.preventDefault();\n this._emitSeek(newTime);\n }\n };\n\n private _onPointerEnter = () => {\n if (this.disabled) {\n return;\n }\n this._hovering = true;\n };\n\n private _onPointerLeave = () => {\n this._hovering = false;\n this._trackRect = null;\n };\n\n private _onPointerMove = (event: PointerEvent) => {\n if (this.disabled || (!this._hovering && !this._dragging)) {\n return;\n }\n this._updateHover(event.clientX);\n };\n\n private _onPointerDown = (event: PointerEvent) => {\n if (this.disabled) {\n return;\n }\n\n if (!this.isLive && !Number.isFinite(this.duration)) {\n return;\n }\n\n event.preventDefault();\n this._activePointerId = event.pointerId;\n this._dragging = true;\n this._hovering = true;\n\n const initialTime = this._getTimeFromClientX(event.clientX);\n this._updateHover(event.clientX);\n\n if (this.commitOnRelease) {\n this._dragTime = initialTime;\n } else {\n this._emitSeek(initialTime);\n }\n\n this._attachDragListeners();\n };\n\n private _onGlobalPointerMove = (event: PointerEvent) => {\n if (!this._dragging || this._activePointerId !== event.pointerId) {\n return;\n }\n\n const time = this._getTimeFromClientX(event.clientX);\n this._updateHover(event.clientX);\n\n if (this.commitOnRelease) {\n this._dragTime = time;\n } else {\n this._emitSeek(time);\n }\n };\n\n private _onGlobalPointerUp = (event: PointerEvent) => {\n if (!this._dragging || this._activePointerId !== event.pointerId) {\n return;\n }\n\n if (this.commitOnRelease && this._dragTime != null) {\n this._emitSeek(this._dragTime);\n }\n\n this._dragging = false;\n this._dragTime = null;\n this._activePointerId = null;\n this._detachDragListeners();\n };\n\n private _attachDragListeners(): void {\n window.addEventListener(\"pointermove\", this._onGlobalPointerMove);\n window.addEventListener(\"pointerup\", this._onGlobalPointerUp);\n window.addEventListener(\"pointercancel\", this._onGlobalPointerUp);\n }\n\n private _detachDragListeners(): void {\n window.removeEventListener(\"pointermove\", this._onGlobalPointerMove);\n window.removeEventListener(\"pointerup\", this._onGlobalPointerUp);\n window.removeEventListener(\"pointercancel\", this._onGlobalPointerUp);\n }\n\n protected render() {\n const progressPercent = this._progressPercent;\n const showThumb = this._hovering || this._dragging;\n const canShowTooltip = this.isLive ? this._seekableWindow > 0 : Number.isFinite(this.duration);\n\n return html`\n <div\n class=${classMap({\n \"seek-root\": true,\n \"seek-root--disabled\": this.disabled,\n \"fw-seek-root\": true,\n })}\n @pointerenter=${this._onPointerEnter}\n @pointerleave=${this._onPointerLeave}\n @pointermove=${this._onPointerMove}\n @pointerdown=${this._onPointerDown}\n role=\"slider\"\n aria-label=\"Seek\"\n aria-valuemin=${this.isLive ? this.seekableStart : 0}\n aria-valuemax=${this.isLive\n ? this._effectiveLiveEdge\n : Number.isFinite(this.duration)\n ? this.duration\n : 100}\n aria-valuenow=${this._displayTime}\n aria-valuetext=${this.isLive\n ? this._formatLiveTime(this._displayTime, this._effectiveLiveEdge)\n : this._formatTime(this._displayTime)}\n tabindex=${this.disabled ? -1 : 0}\n @keydown=${this._onKeyDown}\n >\n <div class=${classMap({ \"fw-seek-track\": true, \"fw-seek-track--active\": this._dragging })}>\n ${this._bufferedSegments.map(\n (segment) => html`\n <div\n class=\"fw-seek-buffered\"\n style=${styleMap({\n left: `${segment.startPercent}%`,\n width: `${segment.endPercent - segment.startPercent}%`,\n })}\n ></div>\n `\n )}\n <div class=\"fw-seek-progress\" style=${styleMap({ width: `${progressPercent}%` })}></div>\n ${this._hovering && !this._dragging\n ? html`<div\n class=\"fw-seek-hover-line\"\n style=${styleMap({ left: `${this._hoverPosition}%` })}\n ></div>`\n : nothing}\n ${this.isLive ? html`<div class=\"fw-seek-live-edge\"></div>` : nothing}\n </div>\n\n <div\n class=${classMap({\n \"fw-seek-thumb\": true,\n \"fw-seek-thumb--active\": showThumb,\n \"fw-seek-thumb--hidden\": !showThumb,\n })}\n style=${styleMap({ left: `${progressPercent}%` })}\n ></div>\n\n ${this._hovering && !this._dragging && canShowTooltip\n ? html`\n <div class=\"fw-seek-tooltip\" style=${styleMap({ left: `${this._hoverPosition}%` })}>\n ${this.isLive\n ? this._formatLiveTime(this._hoverTime, this._effectiveLiveEdge)\n : this._formatTime(this._hoverTime)}\n </div>\n `\n : nothing}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-seek-bar\": FwSeekBar;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -106,7 +106,7 @@ let FwSubtitleRenderer = class FwSubtitleRenderer extends LitElement {
|
|
|
106
106
|
}
|
|
107
107
|
return;
|
|
108
108
|
}
|
|
109
|
-
const currentTimeMs = this.currentTime
|
|
109
|
+
const currentTimeMs = this.currentTime;
|
|
110
110
|
const activeCue = this._getAllCues().find((cue) => currentTimeMs >= cue.startTime && currentTimeMs < cue.endTime);
|
|
111
111
|
const nextText = activeCue?.text ?? "";
|
|
112
112
|
if (nextText !== this._displayedText) {
|
|
@@ -117,7 +117,7 @@ let FwSubtitleRenderer = class FwSubtitleRenderer extends LitElement {
|
|
|
117
117
|
if (this._liveCues.length === 0) {
|
|
118
118
|
return;
|
|
119
119
|
}
|
|
120
|
-
const currentTimeMs = this.currentTime
|
|
120
|
+
const currentTimeMs = this.currentTime;
|
|
121
121
|
const filtered = this._liveCues.filter((cue) => {
|
|
122
122
|
const endTime = cue.endTime === Infinity ? cue.startTime + 10000 : cue.endTime;
|
|
123
123
|
return endTime >= currentTimeMs - 30000;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fw-subtitle-renderer.js","sources":["../../../../src/components/fw-subtitle-renderer.ts"],"sourcesContent":["import { LitElement, css, html, nothing } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\n\ninterface SubtitleCue {\n id?: string;\n text: string;\n startTime: number;\n endTime: number;\n lang?: string;\n}\n\ninterface MetaTrackEvent {\n type: string;\n data: unknown;\n}\n\ninterface SubtitleStyle {\n fontSize?: string;\n fontFamily?: string;\n color?: string;\n backgroundColor?: string;\n textShadow?: string;\n bottom?: string;\n maxWidth?: string;\n padding?: string;\n borderRadius?: string;\n}\n\nconst DEFAULT_STYLE: Required<SubtitleStyle> = {\n fontSize: \"1.5rem\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: \"white\",\n backgroundColor: \"rgba(0, 0, 0, 0.75)\",\n textShadow: \"2px 2px 4px rgba(0, 0, 0, 0.5)\",\n bottom: \"5%\",\n maxWidth: \"90%\",\n padding: \"0.5em 1em\",\n borderRadius: \"4px\",\n};\n\n@customElement(\"fw-subtitle-renderer\")\nexport class FwSubtitleRenderer extends LitElement {\n @property({ type: Number }) currentTime = 0;\n @property({ type: Boolean }) enabled = true;\n @property({ attribute: false }) cues: SubtitleCue[] = [];\n @property({ attribute: false })\n subscribeToMetaTrack?: (trackId: string, callback: (event: MetaTrackEvent) => void) => () => void;\n @property({ type: String, attribute: \"meta-track-id\" }) metaTrackId?: string;\n @property({ attribute: false }) subtitleStyle?: SubtitleStyle;\n @property({ type: String, attribute: \"class-name\" }) className = \"\";\n\n @state() private _liveCues: SubtitleCue[] = [];\n @state() private _displayedText = \"\";\n\n private _unsubscribe: (() => void) | null = null;\n\n static styles = css`\n :host {\n display: contents;\n }\n\n .subtitle-container {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n z-index: 30;\n text-align: center;\n pointer-events: none;\n }\n\n .subtitle-text {\n display: inline-block;\n white-space: pre-wrap;\n }\n `;\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._teardownSubscription();\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (\n changed.has(\"enabled\") ||\n changed.has(\"subscribeToMetaTrack\") ||\n changed.has(\"metaTrackId\")\n ) {\n this._syncSubscription();\n }\n\n if (changed.has(\"currentTime\") || changed.has(\"_liveCues\")) {\n this._pruneExpiredLiveCues();\n }\n\n if (\n changed.has(\"enabled\") ||\n changed.has(\"currentTime\") ||\n changed.has(\"cues\") ||\n changed.has(\"_liveCues\")\n ) {\n this._syncDisplayedCue();\n }\n }\n\n private _syncSubscription(): void {\n this._teardownSubscription();\n\n if (!this.enabled || !this.subscribeToMetaTrack || !this.metaTrackId) {\n return;\n }\n\n this._unsubscribe = this.subscribeToMetaTrack(this.metaTrackId, this._handleMetaEvent);\n }\n\n private _teardownSubscription(): void {\n if (this._unsubscribe) {\n this._unsubscribe();\n this._unsubscribe = null;\n }\n }\n\n private _handleMetaEvent = (event: MetaTrackEvent): void => {\n if (event.type !== \"subtitle\") {\n return;\n }\n\n const cue = this._parseSubtitleCue(event.data);\n if (!cue) {\n return;\n }\n\n this._liveCues = (() => {\n const existing = this._liveCues.find((value) => value.id === cue.id);\n if (existing) {\n return this._liveCues;\n }\n return [...this._liveCues, cue].slice(-50);\n })();\n };\n\n private _parseSubtitleCue(data: unknown): SubtitleCue | null {\n if (typeof data !== \"object\" || data === null) {\n return null;\n }\n\n const obj = data as Record<string, unknown>;\n const text = typeof obj.text === \"string\" ? obj.text : String(obj.text ?? \"\");\n if (!text) {\n return null;\n }\n\n const rawStart =\n \"startTime\" in obj ? Number(obj.startTime) : \"start\" in obj ? Number(obj.start) : 0;\n const rawEnd =\n \"endTime\" in obj ? Number(obj.endTime) : \"end\" in obj ? Number(obj.end) : Infinity;\n const startTime = Number.isFinite(rawStart) ? rawStart : 0;\n const endTime = Number.isFinite(rawEnd) ? rawEnd : Infinity;\n const id = typeof obj.id === \"string\" ? obj.id : String(Date.now() + Math.random());\n\n return {\n id,\n text,\n startTime,\n endTime,\n lang: typeof obj.lang === \"string\" ? obj.lang : undefined,\n };\n }\n\n private _getAllCues(): SubtitleCue[] {\n return [...(this.cues ?? []), ...this._liveCues];\n }\n\n private _syncDisplayedCue(): void {\n if (!this.enabled) {\n if (this._displayedText) {\n this._displayedText = \"\";\n }\n return;\n }\n\n const currentTimeMs = this.currentTime * 1000;\n const activeCue = this._getAllCues().find(\n (cue) => currentTimeMs >= cue.startTime && currentTimeMs < cue.endTime\n );\n const nextText = activeCue?.text ?? \"\";\n\n if (nextText !== this._displayedText) {\n this._displayedText = nextText;\n }\n }\n\n private _pruneExpiredLiveCues(): void {\n if (this._liveCues.length === 0) {\n return;\n }\n\n const currentTimeMs = this.currentTime * 1000;\n const filtered = this._liveCues.filter((cue) => {\n const endTime = cue.endTime === Infinity ? cue.startTime + 10000 : cue.endTime;\n return endTime >= currentTimeMs - 30000;\n });\n\n if (filtered.length !== this._liveCues.length) {\n this._liveCues = filtered;\n }\n }\n\n protected render() {\n if (!this.enabled || !this._displayedText) {\n return nothing;\n }\n\n const mergedStyle: Required<SubtitleStyle> = {\n ...DEFAULT_STYLE,\n ...(this.subtitleStyle ?? {}),\n };\n\n return html`\n <div\n class=\"subtitle-container ${this.className}\"\n style=${styleMap({\n bottom: mergedStyle.bottom,\n maxWidth: mergedStyle.maxWidth,\n })}\n role=\"region\"\n aria-live=\"polite\"\n aria-label=\"Subtitles\"\n >\n <span\n class=\"subtitle-text\"\n style=${styleMap({\n fontSize: mergedStyle.fontSize,\n fontFamily: mergedStyle.fontFamily,\n color: mergedStyle.color,\n backgroundColor: mergedStyle.backgroundColor,\n textShadow: mergedStyle.textShadow,\n padding: mergedStyle.padding,\n borderRadius: mergedStyle.borderRadius,\n })}\n >\n ${this._displayedText}\n </span>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-subtitle-renderer\": FwSubtitleRenderer;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fw-subtitle-renderer.js","sources":["../../../../src/components/fw-subtitle-renderer.ts"],"sourcesContent":["import { LitElement, css, html, nothing } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\n\ninterface SubtitleCue {\n id?: string;\n text: string;\n startTime: number;\n endTime: number;\n lang?: string;\n}\n\ninterface MetaTrackEvent {\n type: string;\n data: unknown;\n}\n\ninterface SubtitleStyle {\n fontSize?: string;\n fontFamily?: string;\n color?: string;\n backgroundColor?: string;\n textShadow?: string;\n bottom?: string;\n maxWidth?: string;\n padding?: string;\n borderRadius?: string;\n}\n\nconst DEFAULT_STYLE: Required<SubtitleStyle> = {\n fontSize: \"1.5rem\",\n fontFamily: \"system-ui, -apple-system, sans-serif\",\n color: \"white\",\n backgroundColor: \"rgba(0, 0, 0, 0.75)\",\n textShadow: \"2px 2px 4px rgba(0, 0, 0, 0.5)\",\n bottom: \"5%\",\n maxWidth: \"90%\",\n padding: \"0.5em 1em\",\n borderRadius: \"4px\",\n};\n\n@customElement(\"fw-subtitle-renderer\")\nexport class FwSubtitleRenderer extends LitElement {\n @property({ type: Number }) currentTime = 0;\n @property({ type: Boolean }) enabled = true;\n @property({ attribute: false }) cues: SubtitleCue[] = [];\n @property({ attribute: false })\n subscribeToMetaTrack?: (trackId: string, callback: (event: MetaTrackEvent) => void) => () => void;\n @property({ type: String, attribute: \"meta-track-id\" }) metaTrackId?: string;\n @property({ attribute: false }) subtitleStyle?: SubtitleStyle;\n @property({ type: String, attribute: \"class-name\" }) className = \"\";\n\n @state() private _liveCues: SubtitleCue[] = [];\n @state() private _displayedText = \"\";\n\n private _unsubscribe: (() => void) | null = null;\n\n static styles = css`\n :host {\n display: contents;\n }\n\n .subtitle-container {\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n z-index: 30;\n text-align: center;\n pointer-events: none;\n }\n\n .subtitle-text {\n display: inline-block;\n white-space: pre-wrap;\n }\n `;\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._teardownSubscription();\n }\n\n protected updated(changed: Map<string, unknown>): void {\n if (\n changed.has(\"enabled\") ||\n changed.has(\"subscribeToMetaTrack\") ||\n changed.has(\"metaTrackId\")\n ) {\n this._syncSubscription();\n }\n\n if (changed.has(\"currentTime\") || changed.has(\"_liveCues\")) {\n this._pruneExpiredLiveCues();\n }\n\n if (\n changed.has(\"enabled\") ||\n changed.has(\"currentTime\") ||\n changed.has(\"cues\") ||\n changed.has(\"_liveCues\")\n ) {\n this._syncDisplayedCue();\n }\n }\n\n private _syncSubscription(): void {\n this._teardownSubscription();\n\n if (!this.enabled || !this.subscribeToMetaTrack || !this.metaTrackId) {\n return;\n }\n\n this._unsubscribe = this.subscribeToMetaTrack(this.metaTrackId, this._handleMetaEvent);\n }\n\n private _teardownSubscription(): void {\n if (this._unsubscribe) {\n this._unsubscribe();\n this._unsubscribe = null;\n }\n }\n\n private _handleMetaEvent = (event: MetaTrackEvent): void => {\n if (event.type !== \"subtitle\") {\n return;\n }\n\n const cue = this._parseSubtitleCue(event.data);\n if (!cue) {\n return;\n }\n\n this._liveCues = (() => {\n const existing = this._liveCues.find((value) => value.id === cue.id);\n if (existing) {\n return this._liveCues;\n }\n return [...this._liveCues, cue].slice(-50);\n })();\n };\n\n private _parseSubtitleCue(data: unknown): SubtitleCue | null {\n if (typeof data !== \"object\" || data === null) {\n return null;\n }\n\n const obj = data as Record<string, unknown>;\n const text = typeof obj.text === \"string\" ? obj.text : String(obj.text ?? \"\");\n if (!text) {\n return null;\n }\n\n const rawStart =\n \"startTime\" in obj ? Number(obj.startTime) : \"start\" in obj ? Number(obj.start) : 0;\n const rawEnd =\n \"endTime\" in obj ? Number(obj.endTime) : \"end\" in obj ? Number(obj.end) : Infinity;\n const startTime = Number.isFinite(rawStart) ? rawStart : 0;\n const endTime = Number.isFinite(rawEnd) ? rawEnd : Infinity;\n const id = typeof obj.id === \"string\" ? obj.id : String(Date.now() + Math.random());\n\n return {\n id,\n text,\n startTime,\n endTime,\n lang: typeof obj.lang === \"string\" ? obj.lang : undefined,\n };\n }\n\n private _getAllCues(): SubtitleCue[] {\n return [...(this.cues ?? []), ...this._liveCues];\n }\n\n private _syncDisplayedCue(): void {\n if (!this.enabled) {\n if (this._displayedText) {\n this._displayedText = \"\";\n }\n return;\n }\n\n const currentTimeMs = this.currentTime;\n const activeCue = this._getAllCues().find(\n (cue) => currentTimeMs >= cue.startTime && currentTimeMs < cue.endTime\n );\n const nextText = activeCue?.text ?? \"\";\n\n if (nextText !== this._displayedText) {\n this._displayedText = nextText;\n }\n }\n\n private _pruneExpiredLiveCues(): void {\n if (this._liveCues.length === 0) {\n return;\n }\n\n const currentTimeMs = this.currentTime;\n const filtered = this._liveCues.filter((cue) => {\n const endTime = cue.endTime === Infinity ? cue.startTime + 10000 : cue.endTime;\n return endTime >= currentTimeMs - 30000;\n });\n\n if (filtered.length !== this._liveCues.length) {\n this._liveCues = filtered;\n }\n }\n\n protected render() {\n if (!this.enabled || !this._displayedText) {\n return nothing;\n }\n\n const mergedStyle: Required<SubtitleStyle> = {\n ...DEFAULT_STYLE,\n ...(this.subtitleStyle ?? {}),\n };\n\n return html`\n <div\n class=\"subtitle-container ${this.className}\"\n style=${styleMap({\n bottom: mergedStyle.bottom,\n maxWidth: mergedStyle.maxWidth,\n })}\n role=\"region\"\n aria-live=\"polite\"\n aria-label=\"Subtitles\"\n >\n <span\n class=\"subtitle-text\"\n style=${styleMap({\n fontSize: mergedStyle.fontSize,\n fontFamily: mergedStyle.fontFamily,\n color: mergedStyle.color,\n backgroundColor: mergedStyle.backgroundColor,\n textShadow: mergedStyle.textShadow,\n padding: mergedStyle.padding,\n borderRadius: mergedStyle.borderRadius,\n })}\n >\n ${this._displayedText}\n </span>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-subtitle-renderer\": FwSubtitleRenderer;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ const initialState = {
|
|
|
11
11
|
isPlaying: false,
|
|
12
12
|
isPaused: true,
|
|
13
13
|
isBuffering: false,
|
|
14
|
-
isMuted:
|
|
14
|
+
isMuted: false,
|
|
15
15
|
volume: 1,
|
|
16
16
|
error: null,
|
|
17
17
|
errorDetails: null,
|
|
@@ -125,7 +125,10 @@ class PlayerControllerHost {
|
|
|
125
125
|
subscribeToEvents(controller) {
|
|
126
126
|
const u = this.unsubs;
|
|
127
127
|
u.push(controller.on("stateChange", ({ state }) => {
|
|
128
|
-
this.update({
|
|
128
|
+
this.update({
|
|
129
|
+
state,
|
|
130
|
+
shouldShowIdleScreen: controller.shouldShowIdleScreen(),
|
|
131
|
+
});
|
|
129
132
|
this.dispatchEvent("fw-state-change", { state });
|
|
130
133
|
}));
|
|
131
134
|
u.push(controller.on("streamStateChange", ({ state: streamState }) => {
|
|
@@ -156,6 +159,7 @@ class PlayerControllerHost {
|
|
|
156
159
|
this.update({
|
|
157
160
|
error,
|
|
158
161
|
isPassiveError: controller.isPassiveError(),
|
|
162
|
+
shouldShowIdleScreen: controller.shouldShowIdleScreen(),
|
|
159
163
|
});
|
|
160
164
|
this.dispatchEvent("fw-error", { error });
|
|
161
165
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"player-controller-host.js","sources":["../../../../src/controllers/player-controller-host.ts"],"sourcesContent":["/**\n * PlayerControllerHost — Lit ReactiveController wrapping the headless PlayerController.\n * Direct port of usePlayerController.ts from player-react.\n */\nimport type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport {\n PlayerController,\n createTranslator,\n type PlayerControllerConfig,\n type PlayerState,\n type StreamState,\n type StreamInfo,\n type PlaybackQuality,\n type ContentEndpoints,\n type ContentMetadata,\n type ClassifiedError,\n type TranslateFn,\n type I18nConfig,\n} from \"@livepeer-frameworks/player-core\";\n\nexport interface PlayerControllerHostState {\n state: PlayerState;\n streamState: StreamState | null;\n endpoints: ContentEndpoints | null;\n metadata: ContentMetadata | null;\n videoElement: HTMLVideoElement | null;\n currentTime: number;\n duration: number;\n isPlaying: boolean;\n isPaused: boolean;\n isBuffering: boolean;\n isMuted: boolean;\n volume: number;\n error: string | null;\n errorDetails: ClassifiedError[\"details\"] | null;\n isPassiveError: boolean;\n hasPlaybackStarted: boolean;\n isHoldingSpeed: boolean;\n holdSpeed: number;\n isHovering: boolean;\n shouldShowControls: boolean;\n isLoopEnabled: boolean;\n isFullscreen: boolean;\n isPiPActive: boolean;\n isEffectivelyLive: boolean;\n shouldShowIdleScreen: boolean;\n currentPlayerInfo: { name: string; shortname: string } | null;\n currentSourceInfo: { url: string; type: string } | null;\n playbackQuality: PlaybackQuality | null;\n subtitlesEnabled: boolean;\n qualities: Array<{\n id: string;\n label: string;\n bitrate?: number;\n width?: number;\n height?: number;\n isAuto?: boolean;\n active?: boolean;\n }>;\n textTracks: Array<{ id: string; label: string; lang?: string; active: boolean }>;\n streamInfo: StreamInfo | null;\n toast: { message: string; timestamp: number } | null;\n}\n\nconst initialState: PlayerControllerHostState = {\n state: \"booting\",\n streamState: null,\n endpoints: null,\n metadata: null,\n videoElement: null,\n currentTime: 0,\n duration: NaN,\n isPlaying: false,\n isPaused: true,\n isBuffering: false,\n isMuted: true,\n volume: 1,\n error: null,\n errorDetails: null,\n isPassiveError: false,\n hasPlaybackStarted: false,\n isHoldingSpeed: false,\n holdSpeed: 2,\n isHovering: false,\n shouldShowControls: false,\n isLoopEnabled: false,\n isFullscreen: false,\n isPiPActive: false,\n isEffectivelyLive: false,\n shouldShowIdleScreen: true,\n currentPlayerInfo: null,\n currentSourceInfo: null,\n playbackQuality: null,\n subtitlesEnabled: false,\n qualities: [],\n textTracks: [],\n streamInfo: null,\n toast: null,\n};\n\ntype HostElement = ReactiveControllerHost & HTMLElement;\n\nexport class PlayerControllerHost implements ReactiveController {\n host: HostElement;\n private controller: PlayerController | null = null;\n private unsubs: Array<() => void> = [];\n private currentConfig: PlayerControllerConfig | null = null;\n\n s: PlayerControllerHostState = { ...initialState };\n\n /** Translation function, updated when locale changes. */\n t: TranslateFn = createTranslator({ locale: \"en\" });\n\n constructor(host: HostElement) {\n this.host = host;\n host.addController(this);\n }\n\n /** Rebuild the translator when locale or custom translations change. */\n updateTranslator(config: I18nConfig) {\n this.t = createTranslator(config);\n this.host.requestUpdate();\n }\n\n // ---- Configuration & Lifecycle ----\n\n configure(config: PlayerControllerConfig) {\n this.currentConfig = config;\n }\n\n async attach(container: HTMLDivElement) {\n if (!this.currentConfig) return;\n this.teardown();\n\n const controller = new PlayerController({\n contentId: this.currentConfig.contentId,\n contentType: this.currentConfig.contentType,\n endpoints: this.currentConfig.endpoints,\n gatewayUrl: this.currentConfig.gatewayUrl,\n mistUrl: this.currentConfig.mistUrl,\n authToken: this.currentConfig.authToken,\n autoplay: this.currentConfig.autoplay,\n muted: this.currentConfig.muted,\n controls: this.currentConfig.controls,\n poster: this.currentConfig.poster,\n debug: this.currentConfig.debug,\n });\n\n this.controller = controller;\n this.subscribeToEvents(controller);\n\n this.update({ isLoopEnabled: controller.isLoopEnabled() });\n\n try {\n await controller.attach(container);\n } catch (err) {\n console.warn(\"[PlayerControllerHost] Attach failed:\", err);\n }\n }\n\n hostConnected() {\n // Controller attachment happens in firstUpdated of the host element\n }\n\n hostDisconnected() {\n this.teardown();\n this.s = { ...initialState };\n }\n\n private teardown() {\n this.unsubs.forEach((fn) => fn());\n this.unsubs = [];\n this.controller?.destroy();\n this.controller = null;\n }\n\n // ---- State Updates ----\n\n private update(partial: Partial<PlayerControllerHostState>) {\n Object.assign(this.s, partial);\n this.host.requestUpdate();\n }\n\n private syncState() {\n if (!this.controller) return;\n const c = this.controller;\n this.update({\n isPlaying: c.isPlaying(),\n isPaused: c.isPaused(),\n isBuffering: c.isBuffering(),\n isMuted: c.isMuted(),\n volume: c.getVolume(),\n hasPlaybackStarted: c.hasPlaybackStarted(),\n shouldShowControls: c.shouldShowControls(),\n shouldShowIdleScreen: c.shouldShowIdleScreen(),\n playbackQuality: c.getPlaybackQuality(),\n isLoopEnabled: c.isLoopEnabled(),\n subtitlesEnabled: c.isSubtitlesEnabled(),\n qualities: c.getQualities(),\n textTracks: c.getTextTracks(),\n streamInfo: c.getStreamInfo(),\n });\n }\n\n // ---- Event Subscriptions (mirrors usePlayerController exactly) ----\n\n private subscribeToEvents(controller: PlayerController) {\n const u = this.unsubs;\n\n u.push(\n controller.on(\"stateChange\", ({ state }) => {\n this.update({ state });\n this.dispatchEvent(\"fw-state-change\", { state });\n })\n );\n\n u.push(\n controller.on(\"streamStateChange\", ({ state: streamState }) => {\n this.update({\n streamState,\n metadata: controller.getMetadata(),\n isEffectivelyLive: controller.isEffectivelyLive(),\n shouldShowIdleScreen: controller.shouldShowIdleScreen(),\n });\n this.dispatchEvent(\"fw-stream-state\", { state: streamState });\n })\n );\n\n u.push(\n controller.on(\"timeUpdate\", ({ currentTime, duration }) => {\n const next: Partial<PlayerControllerHostState> = {\n currentTime,\n duration,\n shouldShowControls: controller.shouldShowControls(),\n };\n if (this.s.qualities.length === 0) {\n const qualities = controller.getQualities();\n if (qualities.length > 0) {\n next.qualities = qualities;\n }\n }\n this.update(next);\n this.dispatchEvent(\"fw-time-update\", { currentTime, duration });\n })\n );\n\n u.push(\n controller.on(\"error\", ({ error }) => {\n this.update({\n error,\n isPassiveError: controller.isPassiveError(),\n });\n this.dispatchEvent(\"fw-error\", { error });\n })\n );\n\n u.push(\n controller.on(\"errorCleared\", () => {\n this.update({ error: null, isPassiveError: false });\n })\n );\n\n u.push(\n controller.on(\"ready\", ({ videoElement }) => {\n this.update({\n videoElement,\n endpoints: controller.getEndpoints(),\n metadata: controller.getMetadata(),\n streamInfo: controller.getStreamInfo(),\n isEffectivelyLive: controller.isEffectivelyLive(),\n shouldShowIdleScreen: controller.shouldShowIdleScreen(),\n currentPlayerInfo: controller.getCurrentPlayerInfo(),\n currentSourceInfo: controller.getCurrentSourceInfo(),\n qualities: controller.getQualities(),\n textTracks: controller.getTextTracks(),\n });\n this.dispatchEvent(\"fw-ready\", { videoElement });\n this.syncState();\n\n const handleVideoEvent = () => {\n if (this.controller?.shouldSuppressVideoEvents?.()) return;\n this.syncState();\n };\n videoElement.addEventListener(\"play\", handleVideoEvent);\n videoElement.addEventListener(\"pause\", handleVideoEvent);\n videoElement.addEventListener(\"waiting\", handleVideoEvent);\n videoElement.addEventListener(\"playing\", handleVideoEvent);\n u.push(() => {\n videoElement.removeEventListener(\"play\", handleVideoEvent);\n videoElement.removeEventListener(\"pause\", handleVideoEvent);\n videoElement.removeEventListener(\"waiting\", handleVideoEvent);\n videoElement.removeEventListener(\"playing\", handleVideoEvent);\n });\n })\n );\n\n u.push(\n controller.on(\"playerSelected\", ({ player: _player, source }) => {\n this.update({\n currentPlayerInfo: controller.getCurrentPlayerInfo(),\n currentSourceInfo: { url: source.url, type: source.type },\n qualities: controller.getQualities(),\n textTracks: controller.getTextTracks(),\n });\n this.syncState();\n })\n );\n\n u.push(\n controller.on(\"volumeChange\", ({ volume, muted }) => {\n this.update({ volume, isMuted: muted });\n this.dispatchEvent(\"fw-volume-change\", { volume, muted });\n })\n );\n\n u.push(\n controller.on(\"loopChange\", ({ isLoopEnabled }) => {\n this.update({ isLoopEnabled });\n })\n );\n\n u.push(\n controller.on(\"fullscreenChange\", ({ isFullscreen }) => {\n this.update({ isFullscreen });\n this.dispatchEvent(\"fw-fullscreen-change\", { isFullscreen });\n })\n );\n\n u.push(\n controller.on(\"pipChange\", ({ isPiP }) => {\n this.update({ isPiPActive: isPiP });\n this.dispatchEvent(\"fw-pip-change\", { isPiP });\n })\n );\n\n u.push(\n controller.on(\"holdSpeedStart\", ({ speed }) => {\n this.update({ isHoldingSpeed: true, holdSpeed: speed });\n })\n );\n\n u.push(\n controller.on(\"holdSpeedEnd\", () => {\n this.update({ isHoldingSpeed: false });\n })\n );\n\n u.push(\n controller.on(\"hoverStart\", () => {\n this.update({ isHovering: true, shouldShowControls: true });\n })\n );\n\n u.push(\n controller.on(\"hoverEnd\", () => {\n this.update({\n isHovering: false,\n shouldShowControls: controller.shouldShowControls(),\n });\n })\n );\n\n u.push(\n controller.on(\"captionsChange\", ({ enabled }) => {\n this.update({ subtitlesEnabled: enabled, textTracks: controller.getTextTracks() });\n })\n );\n\n u.push(\n controller.on(\"protocolSwapped\", (data) => {\n const message = `Switched to ${data.toProtocol}`;\n this.update({ toast: { message, timestamp: Date.now() } });\n this.dispatchEvent(\"fw-protocol-swapped\", data);\n })\n );\n\n u.push(\n controller.on(\"playbackFailed\", (data) => {\n this.update({\n error: data.message,\n errorDetails: data.details ?? null,\n isPassiveError: false,\n });\n this.dispatchEvent(\"fw-playback-failed\", {\n code: data.code,\n message: data.message,\n });\n })\n );\n }\n\n // ---- Event Dispatching ----\n\n private dispatchEvent(name: string, detail: unknown) {\n this.host.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n }\n\n // ---- Action Methods ----\n\n async play() {\n await this.controller?.play();\n }\n pause() {\n this.controller?.pause();\n }\n togglePlay() {\n this.controller?.togglePlay();\n }\n seek(time: number) {\n this.controller?.seek(time);\n }\n seekBy(delta: number) {\n this.controller?.seekBy(delta);\n }\n jumpToLive() {\n this.controller?.jumpToLive();\n }\n setVolume(volume: number) {\n this.controller?.setVolume(volume);\n }\n toggleMute() {\n this.controller?.toggleMute();\n }\n toggleLoop() {\n this.controller?.toggleLoop();\n }\n async toggleFullscreen() {\n await this.controller?.toggleFullscreen();\n }\n async togglePiP() {\n await this.controller?.togglePictureInPicture();\n }\n toggleSubtitles() {\n this.controller?.toggleSubtitles();\n }\n\n clearError() {\n this.controller?.clearError();\n this.update({ error: null, errorDetails: null, isPassiveError: false });\n }\n\n dismissToast() {\n this.update({ toast: null });\n }\n\n async retry() {\n await this.controller?.retry();\n }\n async tryNextSource() {\n await this.controller?.retryWithFallback();\n }\n canAttemptFallback(): boolean {\n return this.controller?.canAttemptFallback() ?? false;\n }\n async reload() {\n await this.controller?.reload();\n }\n\n getQualities() {\n return this.controller?.getQualities() ?? [];\n }\n selectQuality(id: string) {\n this.controller?.selectQuality(id);\n }\n getTextTracks() {\n return this.controller?.getTextTracks() ?? [];\n }\n selectTextTrack(id: string | null) {\n this.controller?.selectTextTrack(id);\n }\n setPlaybackRate(rate: number) {\n this.controller?.setPlaybackRate(rate);\n }\n getSeekableStart() {\n return this.controller?.getSeekableStart() ?? 0;\n }\n getLiveEdge() {\n return this.controller?.getLiveEdge() ?? 0;\n }\n canSeekStream() {\n return this.controller?.canSeekStream() ?? false;\n }\n getBufferedRanges() {\n return this.controller?.getBufferedRanges() ?? null;\n }\n async getStats() {\n return this.controller?.getStats();\n }\n\n handleMouseEnter() {\n this.controller?.handleMouseEnter();\n this.update({ isHovering: true, shouldShowControls: true });\n }\n handleMouseLeave() {\n this.controller?.handleMouseLeave();\n this.update({\n isHovering: false,\n shouldShowControls: this.controller?.shouldShowControls() ?? false,\n });\n }\n handleMouseMove() {\n this.controller?.handleMouseMove();\n if (this.controller) {\n this.update({ shouldShowControls: this.controller.shouldShowControls() });\n }\n }\n handleTouchStart() {\n this.controller?.handleTouchStart();\n this.update({ shouldShowControls: true });\n }\n\n async setDevModeOptions(options: {\n forcePlayer?: string;\n forceType?: string;\n forceSource?: number;\n playbackMode?: \"auto\" | \"low-latency\" | \"quality\" | \"vod\";\n }) {\n await this.controller?.setDevModeOptions(options);\n }\n\n getController(): PlayerController | null {\n return this.controller;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"player-controller-host.js","sources":["../../../../src/controllers/player-controller-host.ts"],"sourcesContent":["/**\n * PlayerControllerHost — Lit ReactiveController wrapping the headless PlayerController.\n * Direct port of usePlayerController.ts from player-react.\n */\nimport type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport {\n PlayerController,\n createTranslator,\n type PlayerControllerConfig,\n type PlayerState,\n type StreamState,\n type StreamInfo,\n type PlaybackQuality,\n type ContentEndpoints,\n type ContentMetadata,\n type ClassifiedError,\n type TranslateFn,\n type I18nConfig,\n} from \"@livepeer-frameworks/player-core\";\n\nexport interface PlayerControllerHostState {\n state: PlayerState;\n streamState: StreamState | null;\n endpoints: ContentEndpoints | null;\n metadata: ContentMetadata | null;\n videoElement: HTMLVideoElement | null;\n currentTime: number;\n duration: number;\n isPlaying: boolean;\n isPaused: boolean;\n isBuffering: boolean;\n isMuted: boolean;\n volume: number;\n error: string | null;\n errorDetails: ClassifiedError[\"details\"] | null;\n isPassiveError: boolean;\n hasPlaybackStarted: boolean;\n isHoldingSpeed: boolean;\n holdSpeed: number;\n isHovering: boolean;\n shouldShowControls: boolean;\n isLoopEnabled: boolean;\n isFullscreen: boolean;\n isPiPActive: boolean;\n isEffectivelyLive: boolean;\n shouldShowIdleScreen: boolean;\n currentPlayerInfo: { name: string; shortname: string } | null;\n currentSourceInfo: { url: string; type: string } | null;\n playbackQuality: PlaybackQuality | null;\n subtitlesEnabled: boolean;\n qualities: Array<{\n id: string;\n label: string;\n bitrate?: number;\n width?: number;\n height?: number;\n isAuto?: boolean;\n active?: boolean;\n }>;\n textTracks: Array<{ id: string; label: string; lang?: string; active: boolean }>;\n streamInfo: StreamInfo | null;\n toast: { message: string; timestamp: number } | null;\n}\n\nconst initialState: PlayerControllerHostState = {\n state: \"booting\",\n streamState: null,\n endpoints: null,\n metadata: null,\n videoElement: null,\n currentTime: 0,\n duration: NaN,\n isPlaying: false,\n isPaused: true,\n isBuffering: false,\n isMuted: false,\n volume: 1,\n error: null,\n errorDetails: null,\n isPassiveError: false,\n hasPlaybackStarted: false,\n isHoldingSpeed: false,\n holdSpeed: 2,\n isHovering: false,\n shouldShowControls: false,\n isLoopEnabled: false,\n isFullscreen: false,\n isPiPActive: false,\n isEffectivelyLive: false,\n shouldShowIdleScreen: true,\n currentPlayerInfo: null,\n currentSourceInfo: null,\n playbackQuality: null,\n subtitlesEnabled: false,\n qualities: [],\n textTracks: [],\n streamInfo: null,\n toast: null,\n};\n\ntype HostElement = ReactiveControllerHost & HTMLElement;\n\nexport class PlayerControllerHost implements ReactiveController {\n host: HostElement;\n private controller: PlayerController | null = null;\n private unsubs: Array<() => void> = [];\n private currentConfig: PlayerControllerConfig | null = null;\n\n s: PlayerControllerHostState = { ...initialState };\n\n /** Translation function, updated when locale changes. */\n t: TranslateFn = createTranslator({ locale: \"en\" });\n\n constructor(host: HostElement) {\n this.host = host;\n host.addController(this);\n }\n\n /** Rebuild the translator when locale or custom translations change. */\n updateTranslator(config: I18nConfig) {\n this.t = createTranslator(config);\n this.host.requestUpdate();\n }\n\n // ---- Configuration & Lifecycle ----\n\n configure(config: PlayerControllerConfig) {\n this.currentConfig = config;\n }\n\n async attach(container: HTMLDivElement) {\n if (!this.currentConfig) return;\n this.teardown();\n\n const controller = new PlayerController({\n contentId: this.currentConfig.contentId,\n contentType: this.currentConfig.contentType,\n endpoints: this.currentConfig.endpoints,\n gatewayUrl: this.currentConfig.gatewayUrl,\n mistUrl: this.currentConfig.mistUrl,\n authToken: this.currentConfig.authToken,\n autoplay: this.currentConfig.autoplay,\n muted: this.currentConfig.muted,\n controls: this.currentConfig.controls,\n poster: this.currentConfig.poster,\n debug: this.currentConfig.debug,\n });\n\n this.controller = controller;\n this.subscribeToEvents(controller);\n\n this.update({ isLoopEnabled: controller.isLoopEnabled() });\n\n try {\n await controller.attach(container);\n } catch (err) {\n console.warn(\"[PlayerControllerHost] Attach failed:\", err);\n }\n }\n\n hostConnected() {\n // Controller attachment happens in firstUpdated of the host element\n }\n\n hostDisconnected() {\n this.teardown();\n this.s = { ...initialState };\n }\n\n private teardown() {\n this.unsubs.forEach((fn) => fn());\n this.unsubs = [];\n this.controller?.destroy();\n this.controller = null;\n }\n\n // ---- State Updates ----\n\n private update(partial: Partial<PlayerControllerHostState>) {\n Object.assign(this.s, partial);\n this.host.requestUpdate();\n }\n\n private syncState() {\n if (!this.controller) return;\n const c = this.controller;\n this.update({\n isPlaying: c.isPlaying(),\n isPaused: c.isPaused(),\n isBuffering: c.isBuffering(),\n isMuted: c.isMuted(),\n volume: c.getVolume(),\n hasPlaybackStarted: c.hasPlaybackStarted(),\n shouldShowControls: c.shouldShowControls(),\n shouldShowIdleScreen: c.shouldShowIdleScreen(),\n playbackQuality: c.getPlaybackQuality(),\n isLoopEnabled: c.isLoopEnabled(),\n subtitlesEnabled: c.isSubtitlesEnabled(),\n qualities: c.getQualities(),\n textTracks: c.getTextTracks(),\n streamInfo: c.getStreamInfo(),\n });\n }\n\n // ---- Event Subscriptions (mirrors usePlayerController exactly) ----\n\n private subscribeToEvents(controller: PlayerController) {\n const u = this.unsubs;\n\n u.push(\n controller.on(\"stateChange\", ({ state }) => {\n this.update({\n state,\n shouldShowIdleScreen: controller.shouldShowIdleScreen(),\n });\n this.dispatchEvent(\"fw-state-change\", { state });\n })\n );\n\n u.push(\n controller.on(\"streamStateChange\", ({ state: streamState }) => {\n this.update({\n streamState,\n metadata: controller.getMetadata(),\n isEffectivelyLive: controller.isEffectivelyLive(),\n shouldShowIdleScreen: controller.shouldShowIdleScreen(),\n });\n this.dispatchEvent(\"fw-stream-state\", { state: streamState });\n })\n );\n\n u.push(\n controller.on(\"timeUpdate\", ({ currentTime, duration }) => {\n const next: Partial<PlayerControllerHostState> = {\n currentTime,\n duration,\n shouldShowControls: controller.shouldShowControls(),\n };\n if (this.s.qualities.length === 0) {\n const qualities = controller.getQualities();\n if (qualities.length > 0) {\n next.qualities = qualities;\n }\n }\n this.update(next);\n this.dispatchEvent(\"fw-time-update\", { currentTime, duration });\n })\n );\n\n u.push(\n controller.on(\"error\", ({ error }) => {\n this.update({\n error,\n isPassiveError: controller.isPassiveError(),\n shouldShowIdleScreen: controller.shouldShowIdleScreen(),\n });\n this.dispatchEvent(\"fw-error\", { error });\n })\n );\n\n u.push(\n controller.on(\"errorCleared\", () => {\n this.update({ error: null, isPassiveError: false });\n })\n );\n\n u.push(\n controller.on(\"ready\", ({ videoElement }) => {\n this.update({\n videoElement,\n endpoints: controller.getEndpoints(),\n metadata: controller.getMetadata(),\n streamInfo: controller.getStreamInfo(),\n isEffectivelyLive: controller.isEffectivelyLive(),\n shouldShowIdleScreen: controller.shouldShowIdleScreen(),\n currentPlayerInfo: controller.getCurrentPlayerInfo(),\n currentSourceInfo: controller.getCurrentSourceInfo(),\n qualities: controller.getQualities(),\n textTracks: controller.getTextTracks(),\n });\n this.dispatchEvent(\"fw-ready\", { videoElement });\n this.syncState();\n\n const handleVideoEvent = () => {\n if (this.controller?.shouldSuppressVideoEvents?.()) return;\n this.syncState();\n };\n videoElement.addEventListener(\"play\", handleVideoEvent);\n videoElement.addEventListener(\"pause\", handleVideoEvent);\n videoElement.addEventListener(\"waiting\", handleVideoEvent);\n videoElement.addEventListener(\"playing\", handleVideoEvent);\n u.push(() => {\n videoElement.removeEventListener(\"play\", handleVideoEvent);\n videoElement.removeEventListener(\"pause\", handleVideoEvent);\n videoElement.removeEventListener(\"waiting\", handleVideoEvent);\n videoElement.removeEventListener(\"playing\", handleVideoEvent);\n });\n })\n );\n\n u.push(\n controller.on(\"playerSelected\", ({ player: _player, source }) => {\n this.update({\n currentPlayerInfo: controller.getCurrentPlayerInfo(),\n currentSourceInfo: { url: source.url, type: source.type },\n qualities: controller.getQualities(),\n textTracks: controller.getTextTracks(),\n });\n this.syncState();\n })\n );\n\n u.push(\n controller.on(\"volumeChange\", ({ volume, muted }) => {\n this.update({ volume, isMuted: muted });\n this.dispatchEvent(\"fw-volume-change\", { volume, muted });\n })\n );\n\n u.push(\n controller.on(\"loopChange\", ({ isLoopEnabled }) => {\n this.update({ isLoopEnabled });\n })\n );\n\n u.push(\n controller.on(\"fullscreenChange\", ({ isFullscreen }) => {\n this.update({ isFullscreen });\n this.dispatchEvent(\"fw-fullscreen-change\", { isFullscreen });\n })\n );\n\n u.push(\n controller.on(\"pipChange\", ({ isPiP }) => {\n this.update({ isPiPActive: isPiP });\n this.dispatchEvent(\"fw-pip-change\", { isPiP });\n })\n );\n\n u.push(\n controller.on(\"holdSpeedStart\", ({ speed }) => {\n this.update({ isHoldingSpeed: true, holdSpeed: speed });\n })\n );\n\n u.push(\n controller.on(\"holdSpeedEnd\", () => {\n this.update({ isHoldingSpeed: false });\n })\n );\n\n u.push(\n controller.on(\"hoverStart\", () => {\n this.update({ isHovering: true, shouldShowControls: true });\n })\n );\n\n u.push(\n controller.on(\"hoverEnd\", () => {\n this.update({\n isHovering: false,\n shouldShowControls: controller.shouldShowControls(),\n });\n })\n );\n\n u.push(\n controller.on(\"captionsChange\", ({ enabled }) => {\n this.update({ subtitlesEnabled: enabled, textTracks: controller.getTextTracks() });\n })\n );\n\n u.push(\n controller.on(\"protocolSwapped\", (data) => {\n const message = `Switched to ${data.toProtocol}`;\n this.update({ toast: { message, timestamp: Date.now() } });\n this.dispatchEvent(\"fw-protocol-swapped\", data);\n })\n );\n\n u.push(\n controller.on(\"playbackFailed\", (data) => {\n this.update({\n error: data.message,\n errorDetails: data.details ?? null,\n isPassiveError: false,\n });\n this.dispatchEvent(\"fw-playback-failed\", {\n code: data.code,\n message: data.message,\n });\n })\n );\n }\n\n // ---- Event Dispatching ----\n\n private dispatchEvent(name: string, detail: unknown) {\n this.host.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n }\n\n // ---- Action Methods ----\n\n async play() {\n await this.controller?.play();\n }\n pause() {\n this.controller?.pause();\n }\n togglePlay() {\n this.controller?.togglePlay();\n }\n seek(time: number) {\n this.controller?.seek(time);\n }\n seekBy(delta: number) {\n this.controller?.seekBy(delta);\n }\n jumpToLive() {\n this.controller?.jumpToLive();\n }\n setVolume(volume: number) {\n this.controller?.setVolume(volume);\n }\n toggleMute() {\n this.controller?.toggleMute();\n }\n toggleLoop() {\n this.controller?.toggleLoop();\n }\n async toggleFullscreen() {\n await this.controller?.toggleFullscreen();\n }\n async togglePiP() {\n await this.controller?.togglePictureInPicture();\n }\n toggleSubtitles() {\n this.controller?.toggleSubtitles();\n }\n\n clearError() {\n this.controller?.clearError();\n this.update({ error: null, errorDetails: null, isPassiveError: false });\n }\n\n dismissToast() {\n this.update({ toast: null });\n }\n\n async retry() {\n await this.controller?.retry();\n }\n async tryNextSource() {\n await this.controller?.retryWithFallback();\n }\n canAttemptFallback(): boolean {\n return this.controller?.canAttemptFallback() ?? false;\n }\n async reload() {\n await this.controller?.reload();\n }\n\n getQualities() {\n return this.controller?.getQualities() ?? [];\n }\n selectQuality(id: string) {\n this.controller?.selectQuality(id);\n }\n getTextTracks() {\n return this.controller?.getTextTracks() ?? [];\n }\n selectTextTrack(id: string | null) {\n this.controller?.selectTextTrack(id);\n }\n setPlaybackRate(rate: number) {\n this.controller?.setPlaybackRate(rate);\n }\n getSeekableStart() {\n return this.controller?.getSeekableStart() ?? 0;\n }\n getLiveEdge() {\n return this.controller?.getLiveEdge() ?? 0;\n }\n canSeekStream() {\n return this.controller?.canSeekStream() ?? false;\n }\n getBufferedRanges() {\n return this.controller?.getBufferedRanges() ?? null;\n }\n async getStats() {\n return this.controller?.getStats();\n }\n\n handleMouseEnter() {\n this.controller?.handleMouseEnter();\n this.update({ isHovering: true, shouldShowControls: true });\n }\n handleMouseLeave() {\n this.controller?.handleMouseLeave();\n this.update({\n isHovering: false,\n shouldShowControls: this.controller?.shouldShowControls() ?? false,\n });\n }\n handleMouseMove() {\n this.controller?.handleMouseMove();\n if (this.controller) {\n this.update({ shouldShowControls: this.controller.shouldShowControls() });\n }\n }\n handleTouchStart() {\n this.controller?.handleTouchStart();\n this.update({ shouldShowControls: true });\n }\n\n async setDevModeOptions(options: {\n forcePlayer?: string;\n forceType?: string;\n forceSource?: number;\n playbackMode?: \"auto\" | \"low-latency\" | \"quality\" | \"vod\";\n }) {\n await this.controller?.setDevModeOptions(options);\n }\n\n getController(): PlayerController | null {\n return this.controller;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -803,15 +803,16 @@ const sharedStyles = css `
|
|
|
803
803
|
position: absolute;
|
|
804
804
|
left: 0;
|
|
805
805
|
right: 0;
|
|
806
|
-
height:
|
|
806
|
+
height: 3px;
|
|
807
807
|
border-radius: 9999px;
|
|
808
808
|
background: hsl(var(--fw-text-faint) / 0.4);
|
|
809
809
|
transition: height 0.15s ease;
|
|
810
810
|
}
|
|
811
811
|
|
|
812
812
|
.fw-seek-wrapper:hover .fw-seek-track,
|
|
813
|
+
.fw-seek-root:hover .fw-seek-track,
|
|
813
814
|
.fw-seek-track--active {
|
|
814
|
-
height:
|
|
815
|
+
height: 8px;
|
|
815
816
|
}
|
|
816
817
|
|
|
817
818
|
.fw-seek-buffered {
|
|
@@ -819,7 +820,9 @@ const sharedStyles = css `
|
|
|
819
820
|
height: 100%;
|
|
820
821
|
border-radius: 9999px;
|
|
821
822
|
background: hsl(var(--fw-text) / 0.3);
|
|
822
|
-
transition:
|
|
823
|
+
transition:
|
|
824
|
+
left 0.2s ease,
|
|
825
|
+
width 0.2s ease;
|
|
823
826
|
}
|
|
824
827
|
|
|
825
828
|
.fw-seek-progress {
|
|
@@ -827,7 +830,29 @@ const sharedStyles = css `
|
|
|
827
830
|
height: 100%;
|
|
828
831
|
border-radius: 9999px;
|
|
829
832
|
background: hsl(var(--fw-accent));
|
|
830
|
-
|
|
833
|
+
will-change: width;
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
.fw-seek-hover-line {
|
|
837
|
+
position: absolute;
|
|
838
|
+
top: 0;
|
|
839
|
+
bottom: 0;
|
|
840
|
+
width: 2px;
|
|
841
|
+
background: hsl(var(--fw-text) / 0.5);
|
|
842
|
+
transform: translateX(-50%);
|
|
843
|
+
pointer-events: none;
|
|
844
|
+
border-radius: 1px;
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
.fw-seek-live-edge {
|
|
848
|
+
position: absolute;
|
|
849
|
+
top: -2px;
|
|
850
|
+
bottom: -2px;
|
|
851
|
+
right: 0;
|
|
852
|
+
width: 3px;
|
|
853
|
+
background: hsl(var(--fw-accent));
|
|
854
|
+
border-radius: 1px;
|
|
855
|
+
opacity: 0.7;
|
|
831
856
|
}
|
|
832
857
|
|
|
833
858
|
.fw-seek-thumb {
|
|
@@ -847,6 +872,7 @@ const sharedStyles = css `
|
|
|
847
872
|
}
|
|
848
873
|
|
|
849
874
|
.fw-seek-wrapper:hover .fw-seek-thumb,
|
|
875
|
+
.fw-seek-root:hover .fw-seek-thumb,
|
|
850
876
|
.fw-seek-thumb--active {
|
|
851
877
|
opacity: 1;
|
|
852
878
|
transform: translate(-50%, -50%) scale(1);
|
|
@@ -1863,6 +1889,16 @@ const sharedStyles = css `
|
|
|
1863
1889
|
margin-top: 0.25rem;
|
|
1864
1890
|
}
|
|
1865
1891
|
|
|
1892
|
+
.fw-dev-tooltip-note {
|
|
1893
|
+
color: hsl(var(--fw-text-muted));
|
|
1894
|
+
font-style: italic;
|
|
1895
|
+
font-size: 0.75rem;
|
|
1896
|
+
margin: 0.25rem 0;
|
|
1897
|
+
line-height: 1.3;
|
|
1898
|
+
white-space: normal;
|
|
1899
|
+
overflow-wrap: break-word;
|
|
1900
|
+
}
|
|
1901
|
+
|
|
1866
1902
|
.fw-dev-tooltip-value {
|
|
1867
1903
|
color: hsl(var(--fw-text));
|
|
1868
1904
|
}
|