senza-sdk 4.4.1-daf0312.0 → 4.4.2-efcb53d.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/dist/bundle.js +1 -1
- package/dist/bundle.js.LICENSE.txt +28 -3
- package/package.json +6 -6
- package/src/api.js +3 -0
- package/src/implementation/api.js +1 -1
- package/src/implementation/lifecycle.js +41 -29
- package/src/implementation/remotePlayer.js +101 -48
- package/src/implementation/senzaShakaPlayer.js +142 -72
- package/src/implementation/utils.js +18 -206
- package/src/interface/remotePlayer.js +47 -4
- package/src/interface/version.js +1 -1
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { SenzaShakaPlayer as SenzaShakaInterface, shaka } from "../interface/senzaShakaPlayer";
|
|
2
|
-
|
|
2
|
+
import * as shakaDebug from "shaka-player/dist/shaka-player.compiled.debug.js";
|
|
3
3
|
import { remotePlayer, lifecycle, getPlatformInfo } from "./api";
|
|
4
|
-
import { sdkLogger
|
|
4
|
+
import { sdkLogger } from "./utils";
|
|
5
5
|
import moment from "moment";
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
// Define custom error category
|
|
9
8
|
shaka.util.Error.Category.SENZA_PLAYER_ERROR = 50;
|
|
10
9
|
shaka.util.Error.Code.SENZA_PLAYER_ERROR = 10500;
|
|
@@ -32,7 +31,6 @@ class SenzaError extends shaka.util.Error {
|
|
|
32
31
|
}
|
|
33
32
|
}
|
|
34
33
|
|
|
35
|
-
|
|
36
34
|
export class SenzaShakaPlayer extends SenzaShakaInterface {
|
|
37
35
|
/** @private {SenzaShakaPlayer|null} Previous instance of the player */
|
|
38
36
|
static _prevInstance = null;
|
|
@@ -120,13 +118,27 @@ export class SenzaShakaPlayer extends SenzaShakaInterface {
|
|
|
120
118
|
},
|
|
121
119
|
"pause": () => {
|
|
122
120
|
this._resetPlayPromise();
|
|
123
|
-
this.
|
|
124
|
-
.
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
121
|
+
if (!this._pauseForDelayedSeek) {
|
|
122
|
+
this.remotePlayer.pause()
|
|
123
|
+
.catch(error => {
|
|
124
|
+
sdkLogger.error("Failed to pause remote player:", error);
|
|
125
|
+
this.handleSenzaError(error.code, error.message || "Unknown pause error");
|
|
126
|
+
});
|
|
127
|
+
lifecycle.moveToForeground();
|
|
128
|
+
} else {
|
|
129
|
+
// in case of background seek, pause was called on local player, calling play() on local player will wait until "playing" event arrives (or timesout)
|
|
130
|
+
sdkLogger.info("senzaShakaPlayer pause Callback calling play() on local player. playing event should follow");
|
|
131
|
+
this._pauseForDelayedSeek = false;
|
|
132
|
+
this.videoElement.play();
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
"seeked": () => {
|
|
136
|
+
// In case of background seek - we need to pause the local player after "seeked" until remote player is "playing" to avoid difference between the players.
|
|
137
|
+
if (this.isInRemotePlayback) {
|
|
138
|
+
this._pauseForDelayedSeek = true;
|
|
139
|
+
sdkLogger.info("senzaShakaPlayer seeked Callback: pausing local player. play should follow");
|
|
140
|
+
this.videoElement.pause();
|
|
141
|
+
}
|
|
130
142
|
}
|
|
131
143
|
};
|
|
132
144
|
|
|
@@ -150,57 +162,57 @@ export class SenzaShakaPlayer extends SenzaShakaInterface {
|
|
|
150
162
|
},
|
|
151
163
|
"license-request": async (event) => {
|
|
152
164
|
sdkLogger.log("remotePlayer", "license-request", "Got license-request event from remote player");
|
|
165
|
+
let responseBody = "Unknown Error";
|
|
166
|
+
let status = 500;
|
|
153
167
|
|
|
154
|
-
|
|
155
|
-
const requestBuffer = event?.detail?.licenseRequest;
|
|
156
|
-
const requestBufferStr = String.fromCharCode.apply(null, new Uint8Array(requestBuffer));
|
|
157
|
-
const decodedLicenseRequest = window.atob(requestBufferStr); // Decode from base64
|
|
158
|
-
const licenseRequestBytes = Uint8Array.from(decodedLicenseRequest, (l) => l.charCodeAt(0));
|
|
159
|
-
|
|
160
|
-
const request = {
|
|
161
|
-
body: licenseRequestBytes.buffer,
|
|
162
|
-
uris: [this.getConfiguration().drm.servers["com.widevine.alpha"]], // TODO: safe gaurd against undefined and other server types
|
|
163
|
-
method: "POST",
|
|
164
|
-
originatesFromRemotePlayer: true
|
|
165
|
-
};
|
|
168
|
+
try {
|
|
166
169
|
|
|
167
|
-
|
|
170
|
+
if (!this?.getConfiguration()?.drm?.servers?.["com.widevine.alpha"]) {
|
|
171
|
+
status = 400;
|
|
172
|
+
responseBody = "Missing Widevine license server";
|
|
173
|
+
sdkLogger.warn("remotePlayer", "license-request", "missing Widevine license server");
|
|
174
|
+
return; // the finally will send the response
|
|
175
|
+
}
|
|
176
|
+
// Extract license body from event
|
|
177
|
+
const requestBuffer = event?.detail?.licenseRequest;
|
|
178
|
+
if (!requestBuffer) {
|
|
179
|
+
status = 400;
|
|
180
|
+
responseBody = "Missing license request buffer";
|
|
181
|
+
sdkLogger.warn("remotePlayer", "license-request", "missing license request buffer");
|
|
182
|
+
return; // the finally will send the response
|
|
183
|
+
}
|
|
184
|
+
const requestBufferStr = String.fromCharCode.apply(null, new Uint8Array(requestBuffer));
|
|
185
|
+
const decodedLicenseRequest = window.atob(requestBufferStr); // Decode from base64
|
|
186
|
+
const licenseRequestBytes = Uint8Array.from(decodedLicenseRequest, (l) => l.charCodeAt(0));
|
|
168
187
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
sdkLogger.log("remotePlayer", "license-request", "Writing response to remote player", response.status);
|
|
176
|
-
event.writeLicenseResponse(response.status, responseBody);
|
|
188
|
+
const request = {
|
|
189
|
+
body: licenseRequestBytes.buffer,
|
|
190
|
+
uris: [this.getConfiguration().drm.servers["com.widevine.alpha"]],
|
|
191
|
+
method: "POST",
|
|
192
|
+
originatesFromRemotePlayer: true
|
|
193
|
+
};
|
|
177
194
|
|
|
178
|
-
|
|
179
|
-
"tracksupdate": () => {
|
|
180
|
-
this._audioTracksMap = {};
|
|
181
|
-
this._textTracksMap = {};
|
|
182
|
-
// create a map between language code and track id to be used for selection. If the language appears more than once the last one will be taken.
|
|
183
|
-
const audioTracks = remotePlayer.getAudioTracks();
|
|
184
|
-
for (const track of audioTracks) {
|
|
185
|
-
let lang = track.lang;
|
|
186
|
-
|
|
187
|
-
if (lang.length === 3) {
|
|
188
|
-
lang = iso6393to1[lang] || lang;
|
|
189
|
-
}
|
|
190
|
-
this._audioTracksMap[lang] = track.id;
|
|
191
|
-
}
|
|
195
|
+
const response = await this.getNetworkingEngine().request(shaka.net.NetworkingEngine.RequestType.LICENSE, request).promise;
|
|
192
196
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
if (!track.autoTranslate) {
|
|
196
|
-
let lang = track.lang;
|
|
197
|
+
responseBody = response.data;
|
|
198
|
+
status = response.status;
|
|
197
199
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
this._textTracksMap[lang] = track.id;
|
|
200
|
+
if (status < 200 || status >= 300) {
|
|
201
|
+
responseBody = response.data ?? String.fromCharCode(new Uint8Array(response.data));
|
|
202
|
+
sdkLogger.error("remotePlayer", "license-request", "failed to to get response from widevine:", status, responseBody);
|
|
202
203
|
}
|
|
204
|
+
} catch (error) {
|
|
205
|
+
sdkLogger.error("remotePlayer", "license-request", "License request failed:", error);
|
|
206
|
+
// For network errors, the error.data array contains [uri, status, responseText, ...]
|
|
207
|
+
status = error?.data?.[1] ?? 500;
|
|
208
|
+
responseBody = error?.data?.[2] ?? `Error response: ${error.message || error.toString()}`;
|
|
209
|
+
sdkLogger.error("remotePlayer", "license-request", "failed to get response from widevine:", status, responseBody);
|
|
210
|
+
} finally {
|
|
211
|
+
// Write response to remote player
|
|
212
|
+
sdkLogger.log("remotePlayer", "license-request", "Writing response to remote player", status);
|
|
213
|
+
event.writeLicenseResponse(status, responseBody);
|
|
203
214
|
}
|
|
215
|
+
|
|
204
216
|
},
|
|
205
217
|
"playing": async () => {
|
|
206
218
|
sdkLogger.info("remotePlayer playing event received");
|
|
@@ -348,7 +360,7 @@ export class SenzaShakaPlayer extends SenzaShakaInterface {
|
|
|
348
360
|
this._minSuggestedPresentationDelay = uiSettings.minSuggestedPresentationDelay;
|
|
349
361
|
sdkLogger.info(`Using configured minSuggestedPresentationDelay: ${this._minSuggestedPresentationDelay}s`);
|
|
350
362
|
}
|
|
351
|
-
|
|
363
|
+
this._pauseForDelayedSeek = false;
|
|
352
364
|
// if video element is provided, add the listeres here. In this case ,there is no need to call attach.
|
|
353
365
|
if (videoElement) {
|
|
354
366
|
this._attach(videoElement);
|
|
@@ -439,8 +451,6 @@ export class SenzaShakaPlayer extends SenzaShakaInterface {
|
|
|
439
451
|
}
|
|
440
452
|
|
|
441
453
|
await super.detach(keepAdManager);
|
|
442
|
-
this._audioTracksMap = {};
|
|
443
|
-
this._textTracksMap = {};
|
|
444
454
|
this._removeVideoElementEventListeners();
|
|
445
455
|
try {
|
|
446
456
|
if (remotePlayer.getAssetUri() !== "") {
|
|
@@ -470,30 +480,65 @@ export class SenzaShakaPlayer extends SenzaShakaInterface {
|
|
|
470
480
|
}
|
|
471
481
|
|
|
472
482
|
getTextLanguages() {
|
|
473
|
-
|
|
483
|
+
const tracks = this.remotePlayer.getTextTracks();
|
|
484
|
+
return [...new Set(tracks.map(item => item.lang))];
|
|
474
485
|
}
|
|
475
486
|
|
|
476
487
|
getAudioLanguages() {
|
|
477
|
-
|
|
488
|
+
const tracks = this.remotePlayer.getAudioTracks();
|
|
489
|
+
return [...new Set(tracks.map(item => item.lang))];
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
selectVariantTrack(track, clearBuffer = false, safeMargin = 0) {
|
|
494
|
+
const audioLang = track.language;
|
|
495
|
+
const audioRole = Array.isArray(track.audioRoles) && track.audioRoles.length > 0
|
|
496
|
+
? track.audioRoles[0]
|
|
497
|
+
: null;
|
|
498
|
+
const audioId = track.audioId;
|
|
499
|
+
sdkLogger.log(`selectVariantTrack() called: audio id ${audioId} language ${audioLang}, role ${audioRole}, accessibilityPurpose: ${track.accessibilityPurpose}`);
|
|
500
|
+
|
|
501
|
+
const apCode = this._getAccessibilityCodeFromPurpose(track.accessibilityPurpose);
|
|
502
|
+
remotePlayer.selectAudioLanguage(audioLang, audioRole, apCode);
|
|
503
|
+
|
|
504
|
+
super.selectVariantTrack(track, clearBuffer, safeMargin);
|
|
505
|
+
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
selectAudioTrack(audioTrack, safeMargin = 0) {
|
|
509
|
+
const audioId = audioTrack.id;
|
|
510
|
+
const audioLang = audioTrack.language;
|
|
511
|
+
const role = Array.isArray(audioTrack.roles) && audioTrack.roles.length > 0
|
|
512
|
+
? audioTrack.roles[0]
|
|
513
|
+
: null;
|
|
514
|
+
sdkLogger.log(`selectAudioTrack() called: audio id ${audioId} language ${audioLang}, role ${role}, accessibilityPurpose: ${audioTrack.accessibilityPurpose}`);
|
|
515
|
+
const apCode = this._getAccessibilityCodeFromPurpose(audioTrack.accessibilityPurpose);
|
|
516
|
+
remotePlayer.selectAudioLanguage(audioLang, role, apCode);
|
|
517
|
+
|
|
518
|
+
super.selectAudioTrack(audioTrack, safeMargin);
|
|
478
519
|
}
|
|
479
520
|
|
|
480
521
|
selectAudioLanguage(language, role) {
|
|
481
|
-
sdkLogger.log("Selecting audio language:", language, "with role: ", role);
|
|
482
|
-
|
|
483
|
-
remotePlayer.selectAudioTrack(this._audioTracksMap[language]);
|
|
484
|
-
} else {
|
|
485
|
-
sdkLogger.warn(`Language ${language} not found in audio tracks map`);
|
|
486
|
-
}
|
|
522
|
+
sdkLogger.log("selectAudioLanguage() Selecting audio language:", language, "with role: ", role);
|
|
523
|
+
remotePlayer.selectAudioLanguage(language, role);
|
|
487
524
|
super.selectAudioLanguage(language, role);
|
|
488
525
|
}
|
|
489
526
|
|
|
527
|
+
selectTextTrack(textTrack) {
|
|
528
|
+
const textId = textTrack.id;
|
|
529
|
+
const textLang = textTrack.language;
|
|
530
|
+
const role = Array.isArray(textTrack.roles) && textTrack.roles.length > 0
|
|
531
|
+
? textTrack.roles[0]
|
|
532
|
+
: null;
|
|
533
|
+
sdkLogger.log(`selectTextTrack() called: text id ${textId} language ${textLang}, role ${role}, accessibilityPurpose: ${textTrack.accessibilityPurpose}`);
|
|
534
|
+
const apCode = this._getAccessibilityCodeFromPurpose(textTrack.accessibilityPurpose);
|
|
535
|
+
remotePlayer.selectTextLanguage(textLang, role, apCode);
|
|
536
|
+
|
|
537
|
+
super.selectTextTrack(textTrack);
|
|
538
|
+
}
|
|
490
539
|
selectTextLanguage(language, role) {
|
|
491
|
-
sdkLogger.log("Selecting text language:", language, "with role:", role);
|
|
492
|
-
|
|
493
|
-
remotePlayer.selectTextTrack(this._textTracksMap[language]);
|
|
494
|
-
} else {
|
|
495
|
-
sdkLogger.warn(`Language ${language} not found in text tracks map`);
|
|
496
|
-
}
|
|
540
|
+
sdkLogger.log("selectTextLanguage() Selecting text language:", language, "with role: ", role);
|
|
541
|
+
remotePlayer.selectTextLanguage(language, role);
|
|
497
542
|
super.selectTextLanguage(language, role);
|
|
498
543
|
}
|
|
499
544
|
|
|
@@ -720,7 +765,6 @@ export class SenzaShakaPlayer extends SenzaShakaInterface {
|
|
|
720
765
|
};
|
|
721
766
|
|
|
722
767
|
if (!this.isInRemotePlayback || remotePlayer.getAssetUri() !== url) {
|
|
723
|
-
this._audioTracksMap = {};
|
|
724
768
|
this._videoTracksMap = {};
|
|
725
769
|
try {
|
|
726
770
|
if (this.remotePlayer.getLoadMode() === this.remotePlayer.LoadMode.UNLOADING) {
|
|
@@ -775,6 +819,32 @@ export class SenzaShakaPlayer extends SenzaShakaInterface {
|
|
|
775
819
|
}
|
|
776
820
|
}
|
|
777
821
|
|
|
822
|
+
/**
|
|
823
|
+
* Returns accessibility code of Shaka's accessibility purpose string
|
|
824
|
+
* @param {string} purpose
|
|
825
|
+
* @returns {null|string}
|
|
826
|
+
* @private
|
|
827
|
+
*/
|
|
828
|
+
_getAccessibilityCodeFromPurpose(purpose) {
|
|
829
|
+
switch (purpose) {
|
|
830
|
+
case shakaDebug.media.ManifestParser.AccessibilityPurpose.VISUALLY_IMPAIRED:
|
|
831
|
+
return remotePlayer.AccessibilityPurposeCode.VISUALLY_IMPAIRED;
|
|
832
|
+
case shakaDebug.media.ManifestParser.AccessibilityPurpose.HARD_OF_HEARING:
|
|
833
|
+
return remotePlayer.AccessibilityPurposeCode.HARD_OF_HEARING;
|
|
834
|
+
case shakaDebug.media.ManifestParser.AccessibilityPurpose.SPOKEN_SUBTITLES:
|
|
835
|
+
return remotePlayer.AccessibilityPurposeCode.SPOKEN_SUBTITLES;
|
|
836
|
+
case undefined:
|
|
837
|
+
case null:
|
|
838
|
+
case "":
|
|
839
|
+
return remotePlayer.AccessibilityPurposeCode.NONE;
|
|
840
|
+
default:
|
|
841
|
+
sdkLogger.warn(`_getAccessibilityCodeFromPurpose(): unknown accessibilityPurpose ${purpose}`);
|
|
842
|
+
return remotePlayer.AccessibilityPurposeCode.NONE;
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
|
|
778
848
|
}
|
|
779
849
|
|
|
780
850
|
shaka.Player = SenzaShakaPlayer;
|
|
@@ -135,6 +135,24 @@ export function isSubtitlesTranslationPattern(lang) {
|
|
|
135
135
|
return (lang?.toString() || "").startsWith("*:");
|
|
136
136
|
}
|
|
137
137
|
|
|
138
|
+
export function isAppVersionAboveOrEqual(appVersion, minAppVersion) {
|
|
139
|
+
const version = appVersion.replace(/-dev|-prod/g, "").replace(/^.*\//, "");
|
|
140
|
+
|
|
141
|
+
sdkLogger.info(`isAppVersionAboveOrEqual: Comparing appVersion: ${version} with minAppVersion: ${minAppVersion}`);
|
|
142
|
+
const v1Parts = version.split(".").map(num => parseInt(num, 10) || 0);
|
|
143
|
+
const v2Parts = minAppVersion.split(".").map(num => parseInt(num, 10) || 0);
|
|
144
|
+
|
|
145
|
+
const maxLength = Math.max(v1Parts.length, v2Parts.length);
|
|
146
|
+
for (let i = 0; i < maxLength; i++) {
|
|
147
|
+
const v1 = v1Parts[i] ?? 0; // default missing parts to 0
|
|
148
|
+
const v2 = v2Parts[i] ?? 0;
|
|
149
|
+
if (v1 > v2) return true; // `appVersion` is newer
|
|
150
|
+
if (v1 < v2) return false; // `appVersion` is older
|
|
151
|
+
}
|
|
152
|
+
return true; // equal.
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
|
|
138
156
|
// These StreamType constants are used as a mask for the client to play/stop the specific types
|
|
139
157
|
export const StreamType = Object.freeze({
|
|
140
158
|
NONE: 0,
|
|
@@ -163,209 +181,3 @@ export const TargetPlayingState = Object.freeze({
|
|
|
163
181
|
PLAYING_UI: "playingUi",
|
|
164
182
|
PLAYING_ABR: "playingAbr"
|
|
165
183
|
});
|
|
166
|
-
|
|
167
|
-
export const iso6393to1 = {
|
|
168
|
-
"aar": "aa",
|
|
169
|
-
"abk": "ab",
|
|
170
|
-
"afr": "af",
|
|
171
|
-
"aka": "ak",
|
|
172
|
-
"alb": "sq",
|
|
173
|
-
"amh": "am",
|
|
174
|
-
"ara": "ar",
|
|
175
|
-
"arg": "an",
|
|
176
|
-
"arm": "hy",
|
|
177
|
-
"asm": "as",
|
|
178
|
-
"ava": "av",
|
|
179
|
-
"ave": "ae",
|
|
180
|
-
"aym": "ay",
|
|
181
|
-
"aze": "az",
|
|
182
|
-
"bak": "ba",
|
|
183
|
-
"bam": "bm",
|
|
184
|
-
"baq": "eu",
|
|
185
|
-
"bel": "be",
|
|
186
|
-
"ben": "bn",
|
|
187
|
-
"bih": "bh",
|
|
188
|
-
"bis": "bi",
|
|
189
|
-
"bod": "bo",
|
|
190
|
-
"bos": "bs",
|
|
191
|
-
"bre": "br",
|
|
192
|
-
"bul": "bg",
|
|
193
|
-
"bur": "my",
|
|
194
|
-
"cat": "ca",
|
|
195
|
-
"ces": "cs",
|
|
196
|
-
"cha": "ch",
|
|
197
|
-
"che": "ce",
|
|
198
|
-
"chi": "zh",
|
|
199
|
-
"chu": "cu",
|
|
200
|
-
"chv": "cv",
|
|
201
|
-
"cor": "kw",
|
|
202
|
-
"cos": "co",
|
|
203
|
-
"cre": "cr",
|
|
204
|
-
"cym": "cy",
|
|
205
|
-
"dan": "da",
|
|
206
|
-
"deu": "de",
|
|
207
|
-
"div": "dv",
|
|
208
|
-
"dut": "nl",
|
|
209
|
-
"dzo": "dz",
|
|
210
|
-
"ell": "el",
|
|
211
|
-
"eng": "en",
|
|
212
|
-
"epo": "eo",
|
|
213
|
-
"est": "et",
|
|
214
|
-
"eus": "eu",
|
|
215
|
-
"ewe": "ee",
|
|
216
|
-
"fao": "fo",
|
|
217
|
-
"fas": "fa",
|
|
218
|
-
"fij": "fj",
|
|
219
|
-
"fin": "fi",
|
|
220
|
-
"fra": "fr",
|
|
221
|
-
"fre": "fr",
|
|
222
|
-
"fry": "fy",
|
|
223
|
-
"ful": "ff",
|
|
224
|
-
"geo": "ka",
|
|
225
|
-
"ger": "de",
|
|
226
|
-
"gla": "gd",
|
|
227
|
-
"gle": "ga",
|
|
228
|
-
"glg": "gl",
|
|
229
|
-
"glv": "gv",
|
|
230
|
-
"gre": "el",
|
|
231
|
-
"grn": "gn",
|
|
232
|
-
"guj": "gu",
|
|
233
|
-
"hat": "ht",
|
|
234
|
-
"hau": "ha",
|
|
235
|
-
"heb": "he",
|
|
236
|
-
"her": "hz",
|
|
237
|
-
"hin": "hi",
|
|
238
|
-
"hmo": "ho",
|
|
239
|
-
"hrv": "hr",
|
|
240
|
-
"hun": "hu",
|
|
241
|
-
"hye": "hy",
|
|
242
|
-
"ibo": "ig",
|
|
243
|
-
"ice": "is",
|
|
244
|
-
"ido": "io",
|
|
245
|
-
"iii": "ii",
|
|
246
|
-
"iku": "iu",
|
|
247
|
-
"ile": "ie",
|
|
248
|
-
"ina": "ia",
|
|
249
|
-
"ind": "id",
|
|
250
|
-
"ipk": "ik",
|
|
251
|
-
"isl": "is",
|
|
252
|
-
"ita": "it",
|
|
253
|
-
"jav": "jv",
|
|
254
|
-
"jpn": "ja",
|
|
255
|
-
"kal": "kl",
|
|
256
|
-
"kan": "kn",
|
|
257
|
-
"kas": "ks",
|
|
258
|
-
"kat": "ka",
|
|
259
|
-
"kau": "kr",
|
|
260
|
-
"kaz": "kk",
|
|
261
|
-
"khm": "km",
|
|
262
|
-
"kik": "ki",
|
|
263
|
-
"kin": "rw",
|
|
264
|
-
"kir": "ky",
|
|
265
|
-
"kom": "kv",
|
|
266
|
-
"kon": "kg",
|
|
267
|
-
"kor": "ko",
|
|
268
|
-
"kua": "kj",
|
|
269
|
-
"kur": "ku",
|
|
270
|
-
"lao": "lo",
|
|
271
|
-
"lat": "la",
|
|
272
|
-
"lav": "lv",
|
|
273
|
-
"lim": "li",
|
|
274
|
-
"lin": "ln",
|
|
275
|
-
"lit": "lt",
|
|
276
|
-
"ltz": "lb",
|
|
277
|
-
"lub": "lu",
|
|
278
|
-
"lug": "lg",
|
|
279
|
-
"mac": "mk",
|
|
280
|
-
"mah": "mh",
|
|
281
|
-
"mal": "ml",
|
|
282
|
-
"mao": "mi",
|
|
283
|
-
"mar": "mr",
|
|
284
|
-
"may": "ms",
|
|
285
|
-
"mkd": "mk",
|
|
286
|
-
"mlg": "mg",
|
|
287
|
-
"mlt": "mt",
|
|
288
|
-
"mon": "mn",
|
|
289
|
-
"mri": "mi",
|
|
290
|
-
"msa": "ms",
|
|
291
|
-
"mya": "my",
|
|
292
|
-
"nau": "na",
|
|
293
|
-
"nav": "nv",
|
|
294
|
-
"nbl": "nr",
|
|
295
|
-
"nde": "nd",
|
|
296
|
-
"ndo": "ng",
|
|
297
|
-
"nep": "ne",
|
|
298
|
-
"nld": "nl",
|
|
299
|
-
"nno": "nn",
|
|
300
|
-
"nob": "nb",
|
|
301
|
-
"nor": "no",
|
|
302
|
-
"nya": "ny",
|
|
303
|
-
"oci": "oc",
|
|
304
|
-
"oji": "oj",
|
|
305
|
-
"ori": "or",
|
|
306
|
-
"orm": "om",
|
|
307
|
-
"oss": "os",
|
|
308
|
-
"pan": "pa",
|
|
309
|
-
"per": "fa",
|
|
310
|
-
"pli": "pi",
|
|
311
|
-
"pol": "pl",
|
|
312
|
-
"por": "pt",
|
|
313
|
-
"pus": "ps",
|
|
314
|
-
"que": "qu",
|
|
315
|
-
"roh": "rm",
|
|
316
|
-
"ron": "ro",
|
|
317
|
-
"rum": "ro",
|
|
318
|
-
"run": "rn",
|
|
319
|
-
"rus": "ru",
|
|
320
|
-
"sag": "sg",
|
|
321
|
-
"san": "sa",
|
|
322
|
-
"sin": "si",
|
|
323
|
-
"slk": "sk",
|
|
324
|
-
"slo": "sk",
|
|
325
|
-
"slv": "sl",
|
|
326
|
-
"sme": "se",
|
|
327
|
-
"smo": "sm",
|
|
328
|
-
"sna": "sn",
|
|
329
|
-
"snd": "sd",
|
|
330
|
-
"som": "so",
|
|
331
|
-
"sot": "st",
|
|
332
|
-
"spa": "es",
|
|
333
|
-
"sqi": "sq",
|
|
334
|
-
"srd": "sc",
|
|
335
|
-
"srp": "sr",
|
|
336
|
-
"ssw": "ss",
|
|
337
|
-
"sun": "su",
|
|
338
|
-
"swa": "sw",
|
|
339
|
-
"swe": "sv",
|
|
340
|
-
"tah": "ty",
|
|
341
|
-
"tam": "ta",
|
|
342
|
-
"tat": "tt",
|
|
343
|
-
"tel": "te",
|
|
344
|
-
"tgk": "tg",
|
|
345
|
-
"tgl": "tl",
|
|
346
|
-
"tha": "th",
|
|
347
|
-
"tib": "bo",
|
|
348
|
-
"tir": "ti",
|
|
349
|
-
"ton": "to",
|
|
350
|
-
"tsn": "tn",
|
|
351
|
-
"tso": "ts",
|
|
352
|
-
"tuk": "tk",
|
|
353
|
-
"tur": "tr",
|
|
354
|
-
"twi": "tw",
|
|
355
|
-
"uig": "ug",
|
|
356
|
-
"ukr": "uk",
|
|
357
|
-
"urd": "ur",
|
|
358
|
-
"uzb": "uz",
|
|
359
|
-
"ven": "ve",
|
|
360
|
-
"vie": "vi",
|
|
361
|
-
"vol": "vo",
|
|
362
|
-
"wel": "cy",
|
|
363
|
-
"wln": "wa",
|
|
364
|
-
"wol": "wo",
|
|
365
|
-
"xho": "xh",
|
|
366
|
-
"yid": "yi",
|
|
367
|
-
"yor": "yo",
|
|
368
|
-
"zha": "za",
|
|
369
|
-
"zho": "zh",
|
|
370
|
-
"zul": "zu"
|
|
371
|
-
};
|
|
@@ -217,6 +217,21 @@ class RemotePlayer extends EventTarget {
|
|
|
217
217
|
UNLOADING: "unloading"
|
|
218
218
|
});
|
|
219
219
|
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* @typedef {Object} AccessibilityPurposeCode
|
|
223
|
+
* @property {string} NONE
|
|
224
|
+
* @property {string} VISUALLY_IMPAIRED
|
|
225
|
+
* @property {string} HARD_OF_HEARING
|
|
226
|
+
* @property {string} SPOKEN_SUBTITLES
|
|
227
|
+
*/
|
|
228
|
+
AccessibilityPurposeCode = {
|
|
229
|
+
NONE: "",
|
|
230
|
+
VISUALLY_IMPAIRED: "1",
|
|
231
|
+
HARD_OF_HEARING: "2",
|
|
232
|
+
SPOKEN_SUBTITLES: "9"
|
|
233
|
+
};
|
|
234
|
+
|
|
220
235
|
/** get the player configuration.
|
|
221
236
|
* @returns {Config}
|
|
222
237
|
* */
|
|
@@ -280,8 +295,8 @@ class RemotePlayer extends EventTarget {
|
|
|
280
295
|
* @returns {Promise}
|
|
281
296
|
* @throws {RemotePlayerError} error object contains code & msg
|
|
282
297
|
*/
|
|
283
|
-
async play(
|
|
284
|
-
return noop("RemotePlayer.play"
|
|
298
|
+
async play() {
|
|
299
|
+
return noop("RemotePlayer.play");
|
|
285
300
|
}
|
|
286
301
|
|
|
287
302
|
/** Pauses the currently playing audio or video
|
|
@@ -328,10 +343,13 @@ class RemotePlayer extends EventTarget {
|
|
|
328
343
|
return this.LoadMode.NOT_LOADED;
|
|
329
344
|
}
|
|
330
345
|
|
|
346
|
+
|
|
331
347
|
/**
|
|
332
348
|
* @typedef {Object} TextTrack
|
|
333
349
|
* @property {string} id - A unique ID for the track
|
|
334
350
|
* @property {string} lang - The track's language
|
|
351
|
+
* @property {string[]} roles - The track's roles
|
|
352
|
+
* @property {string=} accessibilityPurpose - The track's accessibilityPurpose code
|
|
335
353
|
* @property {boolean} selected - Whether the track is selected
|
|
336
354
|
* @property {boolean} autoTranslate - (Optional) Whether the track is an auto-translated language
|
|
337
355
|
*/
|
|
@@ -353,6 +371,8 @@ class RemotePlayer extends EventTarget {
|
|
|
353
371
|
* @typedef {Object} AudioTrack
|
|
354
372
|
* @property {string} id - A unique ID for the track
|
|
355
373
|
* @property {string} lang - The track's language
|
|
374
|
+
* @property {string[]} roles - The track's roles
|
|
375
|
+
* @property {string=} accessibilityPurpose - The track's accessibilityPurpose code
|
|
356
376
|
* @property {boolean} selected - Whether the track is selected
|
|
357
377
|
*/
|
|
358
378
|
/** Get all the audio tracks.
|
|
@@ -377,10 +397,22 @@ class RemotePlayer extends EventTarget {
|
|
|
377
397
|
return noop("RemotePlayer.selectAudioTrack", audioTrackId);
|
|
378
398
|
}
|
|
379
399
|
|
|
380
|
-
/**
|
|
400
|
+
/** Selects an audio track based on given language, role and accessibility.
|
|
401
|
+
* Tf exact track match - Best track will be selected by the internal system
|
|
402
|
+
* @private
|
|
403
|
+
* @param {string} language - The language of the track to select.
|
|
404
|
+
* @param {string=} role - The role of the track to select.
|
|
405
|
+
* @param {AccessibilityPurposeCode=} accessibilityPurposeCode - The accessibilityPurposeCode of the track to select. Based on DASH manifest role "urn:tva:metadata:cs:AudioPurposeCS:2007"
|
|
406
|
+
* @returns {Promise<void>} A Promise that resolves once the selection process is complete.
|
|
407
|
+
**/
|
|
408
|
+
async selectAudioLanguage(language, role="", accessibilityPurposeCode=this.AccessibilityPurposeCode.NONE) {
|
|
409
|
+
return noop("RemotePlayer.selectAudioLanguage", language, role, accessibilityPurposeCode);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/** Select a text track based on given language, role and accessibility.
|
|
381
413
|
* Track id should come from a call to getTextTracks.
|
|
382
414
|
* If no tracks exist - this is a no-op.
|
|
383
|
-
*
|
|
415
|
+
* Tf no tracks exist - fallback ID will be used by internal system to select best matching track.
|
|
384
416
|
* @param {string} textTrackId - The ID of the text track to select.
|
|
385
417
|
* @returns {Promise<void>} A Promise that resolves once the selection process is complete.
|
|
386
418
|
* @throws {RemotePlayerError} If the player is not initialized or not loaded.
|
|
@@ -389,6 +421,17 @@ class RemotePlayer extends EventTarget {
|
|
|
389
421
|
return noop("RemotePlayer.selectTextTrack", textTrackId);
|
|
390
422
|
}
|
|
391
423
|
|
|
424
|
+
/** Selects a text track based on given language, role and accessibility.
|
|
425
|
+
* Tf exact track match - Best track will be selected by the internal system
|
|
426
|
+
* @private
|
|
427
|
+
* @param {string} language - The language of the track to select.
|
|
428
|
+
* @param {string=} role - The role of the track to select.
|
|
429
|
+
* @param {AccessibilityPurposeCode=} accessibilityPurposeCode - The accessibilityPurposeCode of the track to select. Based on DASH manifest role "urn:tva:metadata:cs:AudioPurposeCS:2007"
|
|
430
|
+
* @returns {Promise<void>} A Promise that resolves once the selection process is complete.
|
|
431
|
+
**/
|
|
432
|
+
async selectTextLanguage(language, role="", accessibilityPurposeCode=this.AccessibilityPurposeCode.NONE) {
|
|
433
|
+
return noop("RemotePlayer.selectTextLanguage", language, role, accessibilityPurposeCode);
|
|
434
|
+
}
|
|
392
435
|
/**
|
|
393
436
|
* Enable or disable the subtitles.
|
|
394
437
|
* If the player is in an unloaded state, the request will be applied next time content is played.
|
package/src/interface/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = "4.4.
|
|
1
|
+
export const version = "4.4.2-efcb53d.0";
|