shaka-video-element 0.6.21 → 0.7.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.
|
@@ -31,6 +31,7 @@ __export(shaka_video_element_exports, {
|
|
|
31
31
|
});
|
|
32
32
|
module.exports = __toCommonJS(shaka_video_element_exports);
|
|
33
33
|
var import_custom_media_element = require("custom-media-element");
|
|
34
|
+
var import_media_tracks = require("media-tracks");
|
|
34
35
|
var import_server_safe_globals = require("./server-safe-globals.js");
|
|
35
36
|
var import_shaka_player = __toESM(require("shaka-player"), 1);
|
|
36
37
|
function onErrorEvent(event) {
|
|
@@ -39,12 +40,13 @@ function onErrorEvent(event) {
|
|
|
39
40
|
function onError(error) {
|
|
40
41
|
console.error("Error code", error.code, "object", error);
|
|
41
42
|
}
|
|
42
|
-
class ShakaVideoElement extends import_custom_media_element.CustomVideoElement {
|
|
43
|
+
class ShakaVideoElement extends (0, import_media_tracks.MediaTracksMixin)(import_custom_media_element.CustomVideoElement) {
|
|
43
44
|
static shadowRootOptions = { ...import_custom_media_element.CustomVideoElement.shadowRootOptions };
|
|
44
45
|
static getTemplateHTML = (attrs) => {
|
|
45
46
|
const { src, ...rest } = attrs;
|
|
46
47
|
return import_custom_media_element.CustomVideoElement.getTemplateHTML(rest);
|
|
47
48
|
};
|
|
49
|
+
#hasTracksInit = false;
|
|
48
50
|
constructor() {
|
|
49
51
|
super();
|
|
50
52
|
if (import_shaka_player.default.Player.isBrowserSupported()) {
|
|
@@ -70,18 +72,110 @@ class ShakaVideoElement extends import_custom_media_element.CustomVideoElement {
|
|
|
70
72
|
this.setAttribute("src", val);
|
|
71
73
|
}
|
|
72
74
|
}
|
|
75
|
+
#removeAllMediaTracks = () => {
|
|
76
|
+
for (const videoTrack of this.videoTracks) {
|
|
77
|
+
this.removeVideoTrack(videoTrack);
|
|
78
|
+
}
|
|
79
|
+
for (const audioTrack of this.audioTracks) {
|
|
80
|
+
this.removeAudioTrack(audioTrack);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
#addMediaTracks() {
|
|
84
|
+
this.#removeAllMediaTracks();
|
|
85
|
+
const variantTracks = this.api.getVariantTracks();
|
|
86
|
+
let videoTrack = this.videoTracks.getTrackById("main");
|
|
87
|
+
if (!videoTrack) {
|
|
88
|
+
videoTrack = this.addVideoTrack("main");
|
|
89
|
+
videoTrack.id = "main";
|
|
90
|
+
videoTrack.selected = true;
|
|
91
|
+
}
|
|
92
|
+
const seen = /* @__PURE__ */ new Set();
|
|
93
|
+
for (const [index, variant] of variantTracks.entries()) {
|
|
94
|
+
if (!variant.width && !variant.height) continue;
|
|
95
|
+
const key = `${variant.width}x${variant.height}@${variant.videoBandwidth ?? variant.bandwidth}`;
|
|
96
|
+
if (seen.has(key)) continue;
|
|
97
|
+
seen.add(key);
|
|
98
|
+
const rendition = videoTrack.addRendition(
|
|
99
|
+
variant.originalVideoId ?? `${variant.id}`,
|
|
100
|
+
variant.width,
|
|
101
|
+
variant.height,
|
|
102
|
+
variant.videoCodec,
|
|
103
|
+
variant.videoBandwidth ?? variant.bandwidth
|
|
104
|
+
);
|
|
105
|
+
rendition.id = `${index}`;
|
|
106
|
+
rendition.label = `${variant.height}p`;
|
|
107
|
+
}
|
|
108
|
+
const audioLanguages = this.api.getAudioLanguagesAndRoles();
|
|
109
|
+
for (let [id, audio] of audioLanguages.entries()) {
|
|
110
|
+
const kind = id === 0 ? "main" : "alternative";
|
|
111
|
+
const audioTrack = this.addAudioTrack(kind, audio.language, audio.language);
|
|
112
|
+
audioTrack.id = `${id}`;
|
|
113
|
+
if (id === 0) {
|
|
114
|
+
audioTrack.enabled = true;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
#initTracksListeners() {
|
|
119
|
+
var _a;
|
|
120
|
+
if (this.#hasTracksInit) return;
|
|
121
|
+
this.#hasTracksInit = true;
|
|
122
|
+
const switchRendition = () => {
|
|
123
|
+
const selectedIndex = this.videoRenditions.selectedIndex;
|
|
124
|
+
if (selectedIndex >= 0) {
|
|
125
|
+
const variantTracks = this.api.getVariantTracks();
|
|
126
|
+
const variantTrack = variantTracks[selectedIndex];
|
|
127
|
+
if (variantTrack) {
|
|
128
|
+
this.api.configure({ abr: { enabled: false } });
|
|
129
|
+
this.api.selectVariantTrack(variantTrack, true);
|
|
130
|
+
}
|
|
131
|
+
} else {
|
|
132
|
+
this.api.configure({ abr: { enabled: true } });
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
(_a = this.videoRenditions) == null ? void 0 : _a.addEventListener("change", switchRendition);
|
|
136
|
+
this.audioTracks.addEventListener("change", () => {
|
|
137
|
+
const enabledTrack = [...this.audioTracks].find((t) => t.enabled);
|
|
138
|
+
if (enabledTrack) {
|
|
139
|
+
const audioLanguages = this.api.getAudioLanguagesAndRoles();
|
|
140
|
+
const audio = audioLanguages[+enabledTrack.id];
|
|
141
|
+
if (audio) {
|
|
142
|
+
this.api.selectAudioLanguage(audio.language, audio.role);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
this.api.addEventListener("trackschanged", () => {
|
|
147
|
+
const videoTrack = this.videoTracks[this.videoTracks.selectedIndex ?? 0];
|
|
148
|
+
if (!videoTrack) return;
|
|
149
|
+
const variantTracks = this.api.getVariantTracks();
|
|
150
|
+
const variantIds = variantTracks.map((_, i) => `${i}`);
|
|
151
|
+
for (const rendition of this.videoRenditions) {
|
|
152
|
+
if (rendition.id && !variantIds.includes(rendition.id)) {
|
|
153
|
+
videoTrack.removeRendition(rendition);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}
|
|
73
158
|
async load() {
|
|
74
159
|
if (!this.api) return;
|
|
75
160
|
await Promise.resolve();
|
|
76
161
|
await this.api.attach(this.nativeEl);
|
|
77
162
|
if (!this.src) {
|
|
163
|
+
this.#removeAllMediaTracks();
|
|
78
164
|
this.api.unload();
|
|
79
165
|
} else {
|
|
80
166
|
try {
|
|
81
167
|
await this.api.load(this.src);
|
|
82
168
|
} catch (e) {
|
|
83
169
|
onError(e);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
if (this.nativeEl.autoplay && this.nativeEl.paused) {
|
|
173
|
+
this.nativeEl.play().catch((err) => {
|
|
174
|
+
console.warn("Autoplay failed:", err);
|
|
175
|
+
});
|
|
84
176
|
}
|
|
177
|
+
this.#addMediaTracks();
|
|
178
|
+
this.#initTracksListeners();
|
|
85
179
|
}
|
|
86
180
|
}
|
|
87
181
|
}
|
|
@@ -32077,6 +32077,706 @@ var CustomAudioElement = CustomMediaMixin(globalThis.HTMLElement ?? class {
|
|
|
32077
32077
|
tag: "audio"
|
|
32078
32078
|
});
|
|
32079
32079
|
|
|
32080
|
+
// ../media-tracks/dist/change-event.js
|
|
32081
|
+
var TrackEvent = class extends Event {
|
|
32082
|
+
track;
|
|
32083
|
+
constructor(type, init) {
|
|
32084
|
+
super(type);
|
|
32085
|
+
this.track = init.track;
|
|
32086
|
+
}
|
|
32087
|
+
};
|
|
32088
|
+
|
|
32089
|
+
// ../media-tracks/dist/utils.js
|
|
32090
|
+
var privateProps = /* @__PURE__ */ new WeakMap();
|
|
32091
|
+
function getPrivate(instance) {
|
|
32092
|
+
return privateProps.get(instance) ?? setPrivate(instance, {});
|
|
32093
|
+
}
|
|
32094
|
+
function setPrivate(instance, props) {
|
|
32095
|
+
let saved = privateProps.get(instance);
|
|
32096
|
+
if (!saved) privateProps.set(instance, saved = {});
|
|
32097
|
+
return Object.assign(saved, props);
|
|
32098
|
+
}
|
|
32099
|
+
|
|
32100
|
+
// ../media-tracks/dist/video-track-list.js
|
|
32101
|
+
function addVideoTrack(media, track) {
|
|
32102
|
+
const trackList = media.videoTracks;
|
|
32103
|
+
getPrivate(track).media = media;
|
|
32104
|
+
if (!getPrivate(track).renditionSet) {
|
|
32105
|
+
getPrivate(track).renditionSet = /* @__PURE__ */ new Set();
|
|
32106
|
+
}
|
|
32107
|
+
const trackSet = getPrivate(trackList).trackSet;
|
|
32108
|
+
trackSet.add(track);
|
|
32109
|
+
const index = trackSet.size - 1;
|
|
32110
|
+
if (!(index in VideoTrackList.prototype)) {
|
|
32111
|
+
Object.defineProperty(VideoTrackList.prototype, index, {
|
|
32112
|
+
get() {
|
|
32113
|
+
return [...getPrivate(this).trackSet][index];
|
|
32114
|
+
}
|
|
32115
|
+
});
|
|
32116
|
+
}
|
|
32117
|
+
queueMicrotask(() => {
|
|
32118
|
+
trackList.dispatchEvent(new TrackEvent("addtrack", { track }));
|
|
32119
|
+
});
|
|
32120
|
+
}
|
|
32121
|
+
function removeVideoTrack(track) {
|
|
32122
|
+
const trackList = getPrivate(track).media?.videoTracks;
|
|
32123
|
+
if (!trackList) return;
|
|
32124
|
+
const trackSet = getPrivate(trackList).trackSet;
|
|
32125
|
+
trackSet.delete(track);
|
|
32126
|
+
queueMicrotask(() => {
|
|
32127
|
+
trackList.dispatchEvent(new TrackEvent("removetrack", { track }));
|
|
32128
|
+
});
|
|
32129
|
+
}
|
|
32130
|
+
function selectedChanged(selected) {
|
|
32131
|
+
const trackList = getPrivate(selected).media.videoTracks ?? [];
|
|
32132
|
+
let hasUnselected = false;
|
|
32133
|
+
for (const track of trackList) {
|
|
32134
|
+
if (track === selected) continue;
|
|
32135
|
+
track.selected = false;
|
|
32136
|
+
hasUnselected = true;
|
|
32137
|
+
}
|
|
32138
|
+
if (hasUnselected) {
|
|
32139
|
+
if (getPrivate(trackList).changeRequested) return;
|
|
32140
|
+
getPrivate(trackList).changeRequested = true;
|
|
32141
|
+
queueMicrotask(() => {
|
|
32142
|
+
delete getPrivate(trackList).changeRequested;
|
|
32143
|
+
trackList.dispatchEvent(new Event("change"));
|
|
32144
|
+
});
|
|
32145
|
+
}
|
|
32146
|
+
}
|
|
32147
|
+
var VideoTrackList = class extends EventTarget {
|
|
32148
|
+
#addTrackCallback;
|
|
32149
|
+
#removeTrackCallback;
|
|
32150
|
+
#changeCallback;
|
|
32151
|
+
constructor() {
|
|
32152
|
+
super();
|
|
32153
|
+
getPrivate(this).trackSet = /* @__PURE__ */ new Set();
|
|
32154
|
+
}
|
|
32155
|
+
get #tracks() {
|
|
32156
|
+
return getPrivate(this).trackSet;
|
|
32157
|
+
}
|
|
32158
|
+
[Symbol.iterator]() {
|
|
32159
|
+
return this.#tracks.values();
|
|
32160
|
+
}
|
|
32161
|
+
get length() {
|
|
32162
|
+
return this.#tracks.size;
|
|
32163
|
+
}
|
|
32164
|
+
getTrackById(id) {
|
|
32165
|
+
return [...this.#tracks].find((track) => track.id === id) ?? null;
|
|
32166
|
+
}
|
|
32167
|
+
get selectedIndex() {
|
|
32168
|
+
return [...this.#tracks].findIndex((track) => track.selected);
|
|
32169
|
+
}
|
|
32170
|
+
get onaddtrack() {
|
|
32171
|
+
return this.#addTrackCallback;
|
|
32172
|
+
}
|
|
32173
|
+
set onaddtrack(callback) {
|
|
32174
|
+
if (this.#addTrackCallback) {
|
|
32175
|
+
this.removeEventListener("addtrack", this.#addTrackCallback);
|
|
32176
|
+
this.#addTrackCallback = void 0;
|
|
32177
|
+
}
|
|
32178
|
+
if (typeof callback == "function") {
|
|
32179
|
+
this.#addTrackCallback = callback;
|
|
32180
|
+
this.addEventListener("addtrack", callback);
|
|
32181
|
+
}
|
|
32182
|
+
}
|
|
32183
|
+
get onremovetrack() {
|
|
32184
|
+
return this.#removeTrackCallback;
|
|
32185
|
+
}
|
|
32186
|
+
set onremovetrack(callback) {
|
|
32187
|
+
if (this.#removeTrackCallback) {
|
|
32188
|
+
this.removeEventListener("removetrack", this.#removeTrackCallback);
|
|
32189
|
+
this.#removeTrackCallback = void 0;
|
|
32190
|
+
}
|
|
32191
|
+
if (typeof callback == "function") {
|
|
32192
|
+
this.#removeTrackCallback = callback;
|
|
32193
|
+
this.addEventListener("removetrack", callback);
|
|
32194
|
+
}
|
|
32195
|
+
}
|
|
32196
|
+
get onchange() {
|
|
32197
|
+
return this.#changeCallback;
|
|
32198
|
+
}
|
|
32199
|
+
set onchange(callback) {
|
|
32200
|
+
if (this.#changeCallback) {
|
|
32201
|
+
this.removeEventListener("change", this.#changeCallback);
|
|
32202
|
+
this.#changeCallback = void 0;
|
|
32203
|
+
}
|
|
32204
|
+
if (typeof callback == "function") {
|
|
32205
|
+
this.#changeCallback = callback;
|
|
32206
|
+
this.addEventListener("change", callback);
|
|
32207
|
+
}
|
|
32208
|
+
}
|
|
32209
|
+
};
|
|
32210
|
+
|
|
32211
|
+
// ../media-tracks/dist/rendition-event.js
|
|
32212
|
+
var RenditionEvent = class extends Event {
|
|
32213
|
+
rendition;
|
|
32214
|
+
constructor(type, init) {
|
|
32215
|
+
super(type);
|
|
32216
|
+
this.rendition = init.rendition;
|
|
32217
|
+
}
|
|
32218
|
+
};
|
|
32219
|
+
|
|
32220
|
+
// ../media-tracks/dist/video-rendition-list.js
|
|
32221
|
+
function addRendition(track, rendition) {
|
|
32222
|
+
const renditionList = getPrivate(track).media.videoRenditions;
|
|
32223
|
+
getPrivate(rendition).media = getPrivate(track).media;
|
|
32224
|
+
getPrivate(rendition).track = track;
|
|
32225
|
+
const renditionSet = getPrivate(track).renditionSet;
|
|
32226
|
+
renditionSet.add(rendition);
|
|
32227
|
+
const index = renditionSet.size - 1;
|
|
32228
|
+
if (!(index in VideoRenditionList.prototype)) {
|
|
32229
|
+
Object.defineProperty(VideoRenditionList.prototype, index, {
|
|
32230
|
+
get() {
|
|
32231
|
+
return getCurrentRenditions(this)[index];
|
|
32232
|
+
}
|
|
32233
|
+
});
|
|
32234
|
+
}
|
|
32235
|
+
queueMicrotask(() => {
|
|
32236
|
+
if (!track.selected) return;
|
|
32237
|
+
renditionList.dispatchEvent(new RenditionEvent("addrendition", { rendition }));
|
|
32238
|
+
});
|
|
32239
|
+
}
|
|
32240
|
+
function removeRendition(rendition) {
|
|
32241
|
+
const renditionList = getPrivate(rendition).media.videoRenditions;
|
|
32242
|
+
const track = getPrivate(rendition).track;
|
|
32243
|
+
const renditionSet = getPrivate(track).renditionSet;
|
|
32244
|
+
renditionSet.delete(rendition);
|
|
32245
|
+
queueMicrotask(() => {
|
|
32246
|
+
const track2 = getPrivate(rendition).track;
|
|
32247
|
+
if (!track2.selected) return;
|
|
32248
|
+
renditionList.dispatchEvent(new RenditionEvent("removerendition", { rendition }));
|
|
32249
|
+
});
|
|
32250
|
+
}
|
|
32251
|
+
function selectedChanged2(rendition) {
|
|
32252
|
+
const renditionList = getPrivate(rendition).media.videoRenditions;
|
|
32253
|
+
if (!renditionList || getPrivate(renditionList).changeRequested) return;
|
|
32254
|
+
getPrivate(renditionList).changeRequested = true;
|
|
32255
|
+
queueMicrotask(() => {
|
|
32256
|
+
delete getPrivate(renditionList).changeRequested;
|
|
32257
|
+
const track = getPrivate(rendition).track;
|
|
32258
|
+
if (!track.selected) return;
|
|
32259
|
+
renditionList.dispatchEvent(new Event("change"));
|
|
32260
|
+
});
|
|
32261
|
+
}
|
|
32262
|
+
function getCurrentRenditions(renditionList) {
|
|
32263
|
+
const media = getPrivate(renditionList).media;
|
|
32264
|
+
return [...media.videoTracks].filter((track) => track.selected).flatMap((track) => [...getPrivate(track).renditionSet]);
|
|
32265
|
+
}
|
|
32266
|
+
var VideoRenditionList = class extends EventTarget {
|
|
32267
|
+
#addRenditionCallback;
|
|
32268
|
+
#removeRenditionCallback;
|
|
32269
|
+
#changeCallback;
|
|
32270
|
+
[Symbol.iterator]() {
|
|
32271
|
+
return getCurrentRenditions(this).values();
|
|
32272
|
+
}
|
|
32273
|
+
get length() {
|
|
32274
|
+
return getCurrentRenditions(this).length;
|
|
32275
|
+
}
|
|
32276
|
+
getRenditionById(id) {
|
|
32277
|
+
return getCurrentRenditions(this).find((rendition) => `${rendition.id}` === `${id}`) ?? null;
|
|
32278
|
+
}
|
|
32279
|
+
get selectedIndex() {
|
|
32280
|
+
return getCurrentRenditions(this).findIndex((rendition) => rendition.selected);
|
|
32281
|
+
}
|
|
32282
|
+
set selectedIndex(index) {
|
|
32283
|
+
for (const [i, rendition] of getCurrentRenditions(this).entries()) {
|
|
32284
|
+
rendition.selected = i === index;
|
|
32285
|
+
}
|
|
32286
|
+
}
|
|
32287
|
+
get onaddrendition() {
|
|
32288
|
+
return this.#addRenditionCallback;
|
|
32289
|
+
}
|
|
32290
|
+
set onaddrendition(callback) {
|
|
32291
|
+
if (this.#addRenditionCallback) {
|
|
32292
|
+
this.removeEventListener("addrendition", this.#addRenditionCallback);
|
|
32293
|
+
this.#addRenditionCallback = void 0;
|
|
32294
|
+
}
|
|
32295
|
+
if (typeof callback == "function") {
|
|
32296
|
+
this.#addRenditionCallback = callback;
|
|
32297
|
+
this.addEventListener("addrendition", callback);
|
|
32298
|
+
}
|
|
32299
|
+
}
|
|
32300
|
+
get onremoverendition() {
|
|
32301
|
+
return this.#removeRenditionCallback;
|
|
32302
|
+
}
|
|
32303
|
+
set onremoverendition(callback) {
|
|
32304
|
+
if (this.#removeRenditionCallback) {
|
|
32305
|
+
this.removeEventListener("removerendition", this.#removeRenditionCallback);
|
|
32306
|
+
this.#removeRenditionCallback = void 0;
|
|
32307
|
+
}
|
|
32308
|
+
if (typeof callback == "function") {
|
|
32309
|
+
this.#removeRenditionCallback = callback;
|
|
32310
|
+
this.addEventListener("removerendition", callback);
|
|
32311
|
+
}
|
|
32312
|
+
}
|
|
32313
|
+
get onchange() {
|
|
32314
|
+
return this.#changeCallback;
|
|
32315
|
+
}
|
|
32316
|
+
set onchange(callback) {
|
|
32317
|
+
if (this.#changeCallback) {
|
|
32318
|
+
this.removeEventListener("change", this.#changeCallback);
|
|
32319
|
+
this.#changeCallback = void 0;
|
|
32320
|
+
}
|
|
32321
|
+
if (typeof callback == "function") {
|
|
32322
|
+
this.#changeCallback = callback;
|
|
32323
|
+
this.addEventListener("change", callback);
|
|
32324
|
+
}
|
|
32325
|
+
}
|
|
32326
|
+
};
|
|
32327
|
+
|
|
32328
|
+
// ../media-tracks/dist/video-rendition.js
|
|
32329
|
+
var VideoRendition = class {
|
|
32330
|
+
src;
|
|
32331
|
+
id;
|
|
32332
|
+
width;
|
|
32333
|
+
height;
|
|
32334
|
+
bitrate;
|
|
32335
|
+
frameRate;
|
|
32336
|
+
codec;
|
|
32337
|
+
#selected = false;
|
|
32338
|
+
get selected() {
|
|
32339
|
+
return this.#selected;
|
|
32340
|
+
}
|
|
32341
|
+
set selected(val) {
|
|
32342
|
+
if (this.#selected === val) return;
|
|
32343
|
+
this.#selected = val;
|
|
32344
|
+
selectedChanged2(this);
|
|
32345
|
+
}
|
|
32346
|
+
};
|
|
32347
|
+
|
|
32348
|
+
// ../media-tracks/dist/video-track.js
|
|
32349
|
+
var VideoTrack = class {
|
|
32350
|
+
id;
|
|
32351
|
+
kind;
|
|
32352
|
+
label = "";
|
|
32353
|
+
language = "";
|
|
32354
|
+
sourceBuffer;
|
|
32355
|
+
#selected = false;
|
|
32356
|
+
addRendition(src, width, height, codec, bitrate, frameRate) {
|
|
32357
|
+
const rendition = new VideoRendition();
|
|
32358
|
+
rendition.src = src;
|
|
32359
|
+
rendition.width = width;
|
|
32360
|
+
rendition.height = height;
|
|
32361
|
+
rendition.frameRate = frameRate;
|
|
32362
|
+
rendition.bitrate = bitrate;
|
|
32363
|
+
rendition.codec = codec;
|
|
32364
|
+
addRendition(this, rendition);
|
|
32365
|
+
return rendition;
|
|
32366
|
+
}
|
|
32367
|
+
removeRendition(rendition) {
|
|
32368
|
+
removeRendition(rendition);
|
|
32369
|
+
}
|
|
32370
|
+
get selected() {
|
|
32371
|
+
return this.#selected;
|
|
32372
|
+
}
|
|
32373
|
+
set selected(val) {
|
|
32374
|
+
if (this.#selected === val) return;
|
|
32375
|
+
this.#selected = val;
|
|
32376
|
+
if (val !== true) return;
|
|
32377
|
+
selectedChanged(this);
|
|
32378
|
+
}
|
|
32379
|
+
};
|
|
32380
|
+
|
|
32381
|
+
// ../media-tracks/dist/audio-rendition-list.js
|
|
32382
|
+
function addRendition2(track, rendition) {
|
|
32383
|
+
const renditionList = getPrivate(track).media.audioRenditions;
|
|
32384
|
+
getPrivate(rendition).media = getPrivate(track).media;
|
|
32385
|
+
getPrivate(rendition).track = track;
|
|
32386
|
+
const renditionSet = getPrivate(track).renditionSet;
|
|
32387
|
+
renditionSet.add(rendition);
|
|
32388
|
+
const index = renditionSet.size - 1;
|
|
32389
|
+
if (!(index in AudioRenditionList.prototype)) {
|
|
32390
|
+
Object.defineProperty(AudioRenditionList.prototype, index, {
|
|
32391
|
+
get() {
|
|
32392
|
+
return getCurrentRenditions2(this)[index];
|
|
32393
|
+
}
|
|
32394
|
+
});
|
|
32395
|
+
}
|
|
32396
|
+
queueMicrotask(() => {
|
|
32397
|
+
if (!track.enabled) return;
|
|
32398
|
+
renditionList.dispatchEvent(new RenditionEvent("addrendition", { rendition }));
|
|
32399
|
+
});
|
|
32400
|
+
}
|
|
32401
|
+
function removeRendition2(rendition) {
|
|
32402
|
+
const renditionList = getPrivate(rendition).media.audioRenditions;
|
|
32403
|
+
const track = getPrivate(rendition).track;
|
|
32404
|
+
const renditionSet = getPrivate(track).renditionSet;
|
|
32405
|
+
renditionSet.delete(rendition);
|
|
32406
|
+
queueMicrotask(() => {
|
|
32407
|
+
const track2 = getPrivate(rendition).track;
|
|
32408
|
+
if (!track2.enabled) return;
|
|
32409
|
+
renditionList.dispatchEvent(new RenditionEvent("removerendition", { rendition }));
|
|
32410
|
+
});
|
|
32411
|
+
}
|
|
32412
|
+
function selectedChanged3(rendition) {
|
|
32413
|
+
const renditionList = getPrivate(rendition).media.audioRenditions;
|
|
32414
|
+
if (!renditionList || getPrivate(renditionList).changeRequested) return;
|
|
32415
|
+
getPrivate(renditionList).changeRequested = true;
|
|
32416
|
+
queueMicrotask(() => {
|
|
32417
|
+
delete getPrivate(renditionList).changeRequested;
|
|
32418
|
+
const track = getPrivate(rendition).track;
|
|
32419
|
+
if (!track.enabled) return;
|
|
32420
|
+
renditionList.dispatchEvent(new Event("change"));
|
|
32421
|
+
});
|
|
32422
|
+
}
|
|
32423
|
+
function getCurrentRenditions2(renditionList) {
|
|
32424
|
+
const media = getPrivate(renditionList).media;
|
|
32425
|
+
return [...media.audioTracks].filter((track) => track.enabled).flatMap((track) => [...getPrivate(track).renditionSet]);
|
|
32426
|
+
}
|
|
32427
|
+
var AudioRenditionList = class extends EventTarget {
|
|
32428
|
+
#addRenditionCallback;
|
|
32429
|
+
#removeRenditionCallback;
|
|
32430
|
+
#changeCallback;
|
|
32431
|
+
[Symbol.iterator]() {
|
|
32432
|
+
return getCurrentRenditions2(this).values();
|
|
32433
|
+
}
|
|
32434
|
+
get length() {
|
|
32435
|
+
return getCurrentRenditions2(this).length;
|
|
32436
|
+
}
|
|
32437
|
+
getRenditionById(id) {
|
|
32438
|
+
return getCurrentRenditions2(this).find((rendition) => `${rendition.id}` === `${id}`) ?? null;
|
|
32439
|
+
}
|
|
32440
|
+
get selectedIndex() {
|
|
32441
|
+
return getCurrentRenditions2(this).findIndex((rendition) => rendition.selected);
|
|
32442
|
+
}
|
|
32443
|
+
set selectedIndex(index) {
|
|
32444
|
+
for (const [i, rendition] of getCurrentRenditions2(this).entries()) {
|
|
32445
|
+
rendition.selected = i === index;
|
|
32446
|
+
}
|
|
32447
|
+
}
|
|
32448
|
+
get onaddrendition() {
|
|
32449
|
+
return this.#addRenditionCallback;
|
|
32450
|
+
}
|
|
32451
|
+
set onaddrendition(callback) {
|
|
32452
|
+
if (this.#addRenditionCallback) {
|
|
32453
|
+
this.removeEventListener("addrendition", this.#addRenditionCallback);
|
|
32454
|
+
this.#addRenditionCallback = void 0;
|
|
32455
|
+
}
|
|
32456
|
+
if (typeof callback == "function") {
|
|
32457
|
+
this.#addRenditionCallback = callback;
|
|
32458
|
+
this.addEventListener("addrendition", callback);
|
|
32459
|
+
}
|
|
32460
|
+
}
|
|
32461
|
+
get onremoverendition() {
|
|
32462
|
+
return this.#removeRenditionCallback;
|
|
32463
|
+
}
|
|
32464
|
+
set onremoverendition(callback) {
|
|
32465
|
+
if (this.#removeRenditionCallback) {
|
|
32466
|
+
this.removeEventListener("removerendition", this.#removeRenditionCallback);
|
|
32467
|
+
this.#removeRenditionCallback = void 0;
|
|
32468
|
+
}
|
|
32469
|
+
if (typeof callback == "function") {
|
|
32470
|
+
this.#removeRenditionCallback = callback;
|
|
32471
|
+
this.addEventListener("removerendition", callback);
|
|
32472
|
+
}
|
|
32473
|
+
}
|
|
32474
|
+
get onchange() {
|
|
32475
|
+
return this.#changeCallback;
|
|
32476
|
+
}
|
|
32477
|
+
set onchange(callback) {
|
|
32478
|
+
if (this.#changeCallback) {
|
|
32479
|
+
this.removeEventListener("change", this.#changeCallback);
|
|
32480
|
+
this.#changeCallback = void 0;
|
|
32481
|
+
}
|
|
32482
|
+
if (typeof callback == "function") {
|
|
32483
|
+
this.#changeCallback = callback;
|
|
32484
|
+
this.addEventListener("change", callback);
|
|
32485
|
+
}
|
|
32486
|
+
}
|
|
32487
|
+
};
|
|
32488
|
+
|
|
32489
|
+
// ../media-tracks/dist/audio-rendition.js
|
|
32490
|
+
var AudioRendition = class {
|
|
32491
|
+
src;
|
|
32492
|
+
id;
|
|
32493
|
+
bitrate;
|
|
32494
|
+
codec;
|
|
32495
|
+
#selected = false;
|
|
32496
|
+
get selected() {
|
|
32497
|
+
return this.#selected;
|
|
32498
|
+
}
|
|
32499
|
+
set selected(val) {
|
|
32500
|
+
if (this.#selected === val) return;
|
|
32501
|
+
this.#selected = val;
|
|
32502
|
+
selectedChanged3(this);
|
|
32503
|
+
}
|
|
32504
|
+
};
|
|
32505
|
+
|
|
32506
|
+
// ../media-tracks/dist/audio-track-list.js
|
|
32507
|
+
function addAudioTrack(media, track) {
|
|
32508
|
+
const trackList = media.audioTracks;
|
|
32509
|
+
getPrivate(track).media = media;
|
|
32510
|
+
if (!getPrivate(track).renditionSet) {
|
|
32511
|
+
getPrivate(track).renditionSet = /* @__PURE__ */ new Set();
|
|
32512
|
+
}
|
|
32513
|
+
const trackSet = getPrivate(trackList).trackSet;
|
|
32514
|
+
trackSet.add(track);
|
|
32515
|
+
const index = trackSet.size - 1;
|
|
32516
|
+
if (!(index in AudioTrackList.prototype)) {
|
|
32517
|
+
Object.defineProperty(AudioTrackList.prototype, index, {
|
|
32518
|
+
get() {
|
|
32519
|
+
return [...getPrivate(this).trackSet][index];
|
|
32520
|
+
}
|
|
32521
|
+
});
|
|
32522
|
+
}
|
|
32523
|
+
queueMicrotask(() => {
|
|
32524
|
+
trackList.dispatchEvent(new TrackEvent("addtrack", { track }));
|
|
32525
|
+
});
|
|
32526
|
+
}
|
|
32527
|
+
function removeAudioTrack(track) {
|
|
32528
|
+
const trackList = getPrivate(track).media?.audioTracks;
|
|
32529
|
+
if (!trackList) return;
|
|
32530
|
+
const trackSet = getPrivate(trackList).trackSet;
|
|
32531
|
+
trackSet.delete(track);
|
|
32532
|
+
queueMicrotask(() => {
|
|
32533
|
+
trackList.dispatchEvent(new TrackEvent("removetrack", { track }));
|
|
32534
|
+
});
|
|
32535
|
+
}
|
|
32536
|
+
function enabledChanged(track) {
|
|
32537
|
+
const trackList = getPrivate(track).media.audioTracks;
|
|
32538
|
+
if (!trackList || getPrivate(trackList).changeRequested) return;
|
|
32539
|
+
getPrivate(trackList).changeRequested = true;
|
|
32540
|
+
queueMicrotask(() => {
|
|
32541
|
+
delete getPrivate(trackList).changeRequested;
|
|
32542
|
+
trackList.dispatchEvent(new Event("change"));
|
|
32543
|
+
});
|
|
32544
|
+
}
|
|
32545
|
+
var AudioTrackList = class extends EventTarget {
|
|
32546
|
+
#addTrackCallback;
|
|
32547
|
+
#removeTrackCallback;
|
|
32548
|
+
#changeCallback;
|
|
32549
|
+
constructor() {
|
|
32550
|
+
super();
|
|
32551
|
+
getPrivate(this).trackSet = /* @__PURE__ */ new Set();
|
|
32552
|
+
}
|
|
32553
|
+
get #tracks() {
|
|
32554
|
+
return getPrivate(this).trackSet;
|
|
32555
|
+
}
|
|
32556
|
+
[Symbol.iterator]() {
|
|
32557
|
+
return this.#tracks.values();
|
|
32558
|
+
}
|
|
32559
|
+
get length() {
|
|
32560
|
+
return this.#tracks.size;
|
|
32561
|
+
}
|
|
32562
|
+
getTrackById(id) {
|
|
32563
|
+
return [...this.#tracks].find((track) => track.id === id) ?? null;
|
|
32564
|
+
}
|
|
32565
|
+
get onaddtrack() {
|
|
32566
|
+
return this.#addTrackCallback;
|
|
32567
|
+
}
|
|
32568
|
+
set onaddtrack(callback) {
|
|
32569
|
+
if (this.#addTrackCallback) {
|
|
32570
|
+
this.removeEventListener("addtrack", this.#addTrackCallback);
|
|
32571
|
+
this.#addTrackCallback = void 0;
|
|
32572
|
+
}
|
|
32573
|
+
if (typeof callback == "function") {
|
|
32574
|
+
this.#addTrackCallback = callback;
|
|
32575
|
+
this.addEventListener("addtrack", callback);
|
|
32576
|
+
}
|
|
32577
|
+
}
|
|
32578
|
+
get onremovetrack() {
|
|
32579
|
+
return this.#removeTrackCallback;
|
|
32580
|
+
}
|
|
32581
|
+
set onremovetrack(callback) {
|
|
32582
|
+
if (this.#removeTrackCallback) {
|
|
32583
|
+
this.removeEventListener("removetrack", this.#removeTrackCallback);
|
|
32584
|
+
this.#removeTrackCallback = void 0;
|
|
32585
|
+
}
|
|
32586
|
+
if (typeof callback == "function") {
|
|
32587
|
+
this.#removeTrackCallback = callback;
|
|
32588
|
+
this.addEventListener("removetrack", callback);
|
|
32589
|
+
}
|
|
32590
|
+
}
|
|
32591
|
+
get onchange() {
|
|
32592
|
+
return this.#changeCallback;
|
|
32593
|
+
}
|
|
32594
|
+
set onchange(callback) {
|
|
32595
|
+
if (this.#changeCallback) {
|
|
32596
|
+
this.removeEventListener("change", this.#changeCallback);
|
|
32597
|
+
this.#changeCallback = void 0;
|
|
32598
|
+
}
|
|
32599
|
+
if (typeof callback == "function") {
|
|
32600
|
+
this.#changeCallback = callback;
|
|
32601
|
+
this.addEventListener("change", callback);
|
|
32602
|
+
}
|
|
32603
|
+
}
|
|
32604
|
+
};
|
|
32605
|
+
|
|
32606
|
+
// ../media-tracks/dist/audio-track.js
|
|
32607
|
+
var AudioTrack = class {
|
|
32608
|
+
id;
|
|
32609
|
+
kind;
|
|
32610
|
+
label = "";
|
|
32611
|
+
language = "";
|
|
32612
|
+
sourceBuffer;
|
|
32613
|
+
#enabled = false;
|
|
32614
|
+
addRendition(src, codec, bitrate) {
|
|
32615
|
+
const rendition = new AudioRendition();
|
|
32616
|
+
rendition.src = src;
|
|
32617
|
+
rendition.codec = codec;
|
|
32618
|
+
rendition.bitrate = bitrate;
|
|
32619
|
+
addRendition2(this, rendition);
|
|
32620
|
+
return rendition;
|
|
32621
|
+
}
|
|
32622
|
+
removeRendition(rendition) {
|
|
32623
|
+
removeRendition2(rendition);
|
|
32624
|
+
}
|
|
32625
|
+
get enabled() {
|
|
32626
|
+
return this.#enabled;
|
|
32627
|
+
}
|
|
32628
|
+
set enabled(val) {
|
|
32629
|
+
if (this.#enabled === val) return;
|
|
32630
|
+
this.#enabled = val;
|
|
32631
|
+
enabledChanged(this);
|
|
32632
|
+
}
|
|
32633
|
+
};
|
|
32634
|
+
|
|
32635
|
+
// ../media-tracks/dist/mixin.js
|
|
32636
|
+
var nativeVideoTracksFn = getBaseMediaTracksFn(globalThis.HTMLMediaElement, "video");
|
|
32637
|
+
var nativeAudioTracksFn = getBaseMediaTracksFn(globalThis.HTMLMediaElement, "audio");
|
|
32638
|
+
function MediaTracksMixin(MediaElementClass) {
|
|
32639
|
+
if (!MediaElementClass?.prototype) return MediaElementClass;
|
|
32640
|
+
const videoTracksFn = getBaseMediaTracksFn(MediaElementClass, "video");
|
|
32641
|
+
if (!videoTracksFn || `${videoTracksFn}`.includes("[native code]")) {
|
|
32642
|
+
Object.defineProperty(MediaElementClass.prototype, "videoTracks", {
|
|
32643
|
+
get() {
|
|
32644
|
+
return getVideoTracks(this);
|
|
32645
|
+
}
|
|
32646
|
+
});
|
|
32647
|
+
}
|
|
32648
|
+
const audioTracksFn = getBaseMediaTracksFn(MediaElementClass, "audio");
|
|
32649
|
+
if (!audioTracksFn || `${audioTracksFn}`.includes("[native code]")) {
|
|
32650
|
+
Object.defineProperty(MediaElementClass.prototype, "audioTracks", {
|
|
32651
|
+
get() {
|
|
32652
|
+
return getAudioTracks(this);
|
|
32653
|
+
}
|
|
32654
|
+
});
|
|
32655
|
+
}
|
|
32656
|
+
if (!("addVideoTrack" in MediaElementClass.prototype)) {
|
|
32657
|
+
MediaElementClass.prototype.addVideoTrack = function(kind, label = "", language = "") {
|
|
32658
|
+
const track = new VideoTrack();
|
|
32659
|
+
track.kind = kind;
|
|
32660
|
+
track.label = label;
|
|
32661
|
+
track.language = language;
|
|
32662
|
+
addVideoTrack(this, track);
|
|
32663
|
+
return track;
|
|
32664
|
+
};
|
|
32665
|
+
}
|
|
32666
|
+
if (!("removeVideoTrack" in MediaElementClass.prototype)) {
|
|
32667
|
+
MediaElementClass.prototype.removeVideoTrack = removeVideoTrack;
|
|
32668
|
+
}
|
|
32669
|
+
if (!("addAudioTrack" in MediaElementClass.prototype)) {
|
|
32670
|
+
MediaElementClass.prototype.addAudioTrack = function(kind, label = "", language = "") {
|
|
32671
|
+
const track = new AudioTrack();
|
|
32672
|
+
track.kind = kind;
|
|
32673
|
+
track.label = label;
|
|
32674
|
+
track.language = language;
|
|
32675
|
+
addAudioTrack(this, track);
|
|
32676
|
+
return track;
|
|
32677
|
+
};
|
|
32678
|
+
}
|
|
32679
|
+
if (!("removeAudioTrack" in MediaElementClass.prototype)) {
|
|
32680
|
+
MediaElementClass.prototype.removeAudioTrack = removeAudioTrack;
|
|
32681
|
+
}
|
|
32682
|
+
if (!("videoRenditions" in MediaElementClass.prototype)) {
|
|
32683
|
+
Object.defineProperty(MediaElementClass.prototype, "videoRenditions", {
|
|
32684
|
+
get() {
|
|
32685
|
+
return initVideoRenditions(this);
|
|
32686
|
+
}
|
|
32687
|
+
});
|
|
32688
|
+
}
|
|
32689
|
+
const initVideoRenditions = (media) => {
|
|
32690
|
+
let renditions = getPrivate(media).videoRenditions;
|
|
32691
|
+
if (!renditions) {
|
|
32692
|
+
renditions = new VideoRenditionList();
|
|
32693
|
+
getPrivate(renditions).media = media;
|
|
32694
|
+
getPrivate(media).videoRenditions = renditions;
|
|
32695
|
+
}
|
|
32696
|
+
return renditions;
|
|
32697
|
+
};
|
|
32698
|
+
if (!("audioRenditions" in MediaElementClass.prototype)) {
|
|
32699
|
+
Object.defineProperty(MediaElementClass.prototype, "audioRenditions", {
|
|
32700
|
+
get() {
|
|
32701
|
+
return initAudioRenditions(this);
|
|
32702
|
+
}
|
|
32703
|
+
});
|
|
32704
|
+
}
|
|
32705
|
+
const initAudioRenditions = (media) => {
|
|
32706
|
+
let renditions = getPrivate(media).audioRenditions;
|
|
32707
|
+
if (!renditions) {
|
|
32708
|
+
renditions = new AudioRenditionList();
|
|
32709
|
+
getPrivate(renditions).media = media;
|
|
32710
|
+
getPrivate(media).audioRenditions = renditions;
|
|
32711
|
+
}
|
|
32712
|
+
return renditions;
|
|
32713
|
+
};
|
|
32714
|
+
return MediaElementClass;
|
|
32715
|
+
}
|
|
32716
|
+
function getBaseMediaTracksFn(MediaElementClass, type) {
|
|
32717
|
+
if (MediaElementClass?.prototype) {
|
|
32718
|
+
return Object.getOwnPropertyDescriptor(MediaElementClass.prototype, `${type}Tracks`)?.get;
|
|
32719
|
+
}
|
|
32720
|
+
}
|
|
32721
|
+
function getVideoTracks(media) {
|
|
32722
|
+
let tracks = getPrivate(media).videoTracks;
|
|
32723
|
+
if (!tracks) {
|
|
32724
|
+
tracks = new VideoTrackList();
|
|
32725
|
+
getPrivate(media).videoTracks = tracks;
|
|
32726
|
+
if (nativeVideoTracksFn) {
|
|
32727
|
+
const nativeTracks = nativeVideoTracksFn.call(media.nativeEl ?? media);
|
|
32728
|
+
for (const nativeTrack of nativeTracks) {
|
|
32729
|
+
addVideoTrack(media, nativeTrack);
|
|
32730
|
+
}
|
|
32731
|
+
nativeTracks.addEventListener("change", () => {
|
|
32732
|
+
tracks.dispatchEvent(new Event("change"));
|
|
32733
|
+
});
|
|
32734
|
+
nativeTracks.addEventListener("addtrack", (event) => {
|
|
32735
|
+
if ([...tracks].some((t) => t instanceof VideoTrack)) {
|
|
32736
|
+
for (const nativeTrack of nativeTracks) {
|
|
32737
|
+
removeVideoTrack(nativeTrack);
|
|
32738
|
+
}
|
|
32739
|
+
return;
|
|
32740
|
+
}
|
|
32741
|
+
addVideoTrack(media, event.track);
|
|
32742
|
+
});
|
|
32743
|
+
nativeTracks.addEventListener("removetrack", (event) => {
|
|
32744
|
+
removeVideoTrack(event.track);
|
|
32745
|
+
});
|
|
32746
|
+
}
|
|
32747
|
+
}
|
|
32748
|
+
return tracks;
|
|
32749
|
+
}
|
|
32750
|
+
function getAudioTracks(media) {
|
|
32751
|
+
let tracks = getPrivate(media).audioTracks;
|
|
32752
|
+
if (!tracks) {
|
|
32753
|
+
tracks = new AudioTrackList();
|
|
32754
|
+
getPrivate(media).audioTracks = tracks;
|
|
32755
|
+
if (nativeAudioTracksFn) {
|
|
32756
|
+
const nativeTracks = nativeAudioTracksFn.call(media.nativeEl ?? media);
|
|
32757
|
+
for (const nativeTrack of nativeTracks) {
|
|
32758
|
+
addAudioTrack(media, nativeTrack);
|
|
32759
|
+
}
|
|
32760
|
+
nativeTracks.addEventListener("change", () => {
|
|
32761
|
+
tracks.dispatchEvent(new Event("change"));
|
|
32762
|
+
});
|
|
32763
|
+
nativeTracks.addEventListener("addtrack", (event) => {
|
|
32764
|
+
if ([...tracks].some((t) => t instanceof AudioTrack)) {
|
|
32765
|
+
for (const nativeTrack of nativeTracks) {
|
|
32766
|
+
removeAudioTrack(nativeTrack);
|
|
32767
|
+
}
|
|
32768
|
+
return;
|
|
32769
|
+
}
|
|
32770
|
+
addAudioTrack(media, event.track);
|
|
32771
|
+
});
|
|
32772
|
+
nativeTracks.addEventListener("removetrack", (event) => {
|
|
32773
|
+
removeAudioTrack(event.track);
|
|
32774
|
+
});
|
|
32775
|
+
}
|
|
32776
|
+
}
|
|
32777
|
+
return tracks;
|
|
32778
|
+
}
|
|
32779
|
+
|
|
32080
32780
|
// server-safe-globals.js
|
|
32081
32781
|
globalThis.navigator ??= {
|
|
32082
32782
|
languages: [],
|
|
@@ -32093,12 +32793,13 @@ function onErrorEvent(event) {
|
|
|
32093
32793
|
function onError(error) {
|
|
32094
32794
|
console.error("Error code", error.code, "object", error);
|
|
32095
32795
|
}
|
|
32096
|
-
var ShakaVideoElement = class extends CustomVideoElement {
|
|
32796
|
+
var ShakaVideoElement = class extends MediaTracksMixin(CustomVideoElement) {
|
|
32097
32797
|
static shadowRootOptions = { ...CustomVideoElement.shadowRootOptions };
|
|
32098
32798
|
static getTemplateHTML = (attrs) => {
|
|
32099
32799
|
const { src, ...rest } = attrs;
|
|
32100
32800
|
return CustomVideoElement.getTemplateHTML(rest);
|
|
32101
32801
|
};
|
|
32802
|
+
#hasTracksInit = false;
|
|
32102
32803
|
constructor() {
|
|
32103
32804
|
super();
|
|
32104
32805
|
if (import_shaka_player.default.Player.isBrowserSupported()) {
|
|
@@ -32124,18 +32825,109 @@ var ShakaVideoElement = class extends CustomVideoElement {
|
|
|
32124
32825
|
this.setAttribute("src", val);
|
|
32125
32826
|
}
|
|
32126
32827
|
}
|
|
32828
|
+
#removeAllMediaTracks = () => {
|
|
32829
|
+
for (const videoTrack of this.videoTracks) {
|
|
32830
|
+
this.removeVideoTrack(videoTrack);
|
|
32831
|
+
}
|
|
32832
|
+
for (const audioTrack of this.audioTracks) {
|
|
32833
|
+
this.removeAudioTrack(audioTrack);
|
|
32834
|
+
}
|
|
32835
|
+
};
|
|
32836
|
+
#addMediaTracks() {
|
|
32837
|
+
this.#removeAllMediaTracks();
|
|
32838
|
+
const variantTracks = this.api.getVariantTracks();
|
|
32839
|
+
let videoTrack = this.videoTracks.getTrackById("main");
|
|
32840
|
+
if (!videoTrack) {
|
|
32841
|
+
videoTrack = this.addVideoTrack("main");
|
|
32842
|
+
videoTrack.id = "main";
|
|
32843
|
+
videoTrack.selected = true;
|
|
32844
|
+
}
|
|
32845
|
+
const seen = /* @__PURE__ */ new Set();
|
|
32846
|
+
for (const [index, variant] of variantTracks.entries()) {
|
|
32847
|
+
if (!variant.width && !variant.height) continue;
|
|
32848
|
+
const key = `${variant.width}x${variant.height}@${variant.videoBandwidth ?? variant.bandwidth}`;
|
|
32849
|
+
if (seen.has(key)) continue;
|
|
32850
|
+
seen.add(key);
|
|
32851
|
+
const rendition = videoTrack.addRendition(
|
|
32852
|
+
variant.originalVideoId ?? `${variant.id}`,
|
|
32853
|
+
variant.width,
|
|
32854
|
+
variant.height,
|
|
32855
|
+
variant.videoCodec,
|
|
32856
|
+
variant.videoBandwidth ?? variant.bandwidth
|
|
32857
|
+
);
|
|
32858
|
+
rendition.id = `${index}`;
|
|
32859
|
+
rendition.label = `${variant.height}p`;
|
|
32860
|
+
}
|
|
32861
|
+
const audioLanguages = this.api.getAudioLanguagesAndRoles();
|
|
32862
|
+
for (let [id, audio] of audioLanguages.entries()) {
|
|
32863
|
+
const kind = id === 0 ? "main" : "alternative";
|
|
32864
|
+
const audioTrack = this.addAudioTrack(kind, audio.language, audio.language);
|
|
32865
|
+
audioTrack.id = `${id}`;
|
|
32866
|
+
if (id === 0) {
|
|
32867
|
+
audioTrack.enabled = true;
|
|
32868
|
+
}
|
|
32869
|
+
}
|
|
32870
|
+
}
|
|
32871
|
+
#initTracksListeners() {
|
|
32872
|
+
if (this.#hasTracksInit) return;
|
|
32873
|
+
this.#hasTracksInit = true;
|
|
32874
|
+
const switchRendition = () => {
|
|
32875
|
+
const selectedIndex = this.videoRenditions.selectedIndex;
|
|
32876
|
+
if (selectedIndex >= 0) {
|
|
32877
|
+
const variantTracks = this.api.getVariantTracks();
|
|
32878
|
+
const variantTrack = variantTracks[selectedIndex];
|
|
32879
|
+
if (variantTrack) {
|
|
32880
|
+
this.api.configure({ abr: { enabled: false } });
|
|
32881
|
+
this.api.selectVariantTrack(variantTrack, true);
|
|
32882
|
+
}
|
|
32883
|
+
} else {
|
|
32884
|
+
this.api.configure({ abr: { enabled: true } });
|
|
32885
|
+
}
|
|
32886
|
+
};
|
|
32887
|
+
this.videoRenditions?.addEventListener("change", switchRendition);
|
|
32888
|
+
this.audioTracks.addEventListener("change", () => {
|
|
32889
|
+
const enabledTrack = [...this.audioTracks].find((t) => t.enabled);
|
|
32890
|
+
if (enabledTrack) {
|
|
32891
|
+
const audioLanguages = this.api.getAudioLanguagesAndRoles();
|
|
32892
|
+
const audio = audioLanguages[+enabledTrack.id];
|
|
32893
|
+
if (audio) {
|
|
32894
|
+
this.api.selectAudioLanguage(audio.language, audio.role);
|
|
32895
|
+
}
|
|
32896
|
+
}
|
|
32897
|
+
});
|
|
32898
|
+
this.api.addEventListener("trackschanged", () => {
|
|
32899
|
+
const videoTrack = this.videoTracks[this.videoTracks.selectedIndex ?? 0];
|
|
32900
|
+
if (!videoTrack) return;
|
|
32901
|
+
const variantTracks = this.api.getVariantTracks();
|
|
32902
|
+
const variantIds = variantTracks.map((_, i) => `${i}`);
|
|
32903
|
+
for (const rendition of this.videoRenditions) {
|
|
32904
|
+
if (rendition.id && !variantIds.includes(rendition.id)) {
|
|
32905
|
+
videoTrack.removeRendition(rendition);
|
|
32906
|
+
}
|
|
32907
|
+
}
|
|
32908
|
+
});
|
|
32909
|
+
}
|
|
32127
32910
|
async load() {
|
|
32128
32911
|
if (!this.api) return;
|
|
32129
32912
|
await Promise.resolve();
|
|
32130
32913
|
await this.api.attach(this.nativeEl);
|
|
32131
32914
|
if (!this.src) {
|
|
32915
|
+
this.#removeAllMediaTracks();
|
|
32132
32916
|
this.api.unload();
|
|
32133
32917
|
} else {
|
|
32134
32918
|
try {
|
|
32135
32919
|
await this.api.load(this.src);
|
|
32136
32920
|
} catch (e) {
|
|
32137
32921
|
onError(e);
|
|
32922
|
+
return;
|
|
32923
|
+
}
|
|
32924
|
+
if (this.nativeEl.autoplay && this.nativeEl.paused) {
|
|
32925
|
+
this.nativeEl.play().catch((err) => {
|
|
32926
|
+
console.warn("Autoplay failed:", err);
|
|
32927
|
+
});
|
|
32138
32928
|
}
|
|
32929
|
+
this.#addMediaTracks();
|
|
32930
|
+
this.#initTracksListeners();
|
|
32139
32931
|
}
|
|
32140
32932
|
}
|
|
32141
32933
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "shaka-video-element",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Custom element (web component) for Shaka Player",
|
|
5
5
|
"author": "@muxinc",
|
|
6
6
|
"license": "MIT",
|
|
@@ -53,6 +53,7 @@
|
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
55
|
"custom-media-element": "^1.4.5",
|
|
56
|
+
"media-tracks": "^0.3.3",
|
|
56
57
|
"shaka-player": "~4.15.4"
|
|
57
58
|
},
|
|
58
59
|
"devDependencies": {
|