@livepeer-frameworks/player-wc 0.1.9 → 0.2.1
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/esm/components/controls/fw-fullscreen-button.js +76 -0
- package/dist/esm/components/controls/fw-fullscreen-button.js.map +1 -0
- package/dist/esm/components/controls/fw-live-badge.js +109 -0
- package/dist/esm/components/controls/fw-live-badge.js.map +1 -0
- package/dist/esm/components/controls/fw-play-button.js +76 -0
- package/dist/esm/components/controls/fw-play-button.js.map +1 -0
- package/dist/esm/components/controls/fw-skip-button.js +62 -0
- package/dist/esm/components/controls/fw-skip-button.js.map +1 -0
- package/dist/esm/components/controls/fw-time-display.js +77 -0
- package/dist/esm/components/controls/fw-time-display.js.map +1 -0
- package/dist/esm/components/controls/fw-volume-control.js +76 -0
- package/dist/esm/components/controls/fw-volume-control.js.map +1 -0
- package/dist/esm/components/fw-dev-mode-panel.js +11 -15
- package/dist/esm/components/fw-dev-mode-panel.js.map +1 -1
- package/dist/esm/components/fw-error-overlay.js +13 -5
- package/dist/esm/components/fw-error-overlay.js.map +1 -1
- package/dist/esm/components/fw-idle-screen.js +10 -2
- package/dist/esm/components/fw-idle-screen.js.map +1 -1
- package/dist/esm/components/fw-loading-screen.js +89 -42
- package/dist/esm/components/fw-loading-screen.js.map +1 -1
- package/dist/esm/components/fw-loading-spinner.js +20 -9
- package/dist/esm/components/fw-loading-spinner.js.map +1 -1
- package/dist/esm/components/fw-player-controls.js +18 -13
- package/dist/esm/components/fw-player-controls.js.map +1 -1
- package/dist/esm/components/fw-player.js +165 -59
- package/dist/esm/components/fw-player.js.map +1 -1
- package/dist/esm/components/fw-settings-menu.js +44 -9
- package/dist/esm/components/fw-settings-menu.js.map +1 -1
- package/dist/esm/components/fw-stream-state-overlay.js +13 -5
- package/dist/esm/components/fw-stream-state-overlay.js.map +1 -1
- package/dist/esm/components/fw-toast.js +11 -1
- package/dist/esm/components/fw-toast.js.map +1 -1
- package/dist/esm/components/fw-volume-control.js +13 -3
- package/dist/esm/components/fw-volume-control.js.map +1 -1
- package/dist/esm/controllers/player-controller-host.js +14 -1
- package/dist/esm/controllers/player-controller-host.js.map +1 -1
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/styles/shared-styles.js +401 -304
- package/dist/esm/styles/shared-styles.js.map +1 -1
- package/dist/fw-player.iife.js +707 -488
- package/dist/types/components/controls/fw-fullscreen-button.d.ts +18 -0
- package/dist/types/components/controls/fw-live-badge.d.ts +19 -0
- package/dist/types/components/controls/fw-play-button.d.ts +18 -0
- package/dist/types/components/controls/fw-skip-button.d.ts +17 -0
- package/dist/types/components/controls/fw-time-display.d.ts +17 -0
- package/dist/types/components/controls/fw-volume-control.d.ts +18 -0
- package/dist/types/components/controls/index.d.ts +6 -0
- package/dist/types/components/fw-dev-mode-panel.d.ts +1 -1
- package/dist/types/components/fw-error-overlay.d.ts +4 -0
- package/dist/types/components/fw-idle-screen.d.ts +4 -0
- package/dist/types/components/fw-loading-screen.d.ts +5 -1
- package/dist/types/components/fw-loading-spinner.d.ts +4 -0
- package/dist/types/components/fw-player-controls.d.ts +2 -1
- package/dist/types/components/fw-player.d.ts +10 -1
- package/dist/types/components/fw-settings-menu.d.ts +3 -1
- package/dist/types/components/fw-stream-state-overlay.d.ts +4 -0
- package/dist/types/components/fw-toast.d.ts +4 -0
- package/dist/types/controllers/player-controller-host.d.ts +7 -1
- package/dist/types/index.d.ts +1 -0
- package/package.json +10 -13
- package/src/components/controls/fw-fullscreen-button.ts +75 -0
- package/src/components/controls/fw-live-badge.ts +109 -0
- package/src/components/controls/fw-play-button.ts +75 -0
- package/src/components/controls/fw-skip-button.ts +59 -0
- package/src/components/controls/fw-time-display.ts +74 -0
- package/src/components/controls/fw-volume-control.ts +75 -0
- package/src/components/controls/index.ts +6 -0
- package/src/components/fw-dev-mode-panel.ts +10 -17
- package/src/components/fw-error-overlay.ts +13 -5
- package/src/components/fw-idle-screen.ts +10 -2
- package/src/components/fw-loading-screen.ts +90 -46
- package/src/components/fw-loading-spinner.ts +18 -9
- package/src/components/fw-player-controls.ts +17 -13
- package/src/components/fw-player.ts +166 -64
- package/src/components/fw-settings-menu.ts +49 -9
- package/src/components/fw-stream-state-overlay.ts +13 -5
- package/src/components/fw-toast.ts +11 -1
- package/src/components/fw-volume-control.ts +14 -3
- package/src/controllers/player-controller-host.ts +18 -0
- package/src/index.ts +10 -0
- package/src/styles/shared-styles.ts +401 -304
- package/dist/cjs/components/fw-context-menu.js +0 -17
- package/dist/cjs/components/fw-context-menu.js.map +0 -1
- package/dist/cjs/components/fw-dev-mode-panel.js +0 -907
- package/dist/cjs/components/fw-dev-mode-panel.js.map +0 -1
- package/dist/cjs/components/fw-dvd-logo.js +0 -211
- package/dist/cjs/components/fw-dvd-logo.js.map +0 -1
- package/dist/cjs/components/fw-error-overlay.js +0 -101
- package/dist/cjs/components/fw-error-overlay.js.map +0 -1
- package/dist/cjs/components/fw-idle-screen.js +0 -726
- package/dist/cjs/components/fw-idle-screen.js.map +0 -1
- package/dist/cjs/components/fw-loading-screen.js +0 -513
- package/dist/cjs/components/fw-loading-screen.js.map +0 -1
- package/dist/cjs/components/fw-loading-spinner.js +0 -62
- package/dist/cjs/components/fw-loading-spinner.js.map +0 -1
- package/dist/cjs/components/fw-player-controls.js +0 -451
- package/dist/cjs/components/fw-player-controls.js.map +0 -1
- package/dist/cjs/components/fw-player.js +0 -832
- package/dist/cjs/components/fw-player.js.map +0 -1
- package/dist/cjs/components/fw-seek-bar.js +0 -383
- package/dist/cjs/components/fw-seek-bar.js.map +0 -1
- package/dist/cjs/components/fw-settings-menu.js +0 -253
- package/dist/cjs/components/fw-settings-menu.js.map +0 -1
- package/dist/cjs/components/fw-skip-indicator.js +0 -143
- package/dist/cjs/components/fw-skip-indicator.js.map +0 -1
- package/dist/cjs/components/fw-speed-indicator.js +0 -61
- package/dist/cjs/components/fw-speed-indicator.js.map +0 -1
- package/dist/cjs/components/fw-stats-panel.js +0 -205
- package/dist/cjs/components/fw-stats-panel.js.map +0 -1
- package/dist/cjs/components/fw-stream-state-overlay.js +0 -338
- package/dist/cjs/components/fw-stream-state-overlay.js.map +0 -1
- package/dist/cjs/components/fw-subtitle-renderer.js +0 -217
- package/dist/cjs/components/fw-subtitle-renderer.js.map +0 -1
- package/dist/cjs/components/fw-thumbnail-overlay.js +0 -161
- package/dist/cjs/components/fw-thumbnail-overlay.js.map +0 -1
- package/dist/cjs/components/fw-title-overlay.js +0 -72
- package/dist/cjs/components/fw-title-overlay.js.map +0 -1
- package/dist/cjs/components/fw-toast.js +0 -74
- package/dist/cjs/components/fw-toast.js.map +0 -1
- package/dist/cjs/components/fw-volume-control.js +0 -276
- package/dist/cjs/components/fw-volume-control.js.map +0 -1
- package/dist/cjs/components/shared/hitmarker-audio.js +0 -76
- package/dist/cjs/components/shared/hitmarker-audio.js.map +0 -1
- package/dist/cjs/constants/media-assets.js +0 -11
- package/dist/cjs/constants/media-assets.js.map +0 -1
- package/dist/cjs/controllers/player-controller-host.js +0 -364
- package/dist/cjs/controllers/player-controller-host.js.map +0 -1
- package/dist/cjs/define.js +0 -53
- package/dist/cjs/define.js.map +0 -1
- package/dist/cjs/icons/index.js +0 -180
- package/dist/cjs/icons/index.js.map +0 -1
- package/dist/cjs/index.js +0 -108
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.57.1_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js +0 -33
- package/dist/cjs/node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.57.1_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js.map +0 -1
- package/dist/cjs/styles/shared-styles.js +0 -1985
- package/dist/cjs/styles/shared-styles.js.map +0 -1
- package/dist/cjs/styles/utility-styles.js +0 -725
- package/dist/cjs/styles/utility-styles.js.map +0 -1
|
@@ -9,8 +9,10 @@ import { utilityStyles } from "../styles/utility-styles.js";
|
|
|
9
9
|
import {
|
|
10
10
|
SPEED_PRESETS,
|
|
11
11
|
supportsPlaybackRate as coreSupportsPlaybackRate,
|
|
12
|
+
getAvailableLocales,
|
|
13
|
+
getLocaleDisplayName,
|
|
12
14
|
} from "@livepeer-frameworks/player-core";
|
|
13
|
-
import type { PlaybackMode } from "@livepeer-frameworks/player-core";
|
|
15
|
+
import type { PlaybackMode, FwLocale } from "@livepeer-frameworks/player-core";
|
|
14
16
|
import type { PlayerControllerHost } from "../controllers/player-controller-host.js";
|
|
15
17
|
|
|
16
18
|
@customElement("fw-settings-menu")
|
|
@@ -23,6 +25,7 @@ export class FwSettingsMenu extends LitElement {
|
|
|
23
25
|
@property({ type: String, attribute: "quality-value" }) qualityValue?: string;
|
|
24
26
|
@property({ type: String, attribute: "caption-value" }) captionValue?: string;
|
|
25
27
|
@property({ type: Boolean, attribute: "supports-playback-rate" }) supportsPlaybackRate?: boolean;
|
|
28
|
+
@property({ attribute: "active-locale" }) activeLocale?: FwLocale;
|
|
26
29
|
|
|
27
30
|
@state() private _playbackRate = 1;
|
|
28
31
|
|
|
@@ -109,6 +112,16 @@ export class FwSettingsMenu extends LitElement {
|
|
|
109
112
|
this._close();
|
|
110
113
|
}
|
|
111
114
|
|
|
115
|
+
private _handleLocaleChange(locale: FwLocale): void {
|
|
116
|
+
this.dispatchEvent(
|
|
117
|
+
new CustomEvent("fw-locale-change", {
|
|
118
|
+
detail: { locale },
|
|
119
|
+
bubbles: true,
|
|
120
|
+
composed: true,
|
|
121
|
+
})
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
112
125
|
private _deriveFallbackQualities(): Array<{
|
|
113
126
|
id: string;
|
|
114
127
|
label: string;
|
|
@@ -166,11 +179,11 @@ export class FwSettingsMenu extends LitElement {
|
|
|
166
179
|
this.supportsPlaybackRate ?? coreSupportsPlaybackRate(state.videoElement);
|
|
167
180
|
|
|
168
181
|
return html`
|
|
169
|
-
<div class="fw-
|
|
182
|
+
<div class="fw-settings-menu" role="menu" aria-label=${this.pc.t("settings")}>
|
|
170
183
|
${this.isContentLive
|
|
171
184
|
? html`
|
|
172
185
|
<div class="fw-settings-section">
|
|
173
|
-
<div class="fw-settings-label"
|
|
186
|
+
<div class="fw-settings-label">${this.pc.t("mode")}</div>
|
|
174
187
|
<div class="fw-settings-options">
|
|
175
188
|
${(["auto", "low-latency", "quality"] as const).map(
|
|
176
189
|
(mode) => html`
|
|
@@ -182,7 +195,11 @@ export class FwSettingsMenu extends LitElement {
|
|
|
182
195
|
})}
|
|
183
196
|
@click=${() => this._handleModeChange(mode)}
|
|
184
197
|
>
|
|
185
|
-
${mode === "low-latency"
|
|
198
|
+
${mode === "low-latency"
|
|
199
|
+
? this.pc.t("fast")
|
|
200
|
+
: mode === "quality"
|
|
201
|
+
? this.pc.t("stable")
|
|
202
|
+
: this.pc.t("auto")}
|
|
186
203
|
</button>
|
|
187
204
|
`
|
|
188
205
|
)}
|
|
@@ -193,7 +210,7 @@ export class FwSettingsMenu extends LitElement {
|
|
|
193
210
|
${supportsPlaybackRate
|
|
194
211
|
? html`
|
|
195
212
|
<div class="fw-settings-section">
|
|
196
|
-
<div class="fw-settings-label"
|
|
213
|
+
<div class="fw-settings-label">${this.pc.t("speed")}</div>
|
|
197
214
|
<div class="fw-settings-options fw-settings-options--wrap">
|
|
198
215
|
${SPEED_PRESETS.map(
|
|
199
216
|
(rate) => html`
|
|
@@ -216,7 +233,7 @@ export class FwSettingsMenu extends LitElement {
|
|
|
216
233
|
${qualities.length > 0
|
|
217
234
|
? html`
|
|
218
235
|
<div class="fw-settings-section">
|
|
219
|
-
<div class="fw-settings-label"
|
|
236
|
+
<div class="fw-settings-label">${this.pc.t("quality")}</div>
|
|
220
237
|
<div class="fw-settings-list">
|
|
221
238
|
<button
|
|
222
239
|
type="button"
|
|
@@ -226,7 +243,7 @@ export class FwSettingsMenu extends LitElement {
|
|
|
226
243
|
})}
|
|
227
244
|
@click=${() => this._handleQualityChange("auto")}
|
|
228
245
|
>
|
|
229
|
-
|
|
246
|
+
${this.pc.t("auto")}
|
|
230
247
|
</button>
|
|
231
248
|
${qualities.map(
|
|
232
249
|
(quality) => html`
|
|
@@ -249,7 +266,7 @@ export class FwSettingsMenu extends LitElement {
|
|
|
249
266
|
${textTracks.length > 0
|
|
250
267
|
? html`
|
|
251
268
|
<div class="fw-settings-section">
|
|
252
|
-
<div class="fw-settings-label"
|
|
269
|
+
<div class="fw-settings-label">${this.pc.t("captions")}</div>
|
|
253
270
|
<div class="fw-settings-list">
|
|
254
271
|
<button
|
|
255
272
|
type="button"
|
|
@@ -259,7 +276,7 @@ export class FwSettingsMenu extends LitElement {
|
|
|
259
276
|
})}
|
|
260
277
|
@click=${() => this._handleCaptionChange("none")}
|
|
261
278
|
>
|
|
262
|
-
|
|
279
|
+
${this.pc.t("captionsOff")}
|
|
263
280
|
</button>
|
|
264
281
|
${textTracks.map(
|
|
265
282
|
(track) => html`
|
|
@@ -279,6 +296,29 @@ export class FwSettingsMenu extends LitElement {
|
|
|
279
296
|
</div>
|
|
280
297
|
`
|
|
281
298
|
: nothing}
|
|
299
|
+
${this.activeLocale !== undefined
|
|
300
|
+
? html`
|
|
301
|
+
<div class="fw-settings-section">
|
|
302
|
+
<div class="fw-settings-label">${this.pc.t("language")}</div>
|
|
303
|
+
<div class="fw-settings-list">
|
|
304
|
+
${getAvailableLocales().map(
|
|
305
|
+
(loc) => html`
|
|
306
|
+
<button
|
|
307
|
+
type="button"
|
|
308
|
+
class=${classMap({
|
|
309
|
+
"fw-settings-list-item": true,
|
|
310
|
+
"fw-settings-list-item--active": this.activeLocale === loc,
|
|
311
|
+
})}
|
|
312
|
+
@click=${() => this._handleLocaleChange(loc)}
|
|
313
|
+
>
|
|
314
|
+
${getLocaleDisplayName(loc)}
|
|
315
|
+
</button>
|
|
316
|
+
`
|
|
317
|
+
)}
|
|
318
|
+
</div>
|
|
319
|
+
</div>
|
|
320
|
+
`
|
|
321
|
+
: nothing}
|
|
282
322
|
</div>
|
|
283
323
|
`;
|
|
284
324
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { LitElement, css, html, nothing } from "lit";
|
|
2
2
|
import { customElement, property } from "lit/decorators.js";
|
|
3
3
|
import type { StreamStatus } from "@livepeer-frameworks/player-core";
|
|
4
|
+
import { createTranslator, type TranslateFn } from "@livepeer-frameworks/player-core";
|
|
4
5
|
import { sharedStyles } from "../styles/shared-styles.js";
|
|
5
6
|
|
|
6
7
|
@customElement("fw-stream-state-overlay")
|
|
@@ -11,6 +12,13 @@ export class FwStreamStateOverlay extends LitElement {
|
|
|
11
12
|
@property({ type: Boolean }) visible = true;
|
|
12
13
|
@property({ type: Boolean, attribute: "retry-enabled" }) retryEnabled = false;
|
|
13
14
|
@property({ attribute: false }) onRetry?: () => void;
|
|
15
|
+
@property({ attribute: false }) translator?: TranslateFn;
|
|
16
|
+
|
|
17
|
+
private _defaultTranslator: TranslateFn = createTranslator({ locale: "en" });
|
|
18
|
+
|
|
19
|
+
private get _t(): TranslateFn {
|
|
20
|
+
return this.translator ?? this._defaultTranslator;
|
|
21
|
+
}
|
|
14
22
|
|
|
15
23
|
static styles = [
|
|
16
24
|
sharedStyles,
|
|
@@ -294,15 +302,15 @@ export class FwStreamStateOverlay extends LitElement {
|
|
|
294
302
|
`
|
|
295
303
|
: nothing}
|
|
296
304
|
${this.status === "OFFLINE"
|
|
297
|
-
? html`<p class="hint"
|
|
305
|
+
? html`<p class="hint">${this._t("broadcasterGoLive")}</p>`
|
|
298
306
|
: nothing}
|
|
299
307
|
${this.status === "BOOTING" || this.status === "WAITING_FOR_DATA"
|
|
300
|
-
? html`<p class="hint"
|
|
308
|
+
? html`<p class="hint">${this._t("streamPreparing")}</p>`
|
|
301
309
|
: nothing}
|
|
302
310
|
${!showRetry
|
|
303
311
|
? html`<div class="polling-indicator">
|
|
304
312
|
<span class="polling-dot"></span>
|
|
305
|
-
<span
|
|
313
|
+
<span>${this._t("checkingStatus")}</span>
|
|
306
314
|
</div>`
|
|
307
315
|
: nothing}
|
|
308
316
|
</div>
|
|
@@ -312,9 +320,9 @@ export class FwStreamStateOverlay extends LitElement {
|
|
|
312
320
|
type="button"
|
|
313
321
|
class="btn-flush"
|
|
314
322
|
@click=${this._handleRetry}
|
|
315
|
-
aria-label
|
|
323
|
+
aria-label=${this._t("retryConnection")}
|
|
316
324
|
>
|
|
317
|
-
|
|
325
|
+
${this._t("retryConnection")}
|
|
318
326
|
</button>
|
|
319
327
|
</div>`
|
|
320
328
|
: nothing}
|
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import { LitElement, html, css, nothing } from "lit";
|
|
2
2
|
import { customElement, property } from "lit/decorators.js";
|
|
3
3
|
import { closeIcon } from "../icons/index.js";
|
|
4
|
+
import { createTranslator, type TranslateFn } from "@livepeer-frameworks/player-core";
|
|
4
5
|
|
|
5
6
|
@customElement("fw-toast")
|
|
6
7
|
export class FwToast extends LitElement {
|
|
7
8
|
@property({ type: String }) message = "";
|
|
9
|
+
@property({ attribute: false }) translator?: TranslateFn;
|
|
10
|
+
|
|
11
|
+
private _defaultTranslator: TranslateFn = createTranslator({ locale: "en" });
|
|
12
|
+
|
|
13
|
+
private get _t(): TranslateFn {
|
|
14
|
+
return this.translator ?? this._defaultTranslator;
|
|
15
|
+
}
|
|
8
16
|
|
|
9
17
|
static styles = css`
|
|
10
18
|
:host {
|
|
@@ -53,7 +61,9 @@ export class FwToast extends LitElement {
|
|
|
53
61
|
return html`
|
|
54
62
|
<div class="toast">
|
|
55
63
|
<span>${this.message}</span>
|
|
56
|
-
<button type="button" @click=${this._dismiss} aria-label
|
|
64
|
+
<button type="button" @click=${this._dismiss} aria-label=${this._t("dismiss")}>
|
|
65
|
+
${closeIcon()}
|
|
66
|
+
</button>
|
|
57
67
|
</div>
|
|
58
68
|
`;
|
|
59
69
|
}
|
|
@@ -76,6 +76,13 @@ export class FwVolumeControl extends LitElement {
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
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;
|
|
84
|
+
}
|
|
85
|
+
|
|
79
86
|
const video = this.pc?.s.videoElement;
|
|
80
87
|
if (!video) {
|
|
81
88
|
this._hasAudio = true;
|
|
@@ -260,8 +267,12 @@ export class FwVolumeControl extends LitElement {
|
|
|
260
267
|
}
|
|
261
268
|
}}
|
|
262
269
|
?disabled=${!this._hasAudio}
|
|
263
|
-
aria-label=${!this._hasAudio
|
|
264
|
-
|
|
270
|
+
aria-label=${!this._hasAudio
|
|
271
|
+
? "No audio"
|
|
272
|
+
: isMuted
|
|
273
|
+
? this.pc.t("unmute")
|
|
274
|
+
: this.pc.t("mute")}
|
|
275
|
+
title=${!this._hasAudio ? "No audio" : isMuted ? this.pc.t("unmute") : this.pc.t("mute")}
|
|
265
276
|
>
|
|
266
277
|
${isMuted || !this._hasAudio ? volumeOffIcon(16) : volumeUpIcon(16)}
|
|
267
278
|
</button>
|
|
@@ -276,7 +287,7 @@ export class FwVolumeControl extends LitElement {
|
|
|
276
287
|
<div
|
|
277
288
|
class="slider"
|
|
278
289
|
role="slider"
|
|
279
|
-
aria-label
|
|
290
|
+
aria-label=${this.pc.t("volume")}
|
|
280
291
|
aria-valuemin="0"
|
|
281
292
|
aria-valuemax="100"
|
|
282
293
|
aria-valuenow=${Math.round(displayVolume * 100)}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import type { ReactiveController, ReactiveControllerHost } from "lit";
|
|
6
6
|
import {
|
|
7
7
|
PlayerController,
|
|
8
|
+
createTranslator,
|
|
8
9
|
type PlayerControllerConfig,
|
|
9
10
|
type PlayerState,
|
|
10
11
|
type StreamState,
|
|
@@ -13,6 +14,8 @@ import {
|
|
|
13
14
|
type ContentEndpoints,
|
|
14
15
|
type ContentMetadata,
|
|
15
16
|
type ClassifiedError,
|
|
17
|
+
type TranslateFn,
|
|
18
|
+
type I18nConfig,
|
|
16
19
|
} from "@livepeer-frameworks/player-core";
|
|
17
20
|
|
|
18
21
|
export interface PlayerControllerHostState {
|
|
@@ -105,11 +108,20 @@ export class PlayerControllerHost implements ReactiveController {
|
|
|
105
108
|
|
|
106
109
|
s: PlayerControllerHostState = { ...initialState };
|
|
107
110
|
|
|
111
|
+
/** Translation function, updated when locale changes. */
|
|
112
|
+
t: TranslateFn = createTranslator({ locale: "en" });
|
|
113
|
+
|
|
108
114
|
constructor(host: HostElement) {
|
|
109
115
|
this.host = host;
|
|
110
116
|
host.addController(this);
|
|
111
117
|
}
|
|
112
118
|
|
|
119
|
+
/** Rebuild the translator when locale or custom translations change. */
|
|
120
|
+
updateTranslator(config: I18nConfig) {
|
|
121
|
+
this.t = createTranslator(config);
|
|
122
|
+
this.host.requestUpdate();
|
|
123
|
+
}
|
|
124
|
+
|
|
113
125
|
// ---- Configuration & Lifecycle ----
|
|
114
126
|
|
|
115
127
|
configure(config: PlayerControllerConfig) {
|
|
@@ -434,6 +446,12 @@ export class PlayerControllerHost implements ReactiveController {
|
|
|
434
446
|
async retry() {
|
|
435
447
|
await this.controller?.retry();
|
|
436
448
|
}
|
|
449
|
+
async tryNextSource() {
|
|
450
|
+
await this.controller?.retryWithFallback();
|
|
451
|
+
}
|
|
452
|
+
canAttemptFallback(): boolean {
|
|
453
|
+
return this.controller?.canAttemptFallback() ?? false;
|
|
454
|
+
}
|
|
437
455
|
async reload() {
|
|
438
456
|
await this.controller?.reload();
|
|
439
457
|
}
|
package/src/index.ts
CHANGED
|
@@ -30,6 +30,16 @@ export { FwSkipIndicator } from "./components/fw-skip-indicator.js";
|
|
|
30
30
|
export { FwSpeedIndicator } from "./components/fw-speed-indicator.js";
|
|
31
31
|
export { FwContextMenu } from "./components/fw-context-menu.js";
|
|
32
32
|
|
|
33
|
+
// Composable control elements
|
|
34
|
+
export {
|
|
35
|
+
FwPlayButton,
|
|
36
|
+
FwSkipButton,
|
|
37
|
+
FwVolumeControl as FwVolumeButton,
|
|
38
|
+
FwTimeDisplay,
|
|
39
|
+
FwLiveBadge,
|
|
40
|
+
FwFullscreenButton,
|
|
41
|
+
} from "./components/controls/index.js";
|
|
42
|
+
|
|
33
43
|
// Controller
|
|
34
44
|
export { PlayerControllerHost } from "./controllers/player-controller-host.js";
|
|
35
45
|
export type { PlayerControllerHostState } from "./controllers/player-controller-host.js";
|