@mango-iiif/av 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +1 -0
- package/dist/annotations.d.ts +2 -2
- package/dist/annotations.js +3 -3
- package/dist/chapters.d.ts +2 -2
- package/dist/chapters.js +3 -3
- package/dist/{chunk-FF6BLZ6W.js → chunk-4NOWGMI5.js} +9 -1
- package/dist/chunk-4NOWGMI5.js.map +1 -0
- package/dist/{chunk-4FBOXHMO.js → chunk-4V6FME6B.js} +76 -20
- package/dist/chunk-4V6FME6B.js.map +1 -0
- package/dist/{chunk-P7TOB5QS.js → chunk-C4H46HDS.js} +4 -3
- package/dist/chunk-C4H46HDS.js.map +1 -0
- package/dist/{chunk-5BWGKBKC.js → chunk-CIAQZ2EB.js} +2 -2
- package/dist/{chunk-HHDOPDXV.js → chunk-EHIKFRFV.js} +3 -3
- package/dist/{chunk-3PDSZOH3.js → chunk-ELGGWWDS.js} +48 -9
- package/dist/chunk-ELGGWWDS.js.map +1 -0
- package/dist/{chunk-5YLZTGEM.js → chunk-FVYEV2LO.js} +4 -4
- package/dist/{chunk-PI3ID6LG.js → chunk-YX32ZQPR.js} +3 -3
- package/dist/{chunk-2CWHBQQY.js → chunk-YX6L6CUF.js} +81 -21
- package/dist/chunk-YX6L6CUF.js.map +1 -0
- package/dist/{controller-BLA8XNsG.d.ts → controller-SkwGkVE8.d.ts} +8 -0
- package/dist/{controller-element-BY0157ve.d.ts → controller-element-CkXIA6w2.d.ts} +1 -1
- package/dist/core.d.ts +2 -2
- package/dist/core.js +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +9 -9
- package/dist/media.d.ts +1 -1
- package/dist/media.js +4 -4
- package/dist/player.d.ts +2 -2
- package/dist/player.js +5 -5
- package/dist/transcript-element.d.ts +2 -2
- package/dist/transcript-element.js +4 -4
- package/docs/API.md +7 -1
- package/package.json +2 -1
- package/dist/chunk-2CWHBQQY.js.map +0 -1
- package/dist/chunk-3PDSZOH3.js.map +0 -1
- package/dist/chunk-4FBOXHMO.js.map +0 -1
- package/dist/chunk-FF6BLZ6W.js.map +0 -1
- package/dist/chunk-P7TOB5QS.js.map +0 -1
- /package/dist/{chunk-5BWGKBKC.js.map → chunk-CIAQZ2EB.js.map} +0 -0
- /package/dist/{chunk-HHDOPDXV.js.map → chunk-EHIKFRFV.js.map} +0 -0
- /package/dist/{chunk-5YLZTGEM.js.map → chunk-FVYEV2LO.js.map} +0 -0
- /package/dist/{chunk-PI3ID6LG.js.map → chunk-YX32ZQPR.js.map} +0 -0
|
@@ -1,23 +1,25 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AudioArtVisualizer,
|
|
3
|
+
applyMediaSource,
|
|
3
4
|
audioArtContentHtml,
|
|
4
5
|
audioArtTranscriptHtml,
|
|
5
6
|
ensureMediaChrome,
|
|
7
|
+
resolveAudioMediaPolicy,
|
|
6
8
|
resolveAudioVisualizerMode,
|
|
7
9
|
syncAudioArtTranscript
|
|
8
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-ELGGWWDS.js";
|
|
9
11
|
import {
|
|
10
12
|
AVControllerElement,
|
|
11
13
|
componentTheme
|
|
12
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-C4H46HDS.js";
|
|
13
15
|
import {
|
|
14
16
|
loadTranscript
|
|
15
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-CIAQZ2EB.js";
|
|
16
18
|
import {
|
|
17
19
|
escapeHtml,
|
|
18
20
|
formatString,
|
|
19
21
|
resolveStrings
|
|
20
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-4NOWGMI5.js";
|
|
21
23
|
|
|
22
24
|
// src/components/mango-av-player.ts
|
|
23
25
|
var hlsElementRegistration;
|
|
@@ -57,6 +59,7 @@ var MangoAVPlayerElement = class extends AVControllerElement {
|
|
|
57
59
|
#config = {};
|
|
58
60
|
#resolvedSourceUrl;
|
|
59
61
|
#sourceToken = 0;
|
|
62
|
+
#fallbackSourceUrl;
|
|
60
63
|
#transcriptCues = [];
|
|
61
64
|
#transcriptToken = 0;
|
|
62
65
|
#visualizer = new AudioArtVisualizer();
|
|
@@ -117,30 +120,35 @@ var MangoAVPlayerElement = class extends AVControllerElement {
|
|
|
117
120
|
return this.controller.selectCanvas(indexOrId, options);
|
|
118
121
|
}
|
|
119
122
|
controllerChanged() {
|
|
123
|
+
this.#resetSourceLoad();
|
|
120
124
|
this.#transcriptCues = [];
|
|
121
125
|
this.#render();
|
|
122
126
|
void this.#loadTranscript();
|
|
127
|
+
void this.#resolveSource();
|
|
123
128
|
}
|
|
124
129
|
handleControllerEvent(type, event) {
|
|
125
130
|
if (type === "av-configchange") {
|
|
126
|
-
this.#
|
|
131
|
+
this.#resetSourceLoad();
|
|
127
132
|
void ensureMediaChrome(this.controller.config.preferredLanguages[0]).then(() => {
|
|
128
133
|
this.#render();
|
|
129
134
|
void this.#loadTranscript();
|
|
130
135
|
void this.#resolveSource();
|
|
131
136
|
});
|
|
132
137
|
} else if (type === "av-ready" || type === "av-canvaschange") {
|
|
133
|
-
this.#
|
|
138
|
+
this.#resetSourceLoad();
|
|
134
139
|
this.#transcriptCues = [];
|
|
135
140
|
if (this.controller.source?.isHls) void ensureHlsElement();
|
|
136
141
|
this.#render();
|
|
137
142
|
void this.#loadTranscript();
|
|
138
143
|
void this.#resolveSource();
|
|
139
|
-
} else if (type === "av-sourcechange"
|
|
140
|
-
this.#
|
|
144
|
+
} else if (type === "av-sourcechange") {
|
|
145
|
+
this.#resetSourceLoad();
|
|
141
146
|
if (this.controller.source?.isHls) void ensureHlsElement();
|
|
142
147
|
this.#render();
|
|
143
148
|
void this.#resolveSource();
|
|
149
|
+
} else if (type === "av-error") {
|
|
150
|
+
this.#resolvedSourceUrl = void 0;
|
|
151
|
+
this.#render();
|
|
144
152
|
} else if (type === "av-seek") {
|
|
145
153
|
syncAudioArtTranscript(this.#root, event.detail.to, true);
|
|
146
154
|
} else if (type === "av-timeupdate" || type === "av-statechange") {
|
|
@@ -172,12 +180,7 @@ var MangoAVPlayerElement = class extends AVControllerElement {
|
|
|
172
180
|
${canvas && source ? this.#readyHtml(canvas, source) : state.status !== "loading" && state.status !== "error" ? `<div class="audio-art"><span>${escapeHtml(ui.noMediaLoaded)}</span></div>` : ""}
|
|
173
181
|
</div>`;
|
|
174
182
|
const media = this.#root.querySelector("video, audio, hls-video");
|
|
175
|
-
if (media)
|
|
176
|
-
this.controller.attachMedia(media);
|
|
177
|
-
const art = this.#root.querySelector(".audio-art.visualizer");
|
|
178
|
-
const visualizerMode = resolveAudioVisualizerMode(this.controller.config.audioArt.visualizer);
|
|
179
|
-
if (art && media instanceof HTMLAudioElement && visualizerMode) this.#visualizer.connect(media, art, visualizerMode);
|
|
180
|
-
}
|
|
183
|
+
if (media && this.#resolvedSourceUrl) this.#activateMedia(media, this.#resolvedSourceUrl);
|
|
181
184
|
syncAudioArtTranscript(this.#root, this.controller.state.currentTime);
|
|
182
185
|
this.#bind();
|
|
183
186
|
}
|
|
@@ -191,7 +194,7 @@ var MangoAVPlayerElement = class extends AVControllerElement {
|
|
|
191
194
|
const showToolbar = controls.navigation || controls.autoAdvance || showSourceSelector;
|
|
192
195
|
const visualizerMode = resolveAudioVisualizerMode(this.controller.config.audioArt.visualizer);
|
|
193
196
|
return `<media-controller ${kind === "audio" ? "audio" : ""} ${language ? `lang="${escapeHtml(language)}"` : ""}>
|
|
194
|
-
${kind === "audio" ? `<div class="audio-art ${visualizerMode ? `visualizer visualizer--${visualizerMode}` : ""}">${audioArtContentHtml(canvas.label, this.#transcriptCues, Boolean(this.controller.config.audioArt.transcript), visualizerMode)}</div>` : ""}
|
|
197
|
+
${kind === "audio" ? `<div class="audio-art ${visualizerMode ? `visualizer visualizer--${visualizerMode}` : ""}">${audioArtContentHtml(canvas.label, this.controller.config.audioArt.title ?? "", this.#transcriptCues, Boolean(this.controller.config.audioArt.transcript), visualizerMode)}</div>` : ""}
|
|
195
198
|
${this.#mediaHtml(canvas, source)}
|
|
196
199
|
<slot name="overlay"></slot>
|
|
197
200
|
<slot name="controls">
|
|
@@ -223,10 +226,8 @@ var MangoAVPlayerElement = class extends AVControllerElement {
|
|
|
223
226
|
}
|
|
224
227
|
#mediaHtml(canvas, source) {
|
|
225
228
|
const tag = source.isHls ? "hls-video" : source.kind;
|
|
226
|
-
const sourceUrl = this.#resolvedSourceUrl ?? (this.controller.config.resolveRequest ? "" : source.src);
|
|
227
229
|
const attributes = [
|
|
228
230
|
'slot="media"',
|
|
229
|
-
sourceUrl ? `src="${escapeHtml(sourceUrl)}"` : "",
|
|
230
231
|
`preload="${this.controller.config.preload}"`,
|
|
231
232
|
this.controller.config.crossorigin ? `crossorigin="${this.controller.config.crossorigin}"` : "",
|
|
232
233
|
source.kind === "video" && canvas.poster ? `poster="${escapeHtml(canvas.poster)}"` : "",
|
|
@@ -243,18 +244,77 @@ var MangoAVPlayerElement = class extends AVControllerElement {
|
|
|
243
244
|
this.#root.querySelector("[data-action=auto-advance]")?.addEventListener("change", (event) => this.controller.setAutoAdvance(event.target.checked));
|
|
244
245
|
}
|
|
245
246
|
async #resolveSource() {
|
|
246
|
-
if (!this.controller.config.resolveRequest) return;
|
|
247
247
|
const token = ++this.#sourceToken;
|
|
248
248
|
try {
|
|
249
249
|
const url = await this.controller.resolvedSourceUrl();
|
|
250
250
|
if (token !== this.#sourceToken || !url) return;
|
|
251
251
|
this.#resolvedSourceUrl = url;
|
|
252
|
-
this.#root.querySelector("video, audio, hls-video")
|
|
252
|
+
const media = this.#root.querySelector("video, audio, hls-video");
|
|
253
|
+
if (media) this.#activateMedia(media, url);
|
|
253
254
|
} catch (cause) {
|
|
254
255
|
const error = cause instanceof Error ? cause : new Error(String(cause));
|
|
255
256
|
this.dispatchEvent(new CustomEvent("av-error", { detail: { error }, bubbles: true, composed: true }));
|
|
256
257
|
}
|
|
257
258
|
}
|
|
259
|
+
#activateMedia(media, sourceUrl) {
|
|
260
|
+
const mode = resolveAudioVisualizerMode(this.controller.config.audioArt.visualizer);
|
|
261
|
+
const policy = resolveAudioMediaPolicy(
|
|
262
|
+
sourceUrl,
|
|
263
|
+
this.controller.config.crossorigin,
|
|
264
|
+
this.controller.crossoriginExplicit,
|
|
265
|
+
media instanceof HTMLAudioElement ? mode : void 0,
|
|
266
|
+
this.#fallbackSourceUrl === sourceUrl
|
|
267
|
+
);
|
|
268
|
+
if (media instanceof HTMLAudioElement && policy.implicitCors) {
|
|
269
|
+
media.addEventListener("error", (event) => {
|
|
270
|
+
if (this.#fallbackSourceUrl === sourceUrl) return;
|
|
271
|
+
event.stopImmediatePropagation();
|
|
272
|
+
this.#fallbackToOrdinaryAudio(media, sourceUrl);
|
|
273
|
+
}, { once: true });
|
|
274
|
+
}
|
|
275
|
+
if (media instanceof HTMLAudioElement && mode && policy.visualize) {
|
|
276
|
+
const connect = () => {
|
|
277
|
+
const art = this.#root.querySelector(".audio-art.visualizer");
|
|
278
|
+
if (art && media.isConnected && (media.currentSrc === sourceUrl || media.src === sourceUrl)) {
|
|
279
|
+
this.#visualizer.connect(media, art, mode);
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
media.addEventListener("loadedmetadata", connect, { once: true });
|
|
283
|
+
if (media.readyState >= HTMLMediaElement.HAVE_METADATA) queueMicrotask(connect);
|
|
284
|
+
}
|
|
285
|
+
this.controller.attachMedia(media);
|
|
286
|
+
applyMediaSource(media, sourceUrl, policy.crossOrigin);
|
|
287
|
+
}
|
|
288
|
+
#fallbackToOrdinaryAudio(failed, sourceUrl) {
|
|
289
|
+
this.#fallbackSourceUrl = sourceUrl;
|
|
290
|
+
this.#visualizer.disconnect();
|
|
291
|
+
const requestedTime = this.controller.state.currentTime;
|
|
292
|
+
const shouldPlay = this.controller.state.status === "playing" || !failed.paused;
|
|
293
|
+
const replacement = failed.cloneNode(true);
|
|
294
|
+
replacement.removeAttribute("src");
|
|
295
|
+
replacement.removeAttribute("crossorigin");
|
|
296
|
+
replacement.volume = failed.volume;
|
|
297
|
+
replacement.muted = failed.muted;
|
|
298
|
+
replacement.playbackRate = failed.playbackRate;
|
|
299
|
+
const hadFocus = this.#root.activeElement === failed;
|
|
300
|
+
failed.replaceWith(replacement);
|
|
301
|
+
this.controller.attachMedia(replacement);
|
|
302
|
+
this.controller.seekTo(requestedTime);
|
|
303
|
+
if (hadFocus) replacement.focus();
|
|
304
|
+
const art = this.#root.querySelector(".audio-art");
|
|
305
|
+
art?.classList.remove("visualizer");
|
|
306
|
+
applyMediaSource(replacement, sourceUrl);
|
|
307
|
+
if (shouldPlay) replacement.addEventListener("loadedmetadata", () => void replacement.play().catch(() => void 0), { once: true });
|
|
308
|
+
this.controller.dispatchEvent(new CustomEvent("av-visualizerfallback", {
|
|
309
|
+
detail: { canvasId: this.controller.canvas?.id ?? "", sourceUrl, reason: "cors" }
|
|
310
|
+
}));
|
|
311
|
+
}
|
|
312
|
+
#resetSourceLoad() {
|
|
313
|
+
this.#sourceToken += 1;
|
|
314
|
+
this.#resolvedSourceUrl = void 0;
|
|
315
|
+
this.#fallbackSourceUrl = void 0;
|
|
316
|
+
this.#visualizer.disconnect();
|
|
317
|
+
}
|
|
258
318
|
async #loadTranscript() {
|
|
259
319
|
const resource = this.controller.canvas?.transcripts[0];
|
|
260
320
|
if (!resource || !this.controller.config.audioArt.transcript) return;
|
|
@@ -272,7 +332,7 @@ var MangoAVPlayerElement = class extends AVControllerElement {
|
|
|
272
332
|
const canvas = this.controller.canvas;
|
|
273
333
|
if (art && canvas && this.controller.source?.kind === "audio") {
|
|
274
334
|
const text = art.querySelector(".audio-art-text");
|
|
275
|
-
if (text) text.innerHTML = audioArtTranscriptHtml(canvas.label, cues, true);
|
|
335
|
+
if (text) text.innerHTML = audioArtTranscriptHtml(canvas.label, this.controller.config.audioArt.title ?? "", cues, true);
|
|
276
336
|
syncAudioArtTranscript(art, this.controller.state.currentTime);
|
|
277
337
|
}
|
|
278
338
|
} catch (cause) {
|
|
@@ -292,4 +352,4 @@ export {
|
|
|
292
352
|
MangoAVPlayerElement,
|
|
293
353
|
defineMangoAVPlayer
|
|
294
354
|
};
|
|
295
|
-
//# sourceMappingURL=chunk-
|
|
355
|
+
//# sourceMappingURL=chunk-YX6L6CUF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/mango-av-player.ts"],"sourcesContent":["import { AVControllerElement } from './controller-element';\nimport { componentTheme } from './component-styles';\nimport { ensureMediaChrome } from './media-chrome';\nimport { AudioArtVisualizer, audioArtContentHtml, audioArtTranscriptHtml, resolveAudioVisualizerMode, syncAudioArtTranscript } from './audio-art';\nimport { loadTranscript } from '../transcript';\nimport type { AVCanvas, AVManifest, AVPlayerConfig, AVPlayerEventMap, JsonObject, MediaSource, TranscriptCue } from '../types';\nimport { escapeHtml, formatString, resolveStrings } from '../utils';\nimport { applyMediaSource, resolveAudioMediaPolicy } from './media-policy';\n\nlet hlsElementRegistration: Promise<unknown> | undefined;\nconst ensureHlsElement = (): Promise<unknown> => {\n hlsElementRegistration ??= import('hls-video-element');\n return hlsElementRegistration;\n};\n\nconst styles = `${componentTheme}\n :host { --mango-av-player-aspect-ratio: 16 / 9; }\n .player { background: #08080a; border-radius: var(--mango-av-radius); color: white; overflow: clip; position: relative; }\n media-controller { display: block; width: 100%; }\n media-controller:not([audio]) { aspect-ratio: var(--mango-av-player-aspect-ratio); }\n video, hls-video { display: block; height: 100%; object-fit: contain; width: 100%; }\n audio { width: 100%; }\n media-control-bar { width: 100%; }\n .audio-art { --mango-av-wave-edge-strength: 0%; --mango-av-wave-mid-strength: 0%; --mango-av-wave-rise: 8%; --mango-av-wave-strength: 0%; align-items: center; aspect-ratio: 16 / 7; background: linear-gradient(#09080d, #111019); display: flex; justify-content: center; overflow: hidden; padding: 2rem; position: relative; text-align: center; }\n .audio-art.visualizer--pulse { background: radial-gradient(ellipse 140% 72% at 50% calc(100% + var(--mango-av-wave-rise)), color-mix(in srgb, var(--mango-av-accent) var(--mango-av-wave-strength), transparent) 0%, color-mix(in srgb, var(--mango-av-accent) var(--mango-av-wave-mid-strength), transparent) 40%, color-mix(in srgb, var(--mango-av-accent) var(--mango-av-wave-edge-strength), transparent) 62%, transparent 78%), linear-gradient(#09080d, #111019); }\n .audio-art-text { display: contents; }\n .audio-art-visualizer-canvas { height: 100%; inset: 0; pointer-events: none; position: absolute; width: 100%; }\n .audio-art-title { font-size: clamp(1.1rem, 3vw, 2rem); font-weight: 700; position: relative; z-index: 1; }\n .audio-art-transcript { height: 100%; inset: 0; overflow: hidden; position: absolute; z-index: 1; }\n .audio-art-cue { align-items: center; display: flex; flex-direction: column; font-size: clamp(.7rem, 1.3vw, .875rem); font-weight: 550; gap: .15rem; left: 12%; line-height: 1.35; position: absolute; right: 12%; top: 50%; transition: opacity 360ms ease, transform 480ms cubic-bezier(.22, 1, .36, 1); }\n .audio-art-transcript.seeking .audio-art-cue { transition: none; }\n .audio-art-cue.active { font-size: clamp(.78rem, 1.5vw, 1rem); font-weight: 650; }\n .audio-art-cue > span:last-child { display: -webkit-box; overflow: hidden; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }\n .audio-art-speaker { font-size: .7em; letter-spacing: .04em; text-transform: uppercase; }\n .toolbar { align-items: center; background: #151518; display: flex; flex-wrap: wrap; gap: .5rem; justify-content: space-between; padding: .55rem .7rem; }\n .toolbar button, .toolbar select { background: #29292e; border: 1px solid #44444a; border-radius: .35rem; color: white; padding: .4rem .55rem; }\n .group { align-items: center; display: flex; gap: .45rem; }\n .error { background: #fff0f0; color: #8a1717; padding: 1rem; }\n .sr-only { clip: rect(0,0,0,0); clip-path: inset(50%); height: 1px; overflow: hidden; position: absolute; white-space: nowrap; width: 1px; }\n`;\n\nexport class MangoAVPlayerElement extends AVControllerElement {\n static observedAttributes = ['manifest-url', 'config'];\n\n #root: ShadowRoot;\n #manifestInput: JsonObject | string | undefined;\n #config: AVPlayerConfig = {};\n #resolvedSourceUrl: string | undefined;\n #sourceToken = 0;\n #fallbackSourceUrl: string | undefined;\n #transcriptCues: TranscriptCue[] = [];\n #transcriptToken = 0;\n #visualizer = new AudioArtVisualizer();\n\n constructor() {\n super();\n this.#root = this.attachShadow({ mode: 'open' });\n }\n\n get manifest(): JsonObject | string | undefined {\n return this.#manifestInput;\n }\n\n set manifest(value: JsonObject | string | undefined) {\n this.#manifestInput = value;\n if (this.isConnected && value !== undefined) void this.load(value);\n }\n\n get config(): AVPlayerConfig {\n return this.#config;\n }\n\n set config(value: AVPlayerConfig) {\n this.#config = value;\n this.controller.configure(value);\n this.#render();\n }\n\n override connectedCallback(): void {\n this.#readConfigAttribute();\n void ensureMediaChrome(this.controller.config.preferredLanguages[0]);\n super.connectedCallback();\n const source = this.#manifestInput ?? this.getAttribute('manifest-url') ?? undefined;\n if (source !== undefined && !this.controller.manifest) void this.load(source);\n }\n\n override disconnectedCallback(): void {\n this.#visualizer.disconnect();\n super.disconnectedCallback();\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (!this.isConnected || oldValue === newValue) return;\n if (name === 'manifest-url' && newValue) {\n this.#manifestInput = newValue;\n void this.load(newValue);\n } else if (name === 'config') {\n this.#readConfigAttribute();\n this.#render();\n }\n }\n\n async load(input: JsonObject | string): Promise<AVManifest> {\n this.#manifestInput = input;\n return await this.controller.load(input);\n }\n\n play(): Promise<void> { return this.controller.play(); }\n pause(): void { this.controller.pause(); }\n seekTo(time: number): void { this.controller.seekTo(time); }\n selectCanvas(indexOrId: number | string, options?: { time?: number; autoplay?: boolean }): AVCanvas | undefined {\n return this.controller.selectCanvas(indexOrId, options);\n }\n\n protected controllerChanged(): void {\n this.#resetSourceLoad();\n this.#transcriptCues = [];\n this.#render();\n void this.#loadTranscript();\n void this.#resolveSource();\n }\n\n protected handleControllerEvent<K extends keyof AVPlayerEventMap>(type: K, event: CustomEvent<AVPlayerEventMap[K]>): void {\n if (type === 'av-configchange') {\n this.#resetSourceLoad();\n void ensureMediaChrome(this.controller.config.preferredLanguages[0]).then(() => {\n this.#render();\n void this.#loadTranscript();\n void this.#resolveSource();\n });\n } else if (type === 'av-ready' || type === 'av-canvaschange') {\n this.#resetSourceLoad();\n this.#transcriptCues = [];\n if (this.controller.source?.isHls) void ensureHlsElement();\n this.#render();\n void this.#loadTranscript();\n void this.#resolveSource();\n } else if (type === 'av-sourcechange') {\n this.#resetSourceLoad();\n if (this.controller.source?.isHls) void ensureHlsElement();\n this.#render();\n void this.#resolveSource();\n } else if (type === 'av-error') {\n this.#resolvedSourceUrl = undefined;\n this.#render();\n } else if (type === 'av-seek') {\n syncAudioArtTranscript(this.#root, (event.detail as AVPlayerEventMap['av-seek']).to, true);\n } else if (type === 'av-timeupdate' || type === 'av-statechange') {\n syncAudioArtTranscript(this.#root, this.controller.state.currentTime);\n }\n this.dispatchEvent(new CustomEvent(type, { detail: event.detail, bubbles: true, composed: true }));\n }\n\n #readConfigAttribute(): void {\n const value = this.getAttribute('config');\n if (!value) return;\n try {\n this.#config = JSON.parse(value) as AVPlayerConfig;\n this.controller.configure(this.#config);\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n this.dispatchEvent(new CustomEvent('av-error', { detail: { error }, bubbles: true, composed: true }));\n }\n }\n\n #render(): void {\n this.#visualizer.disconnect();\n const state = this.controller.state;\n const canvas = this.controller.canvas;\n const source = this.controller.source;\n const ui = resolveStrings(this.controller.config.strings);\n this.#root.innerHTML = `<style>${styles}</style>\n <div class=\"player\">\n ${state.status === 'loading' ? `<p role=\"status\">${escapeHtml(ui.loadingManifest)}</p>` : ''}\n ${state.status === 'error' ? `<div class=\"error\" role=\"alert\">${escapeHtml(state.error?.message ?? ui.unableToLoadMedia)}</div>` : ''}\n ${canvas && source ? this.#readyHtml(canvas, source) : state.status !== 'loading' && state.status !== 'error' ? `<div class=\"audio-art\"><span>${escapeHtml(ui.noMediaLoaded)}</span></div>` : ''}\n </div>`;\n const media = this.#root.querySelector('video, audio, hls-video') as HTMLMediaElement | null;\n if (media && this.#resolvedSourceUrl) this.#activateMedia(media, this.#resolvedSourceUrl);\n syncAudioArtTranscript(this.#root, this.controller.state.currentTime);\n this.#bind();\n }\n\n #readyHtml(canvas: AVCanvas, source: MediaSource): string {\n const controls = this.controller.config.controls;\n const manifest = this.controller.manifest;\n const kind = source.kind;\n const ui = resolveStrings(this.controller.config.strings);\n const language = this.controller.config.preferredLanguages.find((value) => value !== 'none');\n const showSourceSelector = controls.sourceSelector && canvas.sources.length > 1;\n const showToolbar = controls.navigation || controls.autoAdvance || showSourceSelector;\n const visualizerMode = resolveAudioVisualizerMode(this.controller.config.audioArt.visualizer);\n return `<media-controller ${kind === 'audio' ? 'audio' : ''} ${language ? `lang=\"${escapeHtml(language)}\"` : ''}>\n ${kind === 'audio' ? `<div class=\"audio-art ${visualizerMode ? `visualizer visualizer--${visualizerMode}` : ''}\">${audioArtContentHtml(canvas.label, this.controller.config.audioArt.title ?? '', this.#transcriptCues, Boolean(this.controller.config.audioArt.transcript), visualizerMode)}</div>` : ''}\n ${this.#mediaHtml(canvas, source)}\n <slot name=\"overlay\"></slot>\n <slot name=\"controls\">\n <media-control-bar>\n <media-play-button></media-play-button>\n ${controls.seek ? `<media-seek-backward-button seekoffset=\"${controls.skipSeconds ?? 10}\"></media-seek-backward-button><media-seek-forward-button seekoffset=\"${controls.skipSeconds ?? 10}\"></media-seek-forward-button>` : ''}\n <media-time-display showduration></media-time-display>\n ${controls.seek ? '<media-time-range></media-time-range>' : ''}\n ${controls.volume ? '<media-mute-button></media-mute-button><media-volume-range></media-volume-range>' : ''}\n ${controls.captions && canvas.tracks.length > 0 ? '<media-captions-menu-button></media-captions-menu-button>' : ''}\n ${controls.playbackRate ? '<media-playback-rate-menu-button></media-playback-rate-menu-button>' : ''}\n ${controls.pictureInPicture && kind === 'video' ? '<media-pip-button></media-pip-button>' : ''}\n ${controls.fullscreen && kind === 'video' ? '<media-fullscreen-button></media-fullscreen-button>' : ''}\n </media-control-bar>\n ${controls.captions && canvas.tracks.length > 0 ? '<media-captions-menu hidden></media-captions-menu>' : ''}\n ${controls.playbackRate ? `<media-playback-rate-menu rates=\"${this.controller.config.playbackRates.join(' ')}\" hidden></media-playback-rate-menu>` : ''}\n </slot>\n </media-controller>\n ${showToolbar ? `<div class=\"toolbar\">\n ${controls.navigation ? `<div class=\"group\">\n <button type=\"button\" data-action=\"previous\" ${canvas.index === 0 ? 'disabled' : ''} aria-label=\"${escapeHtml(ui.previousSection)}\">← ${escapeHtml(ui.previous)}</button>\n <button type=\"button\" data-action=\"next\" ${canvas.index === (manifest?.canvases.length ?? 1) - 1 && !this.controller.state.repeat ? 'disabled' : ''} aria-label=\"${escapeHtml(ui.nextSection)}\">${escapeHtml(ui.next)} →</button>\n </div>` : ''}\n ${showSourceSelector || controls.autoAdvance ? `<div class=\"group\">\n ${showSourceSelector ? `<label><span class=\"sr-only\">${escapeHtml(ui.mediaSource)}</span><select data-action=\"source\">${canvas.sources.map((item, index) => `<option value=\"${index}\" ${index === this.controller.state.sourceIndex ? 'selected' : ''}>${escapeHtml(item.label ?? item.format ?? formatString(ui.sourceNumber, { number: index + 1 }))}</option>`).join('')}</select></label>` : ''}\n ${controls.autoAdvance ? `<label><input type=\"checkbox\" data-action=\"auto-advance\" ${this.controller.state.autoAdvance ? 'checked' : ''}> ${escapeHtml(ui.autoAdvance)}</label>` : ''}\n </div>` : ''}\n </div>` : ''}`;\n }\n\n #mediaHtml(canvas: AVCanvas, source: MediaSource): string {\n const tag = source.isHls ? 'hls-video' : source.kind;\n const attributes = [\n 'slot=\"media\"',\n `preload=\"${this.controller.config.preload}\"`,\n this.controller.config.crossorigin ? `crossorigin=\"${this.controller.config.crossorigin}\"` : '',\n source.kind === 'video' && canvas.poster ? `poster=\"${escapeHtml(canvas.poster)}\"` : '',\n `aria-label=\"${escapeHtml(canvas.label)}\"`,\n `data-canvasindex=\"${canvas.index}\"`,\n ].filter(Boolean).join(' ');\n const tracks = canvas.tracks.map((track) => `<track src=\"${escapeHtml(track.src)}\" kind=\"${track.kind}\" label=\"${escapeHtml(track.label)}\" ${track.language ? `srclang=\"${escapeHtml(track.language)}\"` : ''} ${track.default ? 'default' : ''}>`).join('');\n return `<${tag} ${attributes}>${tracks}</${tag}>`;\n }\n\n #bind(): void {\n this.#root.querySelector<HTMLElement>('[data-action=previous]')?.addEventListener('click', () => this.controller.previous({ autoplay: this.controller.state.status === 'playing' }));\n this.#root.querySelector<HTMLElement>('[data-action=next]')?.addEventListener('click', () => this.controller.next({ autoplay: this.controller.state.status === 'playing' }));\n this.#root.querySelector<HTMLSelectElement>('[data-action=source]')?.addEventListener('change', (event) => this.controller.selectSource(Number((event.target as HTMLSelectElement).value)));\n this.#root.querySelector<HTMLInputElement>('[data-action=auto-advance]')?.addEventListener('change', (event) => this.controller.setAutoAdvance((event.target as HTMLInputElement).checked));\n }\n\n async #resolveSource(): Promise<void> {\n const token = ++this.#sourceToken;\n try {\n const url = await this.controller.resolvedSourceUrl();\n if (token !== this.#sourceToken || !url) return;\n this.#resolvedSourceUrl = url;\n const media = this.#root.querySelector('video, audio, hls-video') as HTMLMediaElement | null;\n if (media) this.#activateMedia(media, url);\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n this.dispatchEvent(new CustomEvent('av-error', { detail: { error }, bubbles: true, composed: true }));\n }\n }\n\n #activateMedia(media: HTMLMediaElement, sourceUrl: string): void {\n const mode = resolveAudioVisualizerMode(this.controller.config.audioArt.visualizer);\n const policy = resolveAudioMediaPolicy(\n sourceUrl,\n this.controller.config.crossorigin,\n this.controller.crossoriginExplicit,\n media instanceof HTMLAudioElement ? mode : undefined,\n this.#fallbackSourceUrl === sourceUrl,\n );\n if (media instanceof HTMLAudioElement && policy.implicitCors) {\n media.addEventListener('error', (event) => {\n if (this.#fallbackSourceUrl === sourceUrl) return;\n event.stopImmediatePropagation();\n this.#fallbackToOrdinaryAudio(media, sourceUrl);\n }, { once: true });\n }\n if (media instanceof HTMLAudioElement && mode && policy.visualize) {\n const connect = () => {\n const art = this.#root.querySelector<HTMLElement>('.audio-art.visualizer');\n if (art && media.isConnected && (media.currentSrc === sourceUrl || media.src === sourceUrl)) {\n this.#visualizer.connect(media, art, mode);\n }\n };\n media.addEventListener('loadedmetadata', connect, { once: true });\n if (media.readyState >= HTMLMediaElement.HAVE_METADATA) queueMicrotask(connect);\n }\n this.controller.attachMedia(media);\n applyMediaSource(media, sourceUrl, policy.crossOrigin);\n }\n\n #fallbackToOrdinaryAudio(failed: HTMLAudioElement, sourceUrl: string): void {\n this.#fallbackSourceUrl = sourceUrl;\n this.#visualizer.disconnect();\n const requestedTime = this.controller.state.currentTime;\n const shouldPlay = this.controller.state.status === 'playing' || !failed.paused;\n const replacement = failed.cloneNode(true) as HTMLAudioElement;\n replacement.removeAttribute('src');\n replacement.removeAttribute('crossorigin');\n replacement.volume = failed.volume;\n replacement.muted = failed.muted;\n replacement.playbackRate = failed.playbackRate;\n const hadFocus = this.#root.activeElement === failed;\n failed.replaceWith(replacement);\n this.controller.attachMedia(replacement);\n this.controller.seekTo(requestedTime);\n if (hadFocus) replacement.focus();\n const art = this.#root.querySelector<HTMLElement>('.audio-art');\n art?.classList.remove('visualizer');\n applyMediaSource(replacement, sourceUrl);\n if (shouldPlay) replacement.addEventListener('loadedmetadata', () => void replacement.play().catch(() => undefined), { once: true });\n this.controller.dispatchEvent(new CustomEvent('av-visualizerfallback', {\n detail: { canvasId: this.controller.canvas?.id ?? '', sourceUrl, reason: 'cors' },\n }));\n }\n\n #resetSourceLoad(): void {\n this.#sourceToken += 1;\n this.#resolvedSourceUrl = undefined;\n this.#fallbackSourceUrl = undefined;\n this.#visualizer.disconnect();\n }\n\n async #loadTranscript(): Promise<void> {\n const resource = this.controller.canvas?.transcripts[0];\n if (!resource || !this.controller.config.audioArt.transcript) return;\n const token = ++this.#transcriptToken;\n const options: Parameters<typeof loadTranscript>[1] = {};\n if (this.controller.config.fetch) options.fetch = this.controller.config.fetch;\n if (this.controller.config.requestInit) options.requestInit = this.controller.config.requestInit;\n if (this.controller.config.transcript.showNotes !== undefined) options.showNotes = this.controller.config.transcript.showNotes;\n if (this.controller.config.transcript.showMetadata !== undefined) options.showMetadata = this.controller.config.transcript.showMetadata;\n try {\n const cues = await loadTranscript(resource, options);\n if (token !== this.#transcriptToken) return;\n this.#transcriptCues = cues;\n const art = this.#root.querySelector<HTMLElement>('.audio-art');\n const canvas = this.controller.canvas;\n if (art && canvas && this.controller.source?.kind === 'audio') {\n const text = art.querySelector<HTMLElement>('.audio-art-text');\n if (text) text.innerHTML = audioArtTranscriptHtml(canvas.label, this.controller.config.audioArt.title ?? '', cues, true);\n syncAudioArtTranscript(art, this.controller.state.currentTime);\n }\n } catch (cause) {\n if (token !== this.#transcriptToken) return;\n const error = cause instanceof Error ? cause : new Error(String(cause));\n this.dispatchEvent(new CustomEvent('av-error', { detail: { error }, bubbles: true, composed: true }));\n }\n }\n}\n\nexport const defineMangoAVPlayer = (tagName = 'mango-av-player'): typeof MangoAVPlayerElement => {\n if (typeof customElements === 'undefined') return MangoAVPlayerElement;\n if (!customElements.get(tagName)) customElements.define(tagName, MangoAVPlayerElement);\n return MangoAVPlayerElement;\n};\n"],"mappings":"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","names":[]}
|
|
@@ -175,6 +175,7 @@ interface AVTranscriptConfig {
|
|
|
175
175
|
showSearchMarkers?: boolean;
|
|
176
176
|
}
|
|
177
177
|
interface AVAudioArtConfig {
|
|
178
|
+
title?: string;
|
|
178
179
|
transcript?: boolean;
|
|
179
180
|
visualizer?: boolean | AVAudioVisualizerMode;
|
|
180
181
|
}
|
|
@@ -316,6 +317,11 @@ interface AVPlayerEventMap {
|
|
|
316
317
|
config: Readonly<AVPlayerConfig>;
|
|
317
318
|
};
|
|
318
319
|
'av-statechange': AVPlayerState;
|
|
320
|
+
'av-visualizerfallback': {
|
|
321
|
+
canvasId: string;
|
|
322
|
+
sourceUrl: string;
|
|
323
|
+
reason: 'cors';
|
|
324
|
+
};
|
|
319
325
|
}
|
|
320
326
|
declare const defaultStrings: AVStrings;
|
|
321
327
|
declare const defaultConfig: Required<Pick<AVPlayerConfig, 'controls' | 'panels' | 'transcript' | 'audioArt' | 'resume' | 'strings' | 'preferredLanguages' | 'autoAdvance' | 'repeat' | 'activePanel' | 'crossorigin' | 'preload' | 'playbackRates'>>;
|
|
@@ -330,6 +336,8 @@ declare class AVPlayerController extends EventTarget {
|
|
|
330
336
|
get canvas(): AVCanvas | undefined;
|
|
331
337
|
get source(): MediaSource | undefined;
|
|
332
338
|
get media(): HTMLMediaElement | undefined;
|
|
339
|
+
/** Whether the host explicitly selected the media element CORS policy. */
|
|
340
|
+
get crossoriginExplicit(): boolean;
|
|
333
341
|
on<K extends keyof AVPlayerEventMap>(type: K, listener: (event: CustomEvent<AVPlayerEventMap[K]>) => void): () => void;
|
|
334
342
|
configure(config: AVPlayerConfig): void;
|
|
335
343
|
load(input: JsonObject | string): Promise<AVManifest>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { j as AVPlayerController, k as AVPlayerEventMap } from './controller-
|
|
1
|
+
import { j as AVPlayerController, k as AVPlayerEventMap } from './controller-SkwGkVE8.js';
|
|
2
2
|
|
|
3
3
|
declare const HTMLElementBase: typeof HTMLElement;
|
|
4
4
|
declare abstract class AVControllerElement extends HTMLElementBase {
|
package/dist/core.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as AVStrings, J as JsonObject, g as AVManifest, w as TranscriptResource, u as TranscriptCue, t as TimeSpan } from './controller-
|
|
2
|
-
export { A as AVAnnotation, a as AVAnnotationAdapter, b as AVAnnotationDraft, c as AVAudioArtConfig, d as AVAudioVisualizerMode, e as AVCanvas, f as AVControlsConfig, h as AVPanelsConfig, i as AVPlayerConfig, j as AVPlayerController, k as AVPlayerEventMap, l as AVPlayerState, m as AVResumeConfig, o as AVTranscriptConfig, p as AuthService, C as Chapter, D as DownloadResource, I as IIIFPresentationVersion, L as LocalizedValue, M as MediaKind, q as MediaSource, r as MetadataEntry, T as TextTrack, s as TextTrackKind, v as TranscriptCueType, x as defaultConfig, y as defaultStrings } from './controller-
|
|
1
|
+
import { n as AVStrings, J as JsonObject, g as AVManifest, w as TranscriptResource, u as TranscriptCue, t as TimeSpan } from './controller-SkwGkVE8.js';
|
|
2
|
+
export { A as AVAnnotation, a as AVAnnotationAdapter, b as AVAnnotationDraft, c as AVAudioArtConfig, d as AVAudioVisualizerMode, e as AVCanvas, f as AVControlsConfig, h as AVPanelsConfig, i as AVPlayerConfig, j as AVPlayerController, k as AVPlayerEventMap, l as AVPlayerState, m as AVResumeConfig, o as AVTranscriptConfig, p as AuthService, C as Chapter, D as DownloadResource, I as IIIFPresentationVersion, L as LocalizedValue, M as MediaKind, q as MediaSource, r as MetadataEntry, T as TextTrack, s as TextTrackKind, v as TranscriptCueType, x as defaultConfig, y as defaultStrings } from './controller-SkwGkVE8.js';
|
|
3
3
|
|
|
4
4
|
interface NormalizeOptions {
|
|
5
5
|
fetch?: typeof globalThis.fetch;
|
package/dist/core.js
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
loadTranscript,
|
|
4
4
|
parseTimedText,
|
|
5
5
|
parseTranscript
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-CIAQZ2EB.js";
|
|
7
7
|
import {
|
|
8
8
|
AVPlayerController,
|
|
9
9
|
defaultConfig,
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
normalizeManifest,
|
|
13
13
|
parseTemporalFragment,
|
|
14
14
|
parseTime
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-4NOWGMI5.js";
|
|
16
16
|
export {
|
|
17
17
|
AVPlayerController,
|
|
18
18
|
defaultConfig,
|
package/dist/index.d.ts
CHANGED
|
@@ -8,9 +8,9 @@ import { MangoAVPlayerElement } from './player.js';
|
|
|
8
8
|
export { defineMangoAVPlayer } from './player.js';
|
|
9
9
|
import { MangoAVMediaElement } from './media.js';
|
|
10
10
|
export { defineMangoAVMedia } from './media.js';
|
|
11
|
-
export { A as AVAnnotation, a as AVAnnotationAdapter, b as AVAnnotationDraft, c as AVAudioArtConfig, d as AVAudioVisualizerMode, e as AVCanvas, f as AVControlsConfig, g as AVManifest, h as AVPanelsConfig, i as AVPlayerConfig, j as AVPlayerController, k as AVPlayerEventMap, l as AVPlayerState, m as AVResumeConfig, n as AVStrings, o as AVTranscriptConfig, p as AuthService, C as Chapter, D as DownloadResource, I as IIIFPresentationVersion, J as JsonObject, L as LocalizedValue, M as MediaKind, q as MediaSource, r as MetadataEntry, T as TextTrack, s as TextTrackKind, t as TimeSpan, u as TranscriptCue, v as TranscriptCueType, w as TranscriptResource, x as defaultConfig, y as defaultStrings } from './controller-
|
|
11
|
+
export { A as AVAnnotation, a as AVAnnotationAdapter, b as AVAnnotationDraft, c as AVAudioArtConfig, d as AVAudioVisualizerMode, e as AVCanvas, f as AVControlsConfig, g as AVManifest, h as AVPanelsConfig, i as AVPlayerConfig, j as AVPlayerController, k as AVPlayerEventMap, l as AVPlayerState, m as AVResumeConfig, n as AVStrings, o as AVTranscriptConfig, p as AuthService, C as Chapter, D as DownloadResource, I as IIIFPresentationVersion, J as JsonObject, L as LocalizedValue, M as MediaKind, q as MediaSource, r as MetadataEntry, T as TextTrack, s as TextTrackKind, t as TimeSpan, u as TranscriptCue, v as TranscriptCueType, w as TranscriptResource, x as defaultConfig, y as defaultStrings } from './controller-SkwGkVE8.js';
|
|
12
12
|
export { NormalizeOptions, formatTime, loadTranscript, normalizeManifest, parseTemporalFragment, parseTime, parseTimedText, parseTranscript } from './core.js';
|
|
13
|
-
import './controller-element-
|
|
13
|
+
import './controller-element-CkXIA6w2.js';
|
|
14
14
|
|
|
15
15
|
declare global {
|
|
16
16
|
interface HTMLElementTagNameMap {
|
package/dist/index.js
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MangoAVAnnotationsElement,
|
|
3
3
|
defineMangoAVAnnotations
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-YX32ZQPR.js";
|
|
5
5
|
import {
|
|
6
6
|
MangoAVChaptersElement,
|
|
7
7
|
defineMangoAVChapters
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-EHIKFRFV.js";
|
|
9
9
|
import "./chunk-GAVG7CPU.js";
|
|
10
10
|
import {
|
|
11
11
|
MangoAVMediaElement,
|
|
12
12
|
defineMangoAVMedia
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-4V6FME6B.js";
|
|
14
14
|
import {
|
|
15
15
|
MangoAVPlayerElement,
|
|
16
16
|
defineMangoAVPlayer
|
|
17
|
-
} from "./chunk-
|
|
18
|
-
import "./chunk-
|
|
17
|
+
} from "./chunk-YX6L6CUF.js";
|
|
18
|
+
import "./chunk-ELGGWWDS.js";
|
|
19
19
|
import {
|
|
20
20
|
MangoAVTranscriptElement,
|
|
21
21
|
defineMangoAVTranscript
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-FVYEV2LO.js";
|
|
23
23
|
import "./chunk-CDLYT3KB.js";
|
|
24
|
-
import "./chunk-
|
|
24
|
+
import "./chunk-C4H46HDS.js";
|
|
25
25
|
import {
|
|
26
26
|
loadTranscript,
|
|
27
27
|
parseTimedText,
|
|
28
28
|
parseTranscript
|
|
29
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-CIAQZ2EB.js";
|
|
30
30
|
import {
|
|
31
31
|
AVPlayerController,
|
|
32
32
|
defaultConfig,
|
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
normalizeManifest,
|
|
36
36
|
parseTemporalFragment,
|
|
37
37
|
parseTime
|
|
38
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-4NOWGMI5.js";
|
|
39
39
|
|
|
40
40
|
// src/index.ts
|
|
41
41
|
if (typeof window !== "undefined" && "customElements" in window) {
|
package/dist/media.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { j as AVPlayerController, J as JsonObject, i as AVPlayerConfig, g as AVManifest, e as AVCanvas } from './controller-
|
|
1
|
+
import { j as AVPlayerController, J as JsonObject, i as AVPlayerConfig, g as AVManifest, e as AVCanvas } from './controller-SkwGkVE8.js';
|
|
2
2
|
|
|
3
3
|
declare const HTMLElementBase: typeof HTMLElement;
|
|
4
4
|
declare class MangoAVMediaElement extends HTMLElementBase {
|
package/dist/media.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MangoAVMediaElement,
|
|
3
3
|
defineMangoAVMedia
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-4V6FME6B.js";
|
|
5
|
+
import "./chunk-ELGGWWDS.js";
|
|
6
6
|
import "./chunk-CDLYT3KB.js";
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-CIAQZ2EB.js";
|
|
8
|
+
import "./chunk-4NOWGMI5.js";
|
|
9
9
|
|
|
10
10
|
// src/media.ts
|
|
11
11
|
if (typeof window !== "undefined" && "customElements" in window) defineMangoAVMedia();
|
package/dist/player.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { A as AVControllerElement } from './controller-element-
|
|
2
|
-
import { J as JsonObject, i as AVPlayerConfig, g as AVManifest, e as AVCanvas, k as AVPlayerEventMap } from './controller-
|
|
1
|
+
import { A as AVControllerElement } from './controller-element-CkXIA6w2.js';
|
|
2
|
+
import { J as JsonObject, i as AVPlayerConfig, g as AVManifest, e as AVCanvas, k as AVPlayerEventMap } from './controller-SkwGkVE8.js';
|
|
3
3
|
|
|
4
4
|
declare class MangoAVPlayerElement extends AVControllerElement {
|
|
5
5
|
#private;
|
package/dist/player.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MangoAVPlayerElement,
|
|
3
3
|
defineMangoAVPlayer
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-YX6L6CUF.js";
|
|
5
|
+
import "./chunk-ELGGWWDS.js";
|
|
6
|
+
import "./chunk-C4H46HDS.js";
|
|
7
|
+
import "./chunk-CIAQZ2EB.js";
|
|
8
|
+
import "./chunk-4NOWGMI5.js";
|
|
9
9
|
|
|
10
10
|
// src/player.ts
|
|
11
11
|
if (typeof window !== "undefined" && "customElements" in window) defineMangoAVPlayer();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { A as AVControllerElement } from './controller-element-
|
|
2
|
-
import { k as AVPlayerEventMap } from './controller-
|
|
1
|
+
import { A as AVControllerElement } from './controller-element-CkXIA6w2.js';
|
|
2
|
+
import { k as AVPlayerEventMap } from './controller-SkwGkVE8.js';
|
|
3
3
|
|
|
4
4
|
declare class MangoAVTranscriptElement extends AVControllerElement {
|
|
5
5
|
#private;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MangoAVTranscriptElement,
|
|
3
3
|
defineMangoAVTranscript
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-FVYEV2LO.js";
|
|
5
5
|
import "./chunk-CDLYT3KB.js";
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
8
|
-
import "./chunk-
|
|
6
|
+
import "./chunk-C4H46HDS.js";
|
|
7
|
+
import "./chunk-CIAQZ2EB.js";
|
|
8
|
+
import "./chunk-4NOWGMI5.js";
|
|
9
9
|
|
|
10
10
|
// src/transcript-element.ts
|
|
11
11
|
if (typeof window !== "undefined" && "customElements" in window) defineMangoAVTranscript();
|
package/docs/API.md
CHANGED
|
@@ -186,6 +186,7 @@ interface AVPlayerConfig {
|
|
|
186
186
|
showSearchMarkers?: boolean;
|
|
187
187
|
};
|
|
188
188
|
audioArt?: {
|
|
189
|
+
title?: string;
|
|
189
190
|
transcript?: boolean;
|
|
190
191
|
visualizer?: boolean | 'pulse' | 'waveform' | 'spectrum';
|
|
191
192
|
};
|
|
@@ -212,9 +213,13 @@ interface AVPlayerConfig {
|
|
|
212
213
|
}
|
|
213
214
|
```
|
|
214
215
|
|
|
216
|
+
`audioArt.title` sets optional text in the audio artwork. It defaults to `''`, so no title is displayed unless the host supplies one. The Canvas label remains the audio element's accessible name. When synchronized artwork transcripts are enabled and cues are available, the cues replace the configured title.
|
|
217
|
+
|
|
215
218
|
`controls.navigation` shows the Previous and Next buttons, while `controls.autoAdvance` shows the Auto-advance checkbox. Both default to `false`; hiding them does not disable `controller.previous()`, `controller.next()`, or programmatic auto-advance.
|
|
216
219
|
|
|
217
|
-
`crossorigin` defaults to `''`, so
|
|
220
|
+
`crossorigin` defaults to `''`, so ordinary media does not add a `crossorigin` attribute. When an audio visualizer is enabled, a cross-origin HTTP(S) source instead uses an implicit `anonymous` policy so Web Audio can safely inspect it. If that implicit CORS load fails, the player replaces the audio element and retries once without Web Audio or CORS, preserving audible HTML media playback.
|
|
221
|
+
|
|
222
|
+
An explicitly supplied `crossorigin` value is always retained. Explicit `'anonymous'` and `'use-credentials'` failures surface as normal media errors and are never retried with weaker security. An explicit empty string keeps ordinary no-CORS loading; for a cross-origin source, visualization is disabled to avoid routing silent samples through Web Audio.
|
|
218
223
|
|
|
219
224
|
`fetch` and `requestInit` configure manifest, external AnnotationPage, and transcript requests. `resolveRequest` runs immediately before a media URL is assigned; it can obtain an IIIF Auth token, sign a URL, route through a proxy, or enforce an application's access policy. The normalized Canvas exposes discovered auth services to the callback through `context.canvas.authServices`.
|
|
220
225
|
|
|
@@ -268,6 +273,7 @@ Read-only properties are `config`, `state`, `manifest`, `canvas`, `source`, and
|
|
|
268
273
|
| `av-annotationschange` | Active Canvas annotation list |
|
|
269
274
|
| `av-configchange` | Resolved controller configuration |
|
|
270
275
|
| `av-statechange` | Complete `AVPlayerState` snapshot |
|
|
276
|
+
| `av-visualizerfallback` | `{ canvasId, sourceUrl, reason: 'cors' }` when ordinary audio playback replaces a failed implicit-CORS visualizer load |
|
|
271
277
|
|
|
272
278
|
## Parsing helpers
|
|
273
279
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mango-iiif/av",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Framework-free IIIF audio and video components powered by Media Chrome.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -29,6 +29,7 @@
|
|
|
29
29
|
"dist",
|
|
30
30
|
"docs",
|
|
31
31
|
"README.md",
|
|
32
|
+
"CHANGELOG.md",
|
|
32
33
|
"LICENSE"
|
|
33
34
|
],
|
|
34
35
|
"main": "./dist/index.js",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/mango-av-player.ts"],"sourcesContent":["import { AVControllerElement } from './controller-element';\nimport { componentTheme } from './component-styles';\nimport { ensureMediaChrome } from './media-chrome';\nimport { AudioArtVisualizer, audioArtContentHtml, audioArtTranscriptHtml, resolveAudioVisualizerMode, syncAudioArtTranscript } from './audio-art';\nimport { loadTranscript } from '../transcript';\nimport type { AVCanvas, AVManifest, AVPlayerConfig, AVPlayerEventMap, JsonObject, MediaSource, TranscriptCue } from '../types';\nimport { escapeHtml, formatString, resolveStrings } from '../utils';\n\nlet hlsElementRegistration: Promise<unknown> | undefined;\nconst ensureHlsElement = (): Promise<unknown> => {\n hlsElementRegistration ??= import('hls-video-element');\n return hlsElementRegistration;\n};\n\nconst styles = `${componentTheme}\n :host { --mango-av-player-aspect-ratio: 16 / 9; }\n .player { background: #08080a; border-radius: var(--mango-av-radius); color: white; overflow: clip; position: relative; }\n media-controller { display: block; width: 100%; }\n media-controller:not([audio]) { aspect-ratio: var(--mango-av-player-aspect-ratio); }\n video, hls-video { display: block; height: 100%; object-fit: contain; width: 100%; }\n audio { width: 100%; }\n media-control-bar { width: 100%; }\n .audio-art { --mango-av-wave-edge-strength: 0%; --mango-av-wave-mid-strength: 0%; --mango-av-wave-rise: 8%; --mango-av-wave-strength: 0%; align-items: center; aspect-ratio: 16 / 7; background: linear-gradient(#09080d, #111019); display: flex; justify-content: center; overflow: hidden; padding: 2rem; position: relative; text-align: center; }\n .audio-art.visualizer--pulse { background: radial-gradient(ellipse 140% 72% at 50% calc(100% + var(--mango-av-wave-rise)), color-mix(in srgb, var(--mango-av-accent) var(--mango-av-wave-strength), transparent) 0%, color-mix(in srgb, var(--mango-av-accent) var(--mango-av-wave-mid-strength), transparent) 40%, color-mix(in srgb, var(--mango-av-accent) var(--mango-av-wave-edge-strength), transparent) 62%, transparent 78%), linear-gradient(#09080d, #111019); }\n .audio-art-text { display: contents; }\n .audio-art-visualizer-canvas { height: 100%; inset: 0; pointer-events: none; position: absolute; width: 100%; }\n .audio-art-title { font-size: clamp(1.1rem, 3vw, 2rem); font-weight: 700; position: relative; z-index: 1; }\n .audio-art-transcript { height: 100%; inset: 0; overflow: hidden; position: absolute; z-index: 1; }\n .audio-art-cue { align-items: center; display: flex; flex-direction: column; font-size: clamp(.7rem, 1.3vw, .875rem); font-weight: 550; gap: .15rem; left: 12%; line-height: 1.35; position: absolute; right: 12%; top: 50%; transition: opacity 360ms ease, transform 480ms cubic-bezier(.22, 1, .36, 1); }\n .audio-art-transcript.seeking .audio-art-cue { transition: none; }\n .audio-art-cue.active { font-size: clamp(.78rem, 1.5vw, 1rem); font-weight: 650; }\n .audio-art-cue > span:last-child { display: -webkit-box; overflow: hidden; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }\n .audio-art-speaker { font-size: .7em; letter-spacing: .04em; text-transform: uppercase; }\n .toolbar { align-items: center; background: #151518; display: flex; flex-wrap: wrap; gap: .5rem; justify-content: space-between; padding: .55rem .7rem; }\n .toolbar button, .toolbar select { background: #29292e; border: 1px solid #44444a; border-radius: .35rem; color: white; padding: .4rem .55rem; }\n .group { align-items: center; display: flex; gap: .45rem; }\n .error { background: #fff0f0; color: #8a1717; padding: 1rem; }\n .sr-only { clip: rect(0,0,0,0); clip-path: inset(50%); height: 1px; overflow: hidden; position: absolute; white-space: nowrap; width: 1px; }\n`;\n\nexport class MangoAVPlayerElement extends AVControllerElement {\n static observedAttributes = ['manifest-url', 'config'];\n\n #root: ShadowRoot;\n #manifestInput: JsonObject | string | undefined;\n #config: AVPlayerConfig = {};\n #resolvedSourceUrl: string | undefined;\n #sourceToken = 0;\n #transcriptCues: TranscriptCue[] = [];\n #transcriptToken = 0;\n #visualizer = new AudioArtVisualizer();\n\n constructor() {\n super();\n this.#root = this.attachShadow({ mode: 'open' });\n }\n\n get manifest(): JsonObject | string | undefined {\n return this.#manifestInput;\n }\n\n set manifest(value: JsonObject | string | undefined) {\n this.#manifestInput = value;\n if (this.isConnected && value !== undefined) void this.load(value);\n }\n\n get config(): AVPlayerConfig {\n return this.#config;\n }\n\n set config(value: AVPlayerConfig) {\n this.#config = value;\n this.controller.configure(value);\n this.#render();\n }\n\n override connectedCallback(): void {\n this.#readConfigAttribute();\n void ensureMediaChrome(this.controller.config.preferredLanguages[0]);\n super.connectedCallback();\n const source = this.#manifestInput ?? this.getAttribute('manifest-url') ?? undefined;\n if (source !== undefined && !this.controller.manifest) void this.load(source);\n }\n\n override disconnectedCallback(): void {\n this.#visualizer.disconnect();\n super.disconnectedCallback();\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void {\n if (!this.isConnected || oldValue === newValue) return;\n if (name === 'manifest-url' && newValue) {\n this.#manifestInput = newValue;\n void this.load(newValue);\n } else if (name === 'config') {\n this.#readConfigAttribute();\n this.#render();\n }\n }\n\n async load(input: JsonObject | string): Promise<AVManifest> {\n this.#manifestInput = input;\n return await this.controller.load(input);\n }\n\n play(): Promise<void> { return this.controller.play(); }\n pause(): void { this.controller.pause(); }\n seekTo(time: number): void { this.controller.seekTo(time); }\n selectCanvas(indexOrId: number | string, options?: { time?: number; autoplay?: boolean }): AVCanvas | undefined {\n return this.controller.selectCanvas(indexOrId, options);\n }\n\n protected controllerChanged(): void {\n this.#transcriptCues = [];\n this.#render();\n void this.#loadTranscript();\n }\n\n protected handleControllerEvent<K extends keyof AVPlayerEventMap>(type: K, event: CustomEvent<AVPlayerEventMap[K]>): void {\n if (type === 'av-configchange') {\n this.#resolvedSourceUrl = undefined;\n void ensureMediaChrome(this.controller.config.preferredLanguages[0]).then(() => {\n this.#render();\n void this.#loadTranscript();\n void this.#resolveSource();\n });\n } else if (type === 'av-ready' || type === 'av-canvaschange') {\n this.#resolvedSourceUrl = undefined;\n this.#transcriptCues = [];\n if (this.controller.source?.isHls) void ensureHlsElement();\n this.#render();\n void this.#loadTranscript();\n void this.#resolveSource();\n } else if (type === 'av-sourcechange' || type === 'av-error') {\n this.#resolvedSourceUrl = undefined;\n if (this.controller.source?.isHls) void ensureHlsElement();\n this.#render();\n void this.#resolveSource();\n } else if (type === 'av-seek') {\n syncAudioArtTranscript(this.#root, (event.detail as AVPlayerEventMap['av-seek']).to, true);\n } else if (type === 'av-timeupdate' || type === 'av-statechange') {\n syncAudioArtTranscript(this.#root, this.controller.state.currentTime);\n }\n this.dispatchEvent(new CustomEvent(type, { detail: event.detail, bubbles: true, composed: true }));\n }\n\n #readConfigAttribute(): void {\n const value = this.getAttribute('config');\n if (!value) return;\n try {\n this.#config = JSON.parse(value) as AVPlayerConfig;\n this.controller.configure(this.#config);\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n this.dispatchEvent(new CustomEvent('av-error', { detail: { error }, bubbles: true, composed: true }));\n }\n }\n\n #render(): void {\n this.#visualizer.disconnect();\n const state = this.controller.state;\n const canvas = this.controller.canvas;\n const source = this.controller.source;\n const ui = resolveStrings(this.controller.config.strings);\n this.#root.innerHTML = `<style>${styles}</style>\n <div class=\"player\">\n ${state.status === 'loading' ? `<p role=\"status\">${escapeHtml(ui.loadingManifest)}</p>` : ''}\n ${state.status === 'error' ? `<div class=\"error\" role=\"alert\">${escapeHtml(state.error?.message ?? ui.unableToLoadMedia)}</div>` : ''}\n ${canvas && source ? this.#readyHtml(canvas, source) : state.status !== 'loading' && state.status !== 'error' ? `<div class=\"audio-art\"><span>${escapeHtml(ui.noMediaLoaded)}</span></div>` : ''}\n </div>`;\n const media = this.#root.querySelector('video, audio, hls-video') as HTMLMediaElement | null;\n if (media) {\n this.controller.attachMedia(media);\n const art = this.#root.querySelector<HTMLElement>('.audio-art.visualizer');\n const visualizerMode = resolveAudioVisualizerMode(this.controller.config.audioArt.visualizer);\n if (art && media instanceof HTMLAudioElement && visualizerMode) this.#visualizer.connect(media, art, visualizerMode);\n }\n syncAudioArtTranscript(this.#root, this.controller.state.currentTime);\n this.#bind();\n }\n\n #readyHtml(canvas: AVCanvas, source: MediaSource): string {\n const controls = this.controller.config.controls;\n const manifest = this.controller.manifest;\n const kind = source.kind;\n const ui = resolveStrings(this.controller.config.strings);\n const language = this.controller.config.preferredLanguages.find((value) => value !== 'none');\n const showSourceSelector = controls.sourceSelector && canvas.sources.length > 1;\n const showToolbar = controls.navigation || controls.autoAdvance || showSourceSelector;\n const visualizerMode = resolveAudioVisualizerMode(this.controller.config.audioArt.visualizer);\n return `<media-controller ${kind === 'audio' ? 'audio' : ''} ${language ? `lang=\"${escapeHtml(language)}\"` : ''}>\n ${kind === 'audio' ? `<div class=\"audio-art ${visualizerMode ? `visualizer visualizer--${visualizerMode}` : ''}\">${audioArtContentHtml(canvas.label, this.#transcriptCues, Boolean(this.controller.config.audioArt.transcript), visualizerMode)}</div>` : ''}\n ${this.#mediaHtml(canvas, source)}\n <slot name=\"overlay\"></slot>\n <slot name=\"controls\">\n <media-control-bar>\n <media-play-button></media-play-button>\n ${controls.seek ? `<media-seek-backward-button seekoffset=\"${controls.skipSeconds ?? 10}\"></media-seek-backward-button><media-seek-forward-button seekoffset=\"${controls.skipSeconds ?? 10}\"></media-seek-forward-button>` : ''}\n <media-time-display showduration></media-time-display>\n ${controls.seek ? '<media-time-range></media-time-range>' : ''}\n ${controls.volume ? '<media-mute-button></media-mute-button><media-volume-range></media-volume-range>' : ''}\n ${controls.captions && canvas.tracks.length > 0 ? '<media-captions-menu-button></media-captions-menu-button>' : ''}\n ${controls.playbackRate ? '<media-playback-rate-menu-button></media-playback-rate-menu-button>' : ''}\n ${controls.pictureInPicture && kind === 'video' ? '<media-pip-button></media-pip-button>' : ''}\n ${controls.fullscreen && kind === 'video' ? '<media-fullscreen-button></media-fullscreen-button>' : ''}\n </media-control-bar>\n ${controls.captions && canvas.tracks.length > 0 ? '<media-captions-menu hidden></media-captions-menu>' : ''}\n ${controls.playbackRate ? `<media-playback-rate-menu rates=\"${this.controller.config.playbackRates.join(' ')}\" hidden></media-playback-rate-menu>` : ''}\n </slot>\n </media-controller>\n ${showToolbar ? `<div class=\"toolbar\">\n ${controls.navigation ? `<div class=\"group\">\n <button type=\"button\" data-action=\"previous\" ${canvas.index === 0 ? 'disabled' : ''} aria-label=\"${escapeHtml(ui.previousSection)}\">← ${escapeHtml(ui.previous)}</button>\n <button type=\"button\" data-action=\"next\" ${canvas.index === (manifest?.canvases.length ?? 1) - 1 && !this.controller.state.repeat ? 'disabled' : ''} aria-label=\"${escapeHtml(ui.nextSection)}\">${escapeHtml(ui.next)} →</button>\n </div>` : ''}\n ${showSourceSelector || controls.autoAdvance ? `<div class=\"group\">\n ${showSourceSelector ? `<label><span class=\"sr-only\">${escapeHtml(ui.mediaSource)}</span><select data-action=\"source\">${canvas.sources.map((item, index) => `<option value=\"${index}\" ${index === this.controller.state.sourceIndex ? 'selected' : ''}>${escapeHtml(item.label ?? item.format ?? formatString(ui.sourceNumber, { number: index + 1 }))}</option>`).join('')}</select></label>` : ''}\n ${controls.autoAdvance ? `<label><input type=\"checkbox\" data-action=\"auto-advance\" ${this.controller.state.autoAdvance ? 'checked' : ''}> ${escapeHtml(ui.autoAdvance)}</label>` : ''}\n </div>` : ''}\n </div>` : ''}`;\n }\n\n #mediaHtml(canvas: AVCanvas, source: MediaSource): string {\n const tag = source.isHls ? 'hls-video' : source.kind;\n const sourceUrl = this.#resolvedSourceUrl ?? (this.controller.config.resolveRequest ? '' : source.src);\n const attributes = [\n 'slot=\"media\"',\n sourceUrl ? `src=\"${escapeHtml(sourceUrl)}\"` : '',\n `preload=\"${this.controller.config.preload}\"`,\n this.controller.config.crossorigin ? `crossorigin=\"${this.controller.config.crossorigin}\"` : '',\n source.kind === 'video' && canvas.poster ? `poster=\"${escapeHtml(canvas.poster)}\"` : '',\n `aria-label=\"${escapeHtml(canvas.label)}\"`,\n `data-canvasindex=\"${canvas.index}\"`,\n ].filter(Boolean).join(' ');\n const tracks = canvas.tracks.map((track) => `<track src=\"${escapeHtml(track.src)}\" kind=\"${track.kind}\" label=\"${escapeHtml(track.label)}\" ${track.language ? `srclang=\"${escapeHtml(track.language)}\"` : ''} ${track.default ? 'default' : ''}>`).join('');\n return `<${tag} ${attributes}>${tracks}</${tag}>`;\n }\n\n #bind(): void {\n this.#root.querySelector<HTMLElement>('[data-action=previous]')?.addEventListener('click', () => this.controller.previous({ autoplay: this.controller.state.status === 'playing' }));\n this.#root.querySelector<HTMLElement>('[data-action=next]')?.addEventListener('click', () => this.controller.next({ autoplay: this.controller.state.status === 'playing' }));\n this.#root.querySelector<HTMLSelectElement>('[data-action=source]')?.addEventListener('change', (event) => this.controller.selectSource(Number((event.target as HTMLSelectElement).value)));\n this.#root.querySelector<HTMLInputElement>('[data-action=auto-advance]')?.addEventListener('change', (event) => this.controller.setAutoAdvance((event.target as HTMLInputElement).checked));\n }\n\n async #resolveSource(): Promise<void> {\n if (!this.controller.config.resolveRequest) return;\n const token = ++this.#sourceToken;\n try {\n const url = await this.controller.resolvedSourceUrl();\n if (token !== this.#sourceToken || !url) return;\n this.#resolvedSourceUrl = url;\n this.#root.querySelector('video, audio, hls-video')?.setAttribute('src', url);\n } catch (cause) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n this.dispatchEvent(new CustomEvent('av-error', { detail: { error }, bubbles: true, composed: true }));\n }\n }\n\n async #loadTranscript(): Promise<void> {\n const resource = this.controller.canvas?.transcripts[0];\n if (!resource || !this.controller.config.audioArt.transcript) return;\n const token = ++this.#transcriptToken;\n const options: Parameters<typeof loadTranscript>[1] = {};\n if (this.controller.config.fetch) options.fetch = this.controller.config.fetch;\n if (this.controller.config.requestInit) options.requestInit = this.controller.config.requestInit;\n if (this.controller.config.transcript.showNotes !== undefined) options.showNotes = this.controller.config.transcript.showNotes;\n if (this.controller.config.transcript.showMetadata !== undefined) options.showMetadata = this.controller.config.transcript.showMetadata;\n try {\n const cues = await loadTranscript(resource, options);\n if (token !== this.#transcriptToken) return;\n this.#transcriptCues = cues;\n const art = this.#root.querySelector<HTMLElement>('.audio-art');\n const canvas = this.controller.canvas;\n if (art && canvas && this.controller.source?.kind === 'audio') {\n const text = art.querySelector<HTMLElement>('.audio-art-text');\n if (text) text.innerHTML = audioArtTranscriptHtml(canvas.label, cues, true);\n syncAudioArtTranscript(art, this.controller.state.currentTime);\n }\n } catch (cause) {\n if (token !== this.#transcriptToken) return;\n const error = cause instanceof Error ? cause : new Error(String(cause));\n this.dispatchEvent(new CustomEvent('av-error', { detail: { error }, bubbles: true, composed: true }));\n }\n }\n}\n\nexport const defineMangoAVPlayer = (tagName = 'mango-av-player'): typeof MangoAVPlayerElement => {\n if (typeof customElements === 'undefined') return MangoAVPlayerElement;\n if (!customElements.get(tagName)) customElements.define(tagName, MangoAVPlayerElement);\n return MangoAVPlayerElement;\n};\n"],"mappings":"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","names":[]}
|