@livepeer-frameworks/player-wc 0.2.9 → 0.2.11

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.
Files changed (37) hide show
  1. package/dist/esm/components/controls/fw-fullscreen-button.js +1 -1
  2. package/dist/esm/components/controls/fw-live-badge.js +1 -1
  3. package/dist/esm/components/controls/fw-play-button.js +1 -1
  4. package/dist/esm/components/controls/fw-skip-button.js +1 -1
  5. package/dist/esm/components/controls/fw-time-display.js +1 -1
  6. package/dist/esm/components/controls/fw-volume-control.js +1 -1
  7. package/dist/esm/components/fw-context-menu.js +1 -1
  8. package/dist/esm/components/fw-dev-mode-panel.js +1 -1
  9. package/dist/esm/components/fw-dvd-logo.js +1 -1
  10. package/dist/esm/components/fw-error-overlay.js +1 -1
  11. package/dist/esm/components/fw-idle-screen.js +1 -1
  12. package/dist/esm/components/fw-loading-screen.js +1 -1
  13. package/dist/esm/components/fw-loading-spinner.js +1 -1
  14. package/dist/esm/components/fw-player-controls.js +2 -6
  15. package/dist/esm/components/fw-player-controls.js.map +1 -1
  16. package/dist/esm/components/fw-player.js +1 -1
  17. package/dist/esm/components/fw-seek-bar.js +1 -1
  18. package/dist/esm/components/fw-settings-menu.js +3 -3
  19. package/dist/esm/components/fw-settings-menu.js.map +1 -1
  20. package/dist/esm/components/fw-skip-indicator.js +1 -1
  21. package/dist/esm/components/fw-speed-indicator.js +1 -1
  22. package/dist/esm/components/fw-stats-panel.js +1 -1
  23. package/dist/esm/components/fw-stream-state-overlay.js +1 -1
  24. package/dist/esm/components/fw-subtitle-renderer.js +1 -1
  25. package/dist/esm/components/fw-thumbnail-overlay.js +1 -1
  26. package/dist/esm/components/fw-title-overlay.js +1 -1
  27. package/dist/esm/components/fw-toast.js +1 -1
  28. package/dist/esm/components/fw-volume-control.js +32 -8
  29. package/dist/esm/components/fw-volume-control.js.map +1 -1
  30. package/dist/esm/node_modules/.pnpm/{@rollup_plugin-typescript@12.3.0_rollup@4.57.1_tslib@2.8.1_typescript@5.9.3 → @rollup_plugin-typescript@12.3.0_rollup@4.59.0_tslib@2.8.1_typescript@5.9.3}/node_modules/tslib/tslib.es6.js.map +1 -1
  31. package/dist/fw-player.iife.js +79 -79
  32. package/dist/types/components/fw-volume-control.d.ts +3 -0
  33. package/package.json +3 -3
  34. package/src/components/fw-player-controls.ts +1 -5
  35. package/src/components/fw-settings-menu.ts +2 -1
  36. package/src/components/fw-volume-control.ts +33 -7
  37. /package/dist/esm/node_modules/.pnpm/{@rollup_plugin-typescript@12.3.0_rollup@4.57.1_tslib@2.8.1_typescript@5.9.3 → @rollup_plugin-typescript@12.3.0_rollup@4.59.0_tslib@2.8.1_typescript@5.9.3}/node_modules/tslib/tslib.es6.js +0 -0
@@ -11,10 +11,13 @@ export declare class FwVolumeControl extends LitElement {
11
11
  private _hasAudio;
12
12
  private _activePointerId;
13
13
  private _activeSliderTarget;
14
+ private _boundStream;
15
+ private _onStreamTrackChange;
14
16
  static styles: import("lit").CSSResult[];
15
17
  private get _expanded();
16
18
  disconnectedCallback(): void;
17
19
  protected updated(): void;
20
+ private _unbindStreamListeners;
18
21
  private _updateHasAudio;
19
22
  private _setVolumeFromClientX;
20
23
  private _beginDragInteraction;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@livepeer-frameworks/player-wc",
3
- "version": "0.2.9",
3
+ "version": "0.2.11",
4
4
  "type": "module",
5
5
  "description": "Lit Web Components for FrameWorks streaming player — <fw-player> custom element with full UI",
6
6
  "main": "dist/esm/index.js",
@@ -26,7 +26,7 @@
26
26
  },
27
27
  "dependencies": {
28
28
  "lit": "^3.3.2",
29
- "@livepeer-frameworks/player-core": "0.2.3"
29
+ "@livepeer-frameworks/player-core": "0.2.5"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@rollup/plugin-commonjs": "^29.0.0",
@@ -34,7 +34,7 @@
34
34
  "@rollup/plugin-terser": "^0.4.4",
35
35
  "@rollup/plugin-typescript": "^12.3.0",
36
36
  "@vitest/coverage-v8": "^4.0.18",
37
- "rollup": "^4.57.1",
37
+ "rollup": "^4.59.0",
38
38
  "tslib": "^2.8.1",
39
39
  "typescript": "^5.9.3",
40
40
  "vitest": "^4.0.18"
@@ -223,11 +223,7 @@ export class FwPlayerControls extends LitElement {
223
223
  const isWebRTC = isMediaStreamSource(state.videoElement);
224
224
 
225
225
  const allowMediaStreamDvr =
226
- isMediaStreamSource(state.videoElement) &&
227
- bufferWindowMs !== undefined &&
228
- bufferWindowMs > 0 &&
229
- sourceType !== "whep" &&
230
- sourceType !== "webrtc";
226
+ isMediaStreamSource(state.videoElement) && bufferWindowMs !== undefined && bufferWindowMs > 0;
231
227
 
232
228
  const calculatedRange = calculateSeekableRange({
233
229
  isLive,
@@ -11,6 +11,7 @@ import {
11
11
  supportsPlaybackRate as coreSupportsPlaybackRate,
12
12
  getAvailableLocales,
13
13
  getLocaleDisplayName,
14
+ formatQualityLabel,
14
15
  } from "@livepeer-frameworks/player-core";
15
16
  import type { PlaybackMode, FwLocale } from "@livepeer-frameworks/player-core";
16
17
  import type { PlayerControllerHost } from "../controllers/player-controller-host.js";
@@ -152,7 +153,7 @@ export class FwSettingsMenu extends LitElement {
152
153
  .filter(([, track]) => track?.type === "video")
153
154
  .map(([id, track]) => ({
154
155
  id,
155
- label: track.height ? `${track.height}p` : (track.codec ?? id),
156
+ label: formatQualityLabel(track.width, track.height, track.bps),
156
157
  width: track.width,
157
158
  height: track.height,
158
159
  bitrate: track.bps,
@@ -20,6 +20,8 @@ export class FwVolumeControl extends LitElement {
20
20
 
21
21
  private _activePointerId: number | null = null;
22
22
  private _activeSliderTarget: HTMLElement | null = null;
23
+ private _boundStream: MediaStream | null = null;
24
+ private _onStreamTrackChange: (() => void) | null = null;
23
25
 
24
26
  static styles = [
25
27
  sharedStyles,
@@ -69,28 +71,52 @@ export class FwVolumeControl extends LitElement {
69
71
  disconnectedCallback(): void {
70
72
  super.disconnectedCallback();
71
73
  this._endDragInteraction();
74
+ this._unbindStreamListeners();
72
75
  }
73
76
 
74
77
  protected updated(): void {
75
78
  this._updateHasAudio();
76
79
  }
77
80
 
78
- private _updateHasAudio(): void {
79
- // Primary: trust MistServer stream metadata (matches ddvtech embed approach)
80
- const mistHasAudio = this.pc?.s.streamState?.streamInfo?.hasAudio;
81
- if (mistHasAudio !== undefined) {
82
- this._hasAudio = mistHasAudio;
83
- return;
81
+ private _unbindStreamListeners(): void {
82
+ if (this._boundStream && this._onStreamTrackChange) {
83
+ this._boundStream.removeEventListener("addtrack", this._onStreamTrackChange);
84
+ this._boundStream.removeEventListener("removetrack", this._onStreamTrackChange);
84
85
  }
86
+ this._boundStream = null;
87
+ this._onStreamTrackChange = null;
88
+ }
85
89
 
90
+ private _updateHasAudio(): void {
86
91
  const video = this.pc?.s.videoElement;
87
92
  if (!video) {
93
+ this._unbindStreamListeners();
88
94
  this._hasAudio = true;
89
95
  return;
90
96
  }
91
97
 
98
+ // MediaStream: bind track change listeners (WebRTC tracks arrive async)
92
99
  if (video.srcObject instanceof MediaStream) {
93
- this._hasAudio = video.srcObject.getAudioTracks().length > 0;
100
+ const stream = video.srcObject;
101
+ if (stream !== this._boundStream) {
102
+ this._unbindStreamListeners();
103
+ this._boundStream = stream;
104
+ this._onStreamTrackChange = () => {
105
+ this._hasAudio = stream.getAudioTracks().length > 0;
106
+ };
107
+ stream.addEventListener("addtrack", this._onStreamTrackChange);
108
+ stream.addEventListener("removetrack", this._onStreamTrackChange);
109
+ }
110
+ this._hasAudio = stream.getAudioTracks().length > 0;
111
+ return;
112
+ }
113
+
114
+ this._unbindStreamListeners();
115
+
116
+ // Fallback: metadata for non-MediaStream sources.
117
+ const mistHasAudio = this.pc?.s.streamState?.streamInfo?.hasAudio;
118
+ if (mistHasAudio !== undefined) {
119
+ this._hasAudio = mistHasAudio;
94
120
  return;
95
121
  }
96
122