senza-sdk 4.3.7-b2908c5.0 → 4.4.1-4ca75a1.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 +10 -3
- package/package.json +6 -6
- package/src/api.js +0 -25
- package/src/implementation/api.js +1 -1
- package/src/implementation/lifecycle.js +37 -25
- package/src/implementation/remotePlayer.js +55 -71
- package/src/implementation/senzaShakaPlayer.js +69 -85
- package/src/implementation/utils.js +224 -0
- package/src/interface/deviceManager.js +1 -1
- package/src/interface/remotePlayer.js +2 -43
- package/src/interface/senzaShakaPlayer.js +2 -1
- package/src/interface/version.js +1 -1
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { SenzaShakaPlayer as SenzaShakaInterface, shaka } from "../interface/senzaShakaPlayer";
|
|
2
|
-
|
|
2
|
+
|
|
3
3
|
import { remotePlayer, lifecycle, getPlatformInfo } from "./api";
|
|
4
|
-
import { sdkLogger } from "./utils";
|
|
4
|
+
import { sdkLogger, iso6393to1 } from "./utils";
|
|
5
5
|
import moment from "moment";
|
|
6
6
|
|
|
7
|
+
|
|
7
8
|
// Define custom error category
|
|
8
9
|
shaka.util.Error.Category.SENZA_PLAYER_ERROR = 50;
|
|
9
10
|
shaka.util.Error.Code.SENZA_PLAYER_ERROR = 10500;
|
|
@@ -31,6 +32,7 @@ class SenzaError extends shaka.util.Error {
|
|
|
31
32
|
}
|
|
32
33
|
}
|
|
33
34
|
|
|
35
|
+
|
|
34
36
|
export class SenzaShakaPlayer extends SenzaShakaInterface {
|
|
35
37
|
/** @private {SenzaShakaPlayer|null} Previous instance of the player */
|
|
36
38
|
static _prevInstance = null;
|
|
@@ -118,13 +120,27 @@ export class SenzaShakaPlayer extends SenzaShakaInterface {
|
|
|
118
120
|
},
|
|
119
121
|
"pause": () => {
|
|
120
122
|
this._resetPlayPromise();
|
|
121
|
-
this.
|
|
122
|
-
.
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
123
|
+
if (!this._pauseForDelayedSeek) {
|
|
124
|
+
this.remotePlayer.pause()
|
|
125
|
+
.catch(error => {
|
|
126
|
+
sdkLogger.error("Failed to pause remote player:", error);
|
|
127
|
+
this.handleSenzaError(error.code, error.message || "Unknown pause error");
|
|
128
|
+
});
|
|
129
|
+
lifecycle.moveToForeground();
|
|
130
|
+
} else {
|
|
131
|
+
// in case of background seek, pause was called on local player, calling play() on local player will wait until "playing" event arrives (or timesout)
|
|
132
|
+
sdkLogger.info("senzaShakaPlayer pause Callback calling play() on local player. playing event should follow");
|
|
133
|
+
this._pauseForDelayedSeek = false;
|
|
134
|
+
this.videoElement.play();
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
"seeked" : () => {
|
|
138
|
+
// 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.
|
|
139
|
+
if (this.isInRemotePlayback) {
|
|
140
|
+
this._pauseForDelayedSeek = true;
|
|
141
|
+
sdkLogger.info("senzaShakaPlayer seeked Callback: pausing local player. play should follow");
|
|
142
|
+
this.videoElement.pause();
|
|
143
|
+
}
|
|
128
144
|
}
|
|
129
145
|
};
|
|
130
146
|
|
|
@@ -174,6 +190,32 @@ export class SenzaShakaPlayer extends SenzaShakaInterface {
|
|
|
174
190
|
event.writeLicenseResponse(response.status, responseBody);
|
|
175
191
|
|
|
176
192
|
},
|
|
193
|
+
"tracksupdate": () => {
|
|
194
|
+
this._audioTracksMap = {};
|
|
195
|
+
this._textTracksMap = {};
|
|
196
|
+
// 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.
|
|
197
|
+
const audioTracks = remotePlayer.getAudioTracks();
|
|
198
|
+
for (const track of audioTracks) {
|
|
199
|
+
let lang = track.lang;
|
|
200
|
+
|
|
201
|
+
if (lang.length === 3) {
|
|
202
|
+
lang = iso6393to1[lang] || lang;
|
|
203
|
+
}
|
|
204
|
+
this._audioTracksMap[lang] = track.id;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const textTracks = remotePlayer.getTextTracks();
|
|
208
|
+
for (const track of textTracks) {
|
|
209
|
+
if (!track.autoTranslate) {
|
|
210
|
+
let lang = track.lang;
|
|
211
|
+
|
|
212
|
+
if (lang.length === 3) {
|
|
213
|
+
lang = iso6393to1[lang] || lang;
|
|
214
|
+
}
|
|
215
|
+
this._textTracksMap[lang] = track.id;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
},
|
|
177
219
|
"playing": async () => {
|
|
178
220
|
sdkLogger.info("remotePlayer playing event received");
|
|
179
221
|
// If playing timeout was not expored, and the feature is set, handle the playing event
|
|
@@ -320,7 +362,7 @@ export class SenzaShakaPlayer extends SenzaShakaInterface {
|
|
|
320
362
|
this._minSuggestedPresentationDelay = uiSettings.minSuggestedPresentationDelay;
|
|
321
363
|
sdkLogger.info(`Using configured minSuggestedPresentationDelay: ${this._minSuggestedPresentationDelay}s`);
|
|
322
364
|
}
|
|
323
|
-
|
|
365
|
+
this._pauseForDelayedSeek = false;
|
|
324
366
|
// if video element is provided, add the listeres here. In this case ,there is no need to call attach.
|
|
325
367
|
if (videoElement) {
|
|
326
368
|
this._attach(videoElement);
|
|
@@ -411,6 +453,8 @@ export class SenzaShakaPlayer extends SenzaShakaInterface {
|
|
|
411
453
|
}
|
|
412
454
|
|
|
413
455
|
await super.detach(keepAdManager);
|
|
456
|
+
this._audioTracksMap = {};
|
|
457
|
+
this._textTracksMap = {};
|
|
414
458
|
this._removeVideoElementEventListeners();
|
|
415
459
|
try {
|
|
416
460
|
if (remotePlayer.getAssetUri() !== "") {
|
|
@@ -440,65 +484,30 @@ export class SenzaShakaPlayer extends SenzaShakaInterface {
|
|
|
440
484
|
}
|
|
441
485
|
|
|
442
486
|
getTextLanguages() {
|
|
443
|
-
|
|
444
|
-
return [...new Set(tracks.map(item => item.lang))];
|
|
487
|
+
return Object.keys(this._textTracksMap);
|
|
445
488
|
}
|
|
446
489
|
|
|
447
490
|
getAudioLanguages() {
|
|
448
|
-
|
|
449
|
-
return [...new Set(tracks.map(item => item.lang))];
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
selectVariantTrack(track, clearBuffer = false, safeMargin = 0) {
|
|
454
|
-
const audioLang = track.language;
|
|
455
|
-
const audioRole = Array.isArray(track.audioRoles) && track.audioRoles.length > 0
|
|
456
|
-
? track.audioRoles[0]
|
|
457
|
-
: null;
|
|
458
|
-
const audioId = track.audioId;
|
|
459
|
-
sdkLogger.log(`selectVariantTrack() called: audio id ${audioId} language ${audioLang}, role ${audioRole}, accessibilityPurpose: ${track.accessibilityPurpose}`);
|
|
460
|
-
|
|
461
|
-
const apCode = this._getAccessibilityCodeFromPurpose(track.accessibilityPurpose);
|
|
462
|
-
remotePlayer.selectAudioLanguage(audioLang, audioRole, apCode);
|
|
463
|
-
|
|
464
|
-
super.selectVariantTrack(track, clearBuffer, safeMargin);
|
|
465
|
-
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
selectAudioTrack(audioTrack, safeMargin = 0) {
|
|
469
|
-
const audioId = audioTrack.id;
|
|
470
|
-
const audioLang = audioTrack.language;
|
|
471
|
-
const role = Array.isArray(audioTrack.roles) && audioTrack.roles.length > 0
|
|
472
|
-
? audioTrack.roles[0]
|
|
473
|
-
: null;
|
|
474
|
-
sdkLogger.log(`selectAudioTrack() called: audio id ${audioId} language ${audioLang}, role ${role}, accessibilityPurpose: ${audioTrack.accessibilityPurpose}`);
|
|
475
|
-
const apCode = this._getAccessibilityCodeFromPurpose(audioTrack.accessibilityPurpose);
|
|
476
|
-
remotePlayer.selectAudioLanguage(audioLang, role, apCode);
|
|
477
|
-
|
|
478
|
-
super.selectAudioTrack(audioTrack, safeMargin);
|
|
491
|
+
return Object.keys(this._audioTracksMap);
|
|
479
492
|
}
|
|
480
493
|
|
|
481
494
|
selectAudioLanguage(language, role) {
|
|
482
|
-
sdkLogger.log("
|
|
483
|
-
|
|
495
|
+
sdkLogger.log("Selecting audio language:", language, "with role: ", role);
|
|
496
|
+
if (this._audioTracksMap[language]) {
|
|
497
|
+
remotePlayer.selectAudioTrack(this._audioTracksMap[language]);
|
|
498
|
+
} else {
|
|
499
|
+
sdkLogger.warn(`Language ${language} not found in audio tracks map`);
|
|
500
|
+
}
|
|
484
501
|
super.selectAudioLanguage(language, role);
|
|
485
502
|
}
|
|
486
503
|
|
|
487
|
-
selectTextTrack(textTrack) {
|
|
488
|
-
const textId = textTrack.id;
|
|
489
|
-
const textLang = textTrack.language;
|
|
490
|
-
const role = Array.isArray(textTrack.roles) && textTrack.roles.length > 0
|
|
491
|
-
? textTrack.roles[0]
|
|
492
|
-
: null;
|
|
493
|
-
sdkLogger.log(`selectTextTrack() called: text id ${textId} language ${textLang}, role ${role}, accessibilityPurpose: ${textTrack.accessibilityPurpose}`);
|
|
494
|
-
const apCode = this._getAccessibilityCodeFromPurpose(textTrack.accessibilityPurpose);
|
|
495
|
-
remotePlayer.selectTextLanguage(textLang, role, apCode);
|
|
496
|
-
|
|
497
|
-
super.selectTextTrack(textTrack);
|
|
498
|
-
}
|
|
499
504
|
selectTextLanguage(language, role) {
|
|
500
|
-
sdkLogger.log("
|
|
501
|
-
|
|
505
|
+
sdkLogger.log("Selecting text language:", language, "with role:", role);
|
|
506
|
+
if (this._textTracksMap[language]) {
|
|
507
|
+
remotePlayer.selectTextTrack(this._textTracksMap[language]);
|
|
508
|
+
} else {
|
|
509
|
+
sdkLogger.warn(`Language ${language} not found in text tracks map`);
|
|
510
|
+
}
|
|
502
511
|
super.selectTextLanguage(language, role);
|
|
503
512
|
}
|
|
504
513
|
|
|
@@ -725,6 +734,7 @@ export class SenzaShakaPlayer extends SenzaShakaInterface {
|
|
|
725
734
|
};
|
|
726
735
|
|
|
727
736
|
if (!this.isInRemotePlayback || remotePlayer.getAssetUri() !== url) {
|
|
737
|
+
this._audioTracksMap = {};
|
|
728
738
|
this._videoTracksMap = {};
|
|
729
739
|
try {
|
|
730
740
|
if (this.remotePlayer.getLoadMode() === this.remotePlayer.LoadMode.UNLOADING) {
|
|
@@ -779,32 +789,6 @@ export class SenzaShakaPlayer extends SenzaShakaInterface {
|
|
|
779
789
|
}
|
|
780
790
|
}
|
|
781
791
|
|
|
782
|
-
/**
|
|
783
|
-
* Returns accessibility code of Shaka's accessibility purpose string
|
|
784
|
-
* @param {string} purpose
|
|
785
|
-
* @returns {null|string}
|
|
786
|
-
* @private
|
|
787
|
-
*/
|
|
788
|
-
_getAccessibilityCodeFromPurpose(purpose) {
|
|
789
|
-
switch (purpose) {
|
|
790
|
-
case shakaDebug.media.ManifestParser.AccessibilityPurpose.VISUALLY_IMPAIRED:
|
|
791
|
-
return remotePlayer.AccessibilityPurposeCode.VISUALLY_IMPAIRED;
|
|
792
|
-
case shakaDebug.media.ManifestParser.AccessibilityPurpose.HARD_OF_HEARING:
|
|
793
|
-
return remotePlayer.AccessibilityPurposeCode.HARD_OF_HEARING;
|
|
794
|
-
case shakaDebug.media.ManifestParser.AccessibilityPurpose.SPOKEN_SUBTITLES:
|
|
795
|
-
return remotePlayer.AccessibilityPurposeCode.SPOKEN_SUBTITLES;
|
|
796
|
-
case undefined:
|
|
797
|
-
case null:
|
|
798
|
-
case "":
|
|
799
|
-
return remotePlayer.AccessibilityPurposeCode.NONE;
|
|
800
|
-
default:
|
|
801
|
-
sdkLogger.warn(`_getAccessibilityCodeFromPurpose(): unknown accessibilityPurpose ${purpose}`);
|
|
802
|
-
return remotePlayer.AccessibilityPurposeCode.NONE;
|
|
803
|
-
}
|
|
804
|
-
|
|
805
|
-
}
|
|
806
|
-
|
|
807
|
-
|
|
808
792
|
}
|
|
809
793
|
|
|
810
794
|
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,3 +181,209 @@ export const TargetPlayingState = Object.freeze({
|
|
|
163
181
|
PLAYING_UI: "playingUi",
|
|
164
182
|
PLAYING_ABR: "playingAbr"
|
|
165
183
|
});
|
|
184
|
+
|
|
185
|
+
export const iso6393to1 = {
|
|
186
|
+
"aar": "aa",
|
|
187
|
+
"abk": "ab",
|
|
188
|
+
"afr": "af",
|
|
189
|
+
"aka": "ak",
|
|
190
|
+
"alb": "sq",
|
|
191
|
+
"amh": "am",
|
|
192
|
+
"ara": "ar",
|
|
193
|
+
"arg": "an",
|
|
194
|
+
"arm": "hy",
|
|
195
|
+
"asm": "as",
|
|
196
|
+
"ava": "av",
|
|
197
|
+
"ave": "ae",
|
|
198
|
+
"aym": "ay",
|
|
199
|
+
"aze": "az",
|
|
200
|
+
"bak": "ba",
|
|
201
|
+
"bam": "bm",
|
|
202
|
+
"baq": "eu",
|
|
203
|
+
"bel": "be",
|
|
204
|
+
"ben": "bn",
|
|
205
|
+
"bih": "bh",
|
|
206
|
+
"bis": "bi",
|
|
207
|
+
"bod": "bo",
|
|
208
|
+
"bos": "bs",
|
|
209
|
+
"bre": "br",
|
|
210
|
+
"bul": "bg",
|
|
211
|
+
"bur": "my",
|
|
212
|
+
"cat": "ca",
|
|
213
|
+
"ces": "cs",
|
|
214
|
+
"cha": "ch",
|
|
215
|
+
"che": "ce",
|
|
216
|
+
"chi": "zh",
|
|
217
|
+
"chu": "cu",
|
|
218
|
+
"chv": "cv",
|
|
219
|
+
"cor": "kw",
|
|
220
|
+
"cos": "co",
|
|
221
|
+
"cre": "cr",
|
|
222
|
+
"cym": "cy",
|
|
223
|
+
"dan": "da",
|
|
224
|
+
"deu": "de",
|
|
225
|
+
"div": "dv",
|
|
226
|
+
"dut": "nl",
|
|
227
|
+
"dzo": "dz",
|
|
228
|
+
"ell": "el",
|
|
229
|
+
"eng": "en",
|
|
230
|
+
"epo": "eo",
|
|
231
|
+
"est": "et",
|
|
232
|
+
"eus": "eu",
|
|
233
|
+
"ewe": "ee",
|
|
234
|
+
"fao": "fo",
|
|
235
|
+
"fas": "fa",
|
|
236
|
+
"fij": "fj",
|
|
237
|
+
"fin": "fi",
|
|
238
|
+
"fra": "fr",
|
|
239
|
+
"fre": "fr",
|
|
240
|
+
"fry": "fy",
|
|
241
|
+
"ful": "ff",
|
|
242
|
+
"geo": "ka",
|
|
243
|
+
"ger": "de",
|
|
244
|
+
"gla": "gd",
|
|
245
|
+
"gle": "ga",
|
|
246
|
+
"glg": "gl",
|
|
247
|
+
"glv": "gv",
|
|
248
|
+
"gre": "el",
|
|
249
|
+
"grn": "gn",
|
|
250
|
+
"guj": "gu",
|
|
251
|
+
"hat": "ht",
|
|
252
|
+
"hau": "ha",
|
|
253
|
+
"heb": "he",
|
|
254
|
+
"her": "hz",
|
|
255
|
+
"hin": "hi",
|
|
256
|
+
"hmo": "ho",
|
|
257
|
+
"hrv": "hr",
|
|
258
|
+
"hun": "hu",
|
|
259
|
+
"hye": "hy",
|
|
260
|
+
"ibo": "ig",
|
|
261
|
+
"ice": "is",
|
|
262
|
+
"ido": "io",
|
|
263
|
+
"iii": "ii",
|
|
264
|
+
"iku": "iu",
|
|
265
|
+
"ile": "ie",
|
|
266
|
+
"ina": "ia",
|
|
267
|
+
"ind": "id",
|
|
268
|
+
"ipk": "ik",
|
|
269
|
+
"isl": "is",
|
|
270
|
+
"ita": "it",
|
|
271
|
+
"jav": "jv",
|
|
272
|
+
"jpn": "ja",
|
|
273
|
+
"kal": "kl",
|
|
274
|
+
"kan": "kn",
|
|
275
|
+
"kas": "ks",
|
|
276
|
+
"kat": "ka",
|
|
277
|
+
"kau": "kr",
|
|
278
|
+
"kaz": "kk",
|
|
279
|
+
"khm": "km",
|
|
280
|
+
"kik": "ki",
|
|
281
|
+
"kin": "rw",
|
|
282
|
+
"kir": "ky",
|
|
283
|
+
"kom": "kv",
|
|
284
|
+
"kon": "kg",
|
|
285
|
+
"kor": "ko",
|
|
286
|
+
"kua": "kj",
|
|
287
|
+
"kur": "ku",
|
|
288
|
+
"lao": "lo",
|
|
289
|
+
"lat": "la",
|
|
290
|
+
"lav": "lv",
|
|
291
|
+
"lim": "li",
|
|
292
|
+
"lin": "ln",
|
|
293
|
+
"lit": "lt",
|
|
294
|
+
"ltz": "lb",
|
|
295
|
+
"lub": "lu",
|
|
296
|
+
"lug": "lg",
|
|
297
|
+
"mac": "mk",
|
|
298
|
+
"mah": "mh",
|
|
299
|
+
"mal": "ml",
|
|
300
|
+
"mao": "mi",
|
|
301
|
+
"mar": "mr",
|
|
302
|
+
"may": "ms",
|
|
303
|
+
"mkd": "mk",
|
|
304
|
+
"mlg": "mg",
|
|
305
|
+
"mlt": "mt",
|
|
306
|
+
"mon": "mn",
|
|
307
|
+
"mri": "mi",
|
|
308
|
+
"msa": "ms",
|
|
309
|
+
"mya": "my",
|
|
310
|
+
"nau": "na",
|
|
311
|
+
"nav": "nv",
|
|
312
|
+
"nbl": "nr",
|
|
313
|
+
"nde": "nd",
|
|
314
|
+
"ndo": "ng",
|
|
315
|
+
"nep": "ne",
|
|
316
|
+
"nld": "nl",
|
|
317
|
+
"nno": "nn",
|
|
318
|
+
"nob": "nb",
|
|
319
|
+
"nor": "no",
|
|
320
|
+
"nya": "ny",
|
|
321
|
+
"oci": "oc",
|
|
322
|
+
"oji": "oj",
|
|
323
|
+
"ori": "or",
|
|
324
|
+
"orm": "om",
|
|
325
|
+
"oss": "os",
|
|
326
|
+
"pan": "pa",
|
|
327
|
+
"per": "fa",
|
|
328
|
+
"pli": "pi",
|
|
329
|
+
"pol": "pl",
|
|
330
|
+
"por": "pt",
|
|
331
|
+
"pus": "ps",
|
|
332
|
+
"que": "qu",
|
|
333
|
+
"roh": "rm",
|
|
334
|
+
"ron": "ro",
|
|
335
|
+
"rum": "ro",
|
|
336
|
+
"run": "rn",
|
|
337
|
+
"rus": "ru",
|
|
338
|
+
"sag": "sg",
|
|
339
|
+
"san": "sa",
|
|
340
|
+
"sin": "si",
|
|
341
|
+
"slk": "sk",
|
|
342
|
+
"slo": "sk",
|
|
343
|
+
"slv": "sl",
|
|
344
|
+
"sme": "se",
|
|
345
|
+
"smo": "sm",
|
|
346
|
+
"sna": "sn",
|
|
347
|
+
"snd": "sd",
|
|
348
|
+
"som": "so",
|
|
349
|
+
"sot": "st",
|
|
350
|
+
"spa": "es",
|
|
351
|
+
"sqi": "sq",
|
|
352
|
+
"srd": "sc",
|
|
353
|
+
"srp": "sr",
|
|
354
|
+
"ssw": "ss",
|
|
355
|
+
"sun": "su",
|
|
356
|
+
"swa": "sw",
|
|
357
|
+
"swe": "sv",
|
|
358
|
+
"tah": "ty",
|
|
359
|
+
"tam": "ta",
|
|
360
|
+
"tat": "tt",
|
|
361
|
+
"tel": "te",
|
|
362
|
+
"tgk": "tg",
|
|
363
|
+
"tgl": "tl",
|
|
364
|
+
"tha": "th",
|
|
365
|
+
"tib": "bo",
|
|
366
|
+
"tir": "ti",
|
|
367
|
+
"ton": "to",
|
|
368
|
+
"tsn": "tn",
|
|
369
|
+
"tso": "ts",
|
|
370
|
+
"tuk": "tk",
|
|
371
|
+
"tur": "tr",
|
|
372
|
+
"twi": "tw",
|
|
373
|
+
"uig": "ug",
|
|
374
|
+
"ukr": "uk",
|
|
375
|
+
"urd": "ur",
|
|
376
|
+
"uzb": "uz",
|
|
377
|
+
"ven": "ve",
|
|
378
|
+
"vie": "vi",
|
|
379
|
+
"vol": "vo",
|
|
380
|
+
"wel": "cy",
|
|
381
|
+
"wln": "wa",
|
|
382
|
+
"wol": "wo",
|
|
383
|
+
"xho": "xh",
|
|
384
|
+
"yid": "yi",
|
|
385
|
+
"yor": "yo",
|
|
386
|
+
"zha": "za",
|
|
387
|
+
"zho": "zh",
|
|
388
|
+
"zul": "zu"
|
|
389
|
+
};
|
|
@@ -16,7 +16,7 @@ export class DeviceManager extends EventTarget {
|
|
|
16
16
|
* @property {string} DeviceInfo.connectionType The type of device used during the current connection. Possible values are "device" which mean real device, "simulator" - simulated device - that used during development.
|
|
17
17
|
*/
|
|
18
18
|
get deviceInfo() {
|
|
19
|
-
sdkLogger.log("
|
|
19
|
+
sdkLogger.log("get of deviceInfo running locally, returning dummy info");
|
|
20
20
|
return {
|
|
21
21
|
deviceId: "123456789",
|
|
22
22
|
modelNumber: "ABC",
|
|
@@ -217,21 +217,6 @@ 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
|
-
|
|
235
220
|
/** get the player configuration.
|
|
236
221
|
* @returns {Config}
|
|
237
222
|
* */
|
|
@@ -343,13 +328,10 @@ class RemotePlayer extends EventTarget {
|
|
|
343
328
|
return this.LoadMode.NOT_LOADED;
|
|
344
329
|
}
|
|
345
330
|
|
|
346
|
-
|
|
347
331
|
/**
|
|
348
332
|
* @typedef {Object} TextTrack
|
|
349
333
|
* @property {string} id - A unique ID for the track
|
|
350
334
|
* @property {string} lang - The track's language
|
|
351
|
-
* @property {string[]} roles - The track's roles
|
|
352
|
-
* @property {string=} accessibilityPurpose - The track's accessibilityPurpose code
|
|
353
335
|
* @property {boolean} selected - Whether the track is selected
|
|
354
336
|
* @property {boolean} autoTranslate - (Optional) Whether the track is an auto-translated language
|
|
355
337
|
*/
|
|
@@ -371,8 +353,6 @@ class RemotePlayer extends EventTarget {
|
|
|
371
353
|
* @typedef {Object} AudioTrack
|
|
372
354
|
* @property {string} id - A unique ID for the track
|
|
373
355
|
* @property {string} lang - The track's language
|
|
374
|
-
* @property {string[]} roles - The track's roles
|
|
375
|
-
* @property {string=} accessibilityPurpose - The track's accessibilityPurpose code
|
|
376
356
|
* @property {boolean} selected - Whether the track is selected
|
|
377
357
|
*/
|
|
378
358
|
/** Get all the audio tracks.
|
|
@@ -397,21 +377,10 @@ class RemotePlayer extends EventTarget {
|
|
|
397
377
|
return noop("RemotePlayer.selectAudioTrack", audioTrackId);
|
|
398
378
|
}
|
|
399
379
|
|
|
400
|
-
/**
|
|
401
|
-
* Tf exact track match - Best track will be selected by the internal system
|
|
402
|
-
* @param {string} language - The language of the track to select.
|
|
403
|
-
* @param {string=} role - The role of the track to select.
|
|
404
|
-
* @param {AccessibilityPurposeCode=} accessibilityPurposeCode - The accessibilityPurposeCode of the track to select. Based on DASH manifest role "urn:tva:metadata:cs:AudioPurposeCS:2007"
|
|
405
|
-
* @returns {Promise<void>} A Promise that resolves once the selection process is complete.
|
|
406
|
-
**/
|
|
407
|
-
async selectAudioLanguage(language, role="", accessibilityPurposeCode=this.AccessibilityPurposeCode.NONE) {
|
|
408
|
-
return noop("RemotePlayer.selectAudioLanguage", language, role, accessibilityPurposeCode);
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
/** Select a text track based on given language, role and accessibility.
|
|
380
|
+
/** Select a specific text (subtitle) track.
|
|
412
381
|
* Track id should come from a call to getTextTracks.
|
|
413
382
|
* If no tracks exist - this is a no-op.
|
|
414
|
-
*
|
|
383
|
+
* If the id does not match the id of any of the existing tracks - this is a no-op.
|
|
415
384
|
* @param {string} textTrackId - The ID of the text track to select.
|
|
416
385
|
* @returns {Promise<void>} A Promise that resolves once the selection process is complete.
|
|
417
386
|
* @throws {RemotePlayerError} If the player is not initialized or not loaded.
|
|
@@ -420,16 +389,6 @@ class RemotePlayer extends EventTarget {
|
|
|
420
389
|
return noop("RemotePlayer.selectTextTrack", textTrackId);
|
|
421
390
|
}
|
|
422
391
|
|
|
423
|
-
/** Selects a text track based on given language, role and accessibility.
|
|
424
|
-
* Tf exact track match - Best track will be selected by the internal system
|
|
425
|
-
* @param {string} language - The language of the track to select.
|
|
426
|
-
* @param {string=} role - The role of the track to select.
|
|
427
|
-
* @param {AccessibilityPurposeCode=} accessibilityPurposeCode - The accessibilityPurposeCode of the track to select. Based on DASH manifest role "urn:tva:metadata:cs:AudioPurposeCS:2007"
|
|
428
|
-
* @returns {Promise<void>} A Promise that resolves once the selection process is complete.
|
|
429
|
-
**/
|
|
430
|
-
async selectTextLanguage(language, role="", accessibilityPurposeCode=this.AccessibilityPurposeCode.NONE) {
|
|
431
|
-
return noop("RemotePlayer.selectTextLanguage", language, role, accessibilityPurposeCode);
|
|
432
|
-
}
|
|
433
392
|
/**
|
|
434
393
|
* Enable or disable the subtitles.
|
|
435
394
|
* If the player is in an unloaded state, the request will be applied next time content is played.
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as shaka from "shaka-player";
|
|
2
|
+
import shakaUI from "shaka-player/dist/shaka-player.ui.js";
|
|
2
3
|
|
|
3
4
|
// Define custom error category
|
|
4
5
|
shaka.util.Error.Category.SENZA_PLAYER_ERROR = 50;
|
|
@@ -6,7 +7,7 @@ shaka.util.Error.Code.SENZA_PLAYER_ERROR = 10500;
|
|
|
6
7
|
|
|
7
8
|
// Copy the shaka module and replace the Player class with SenzaShakaPlayer
|
|
8
9
|
// if we don't Copy the shaka module, the Player class will be replaced for all the other modules that import shaka
|
|
9
|
-
const senzaShaka = { ...shaka };
|
|
10
|
+
const senzaShaka = { ...shaka, ui: shakaUI.ui };
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
/**
|
package/src/interface/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = "4.
|
|
1
|
+
export const version = "4.4.1-4ca75a1.0";
|