senza-sdk 4.2.51-44b32dd.0 → 4.2.51-60558b6.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "senza-sdk",
3
- "version": "4.2.51-44b32dd.0",
3
+ "version": "4.2.51-60558b6.0",
4
4
  "main": "./src/api.js",
5
5
  "description": "API for Senza application",
6
6
  "license": "MIT",
@@ -9,7 +9,9 @@ import {
9
9
  SeekState,
10
10
  TargetPlayingState,
11
11
  isSubtitlesTranslationAllowed,
12
- isSubtitlesTranslationPattern
12
+ isSubtitlesTranslationPattern,
13
+ SetAudioLanguageState,
14
+ SetSubtitleLanguageState
13
15
  } from "./utils";
14
16
  import { lifecycle } from "./lifecycle";
15
17
  import { writeLicenseResponse } from "./api";
@@ -890,6 +892,8 @@ class RemotePlayer extends EventTarget {
890
892
  if (this._loadMode === this.LoadMode.LOADING || this._loadMode === this.LoadMode.UNLOADING) {
891
893
  throw new RemotePlayerError(6501, "Cannot call load() while previous load/unload is still in progress");
892
894
  }
895
+ this._abortSetAudioLanguage = true;
896
+ this._abortSetSubtitleLanguage = true;
893
897
  this._abortSeeking = true;
894
898
  if (reset) {
895
899
  this._reset();
@@ -1063,6 +1067,18 @@ class RemotePlayer extends EventTarget {
1063
1067
  }
1064
1068
  }
1065
1069
 
1070
+ if (this._isSetAudioByApplication) {
1071
+ sdkLogger.info("application requesting play during setAudioLanguage");
1072
+ this._targetSetAudioPlayingState = TargetPlayingState.PLAYING_UI;
1073
+ return Promise.resolve(true);
1074
+ }
1075
+
1076
+ if (this._isSetSubtitleByApplication) {
1077
+ sdkLogger.info("application requesting play during setSubtitleLanguage");
1078
+ this._targetSetSubtitlePlayingState = TargetPlayingState.PLAYING_UI;
1079
+ return Promise.resolve(true);
1080
+ }
1081
+
1066
1082
  // If seeking in progress, wait for seek to complete before playing
1067
1083
  if (this._isSeekingByApplication) {
1068
1084
  sdkLogger.info("application requesting play during seek");
@@ -1102,6 +1118,16 @@ class RemotePlayer extends EventTarget {
1102
1118
  this._targetSeekPlayingState = TargetPlayingState.PAUSED;
1103
1119
  return Promise.resolve(true);
1104
1120
  }
1121
+ if (this._isSetAudioByApplication) {
1122
+ sdkLogger.info("application requesting pause during setAudioLanguage");
1123
+ this._targetSetAudioPlayingState = TargetPlayingState.PAUSED;
1124
+ return Promise.resolve(true);
1125
+ }
1126
+ if (this._isSetSubtitleByApplication) {
1127
+ sdkLogger.info("application requesting pause during setSubtitleLanguage");
1128
+ this._targetSetSubtitlePlayingState = TargetPlayingState.PAUSED;
1129
+ return Promise.resolve(true);
1130
+ }
1105
1131
  return this._pause();
1106
1132
  }
1107
1133
 
@@ -1209,7 +1235,8 @@ class RemotePlayer extends EventTarget {
1209
1235
  case 2:
1210
1236
  return this._selectAudioTrackV2(audioTrackId, prevSelectedAudioTrack);
1211
1237
  default:
1212
- return this._selectAudioTrackV3(audioTrackId, prevSelectedAudioTrack);
1238
+ this._pendingAudioLanguage = audioTrackId;
1239
+ return this._atomicSetAudioLanguage();
1213
1240
  }
1214
1241
  }
1215
1242
 
@@ -1346,7 +1373,8 @@ class RemotePlayer extends EventTarget {
1346
1373
  case 2:
1347
1374
  return this._selectTextTrackV2(textTrackId, prevSelectedTextTrack);
1348
1375
  default:
1349
- return this._selectTextTrackV3(textTrackId, prevSelectedTextTrack);
1376
+ this._pendingSubtitleLanguage = textTrackId;
1377
+ return this._atomicSetSubtitleLanguage();
1350
1378
  }
1351
1379
  }
1352
1380
 
@@ -1672,6 +1700,118 @@ class RemotePlayer extends EventTarget {
1672
1700
  this._isSeekingByApplication = false;
1673
1701
  sdkLogger.info("Seeking: local video element seeking end");
1674
1702
  }
1703
+
1704
+ async _atomicSetSubtitleLanguage() {
1705
+ sdkLogger.info("SetSubtitleLanguage: local video element set start while isPLaying=", this._isPlaying);
1706
+
1707
+ this._targetSetSubtitlePlayingState = this._isPlaying ? TargetPlayingState.PLAYING_UI : TargetPlayingState.PAUSED;
1708
+ this._abortSetSubtitleLanguage = false;
1709
+ this._isSetSubtitleByApplication = true;
1710
+
1711
+ let state = SetSubtitleLanguageState.INIT;
1712
+
1713
+ let previousPendingSubtitleLanguage = this._pendingSubtitleLanguage;
1714
+ let initialSubtitleLanguage= this._pendingSubtitleLanguage;
1715
+ let res;
1716
+
1717
+ while (!this._abortSetSubtitleLanguage && state !== SetSubtitleLanguageState.DONE) {
1718
+ try {
1719
+ // TODO - Implement the logic for setting audio language
1720
+ switch(state) {
1721
+ case SetSubtitleLanguageState.INIT:
1722
+ state = this._isPlaying ? SetSubtitleLanguageState.STOPPED : SetSubtitleLanguageState.SET;
1723
+ break;
1724
+ case SetSubtitleLanguageState.STOPPED:
1725
+ sdkLogger.error("BEFORE STOP BEFORE SET SUBTITLE");
1726
+ await lifecycle.moveToForeground();
1727
+ sdkLogger.error("AFTER STOP BEFORE SET SUBTITLE");
1728
+ state = SetSubtitleLanguageState.SET;
1729
+ break;
1730
+ case SetSubtitleLanguageState.SET:
1731
+ initialSubtitleLanguage = this._pendingSubtitleLanguage;
1732
+ previousPendingSubtitleLanguage = this._selectedSubtitleTrack;
1733
+ res = await this._selectTextTrackV3(initialSubtitleLanguage, previousPendingSubtitleLanguage);
1734
+ sdkLogger.error("BEFORE PLAY AFTER SET SUBTITLE 1");
1735
+ state = SetSubtitleLanguageState.DONE;
1736
+ break;
1737
+ }
1738
+ } catch (error) {
1739
+ sdkLogger.error(`Error during set subtitle process: ${error.message}`);
1740
+ state = SetSubtitleLanguageState.DONE;
1741
+ res = Promise.reject(error);
1742
+ } finally {
1743
+ sdkLogger.error("ABORT SET SUBTITLE", this._abortSetSubtitleLanguage);
1744
+ if (!this._abortSetSubtitleLanguage) {
1745
+ sdkLogger.error("TARGET PLAYING STATE", this._targetSetSubtitlePlayingState);
1746
+ if (this._targetSetSubtitlePlayingState === TargetPlayingState.PLAYING_UI) {
1747
+ sdkLogger.error("BEFORE PLAY AFTER SET SUBTITLE 2");
1748
+ this._play();
1749
+ } else if (this._targetSetSubtitlePlayingState === TargetPlayingState.PLAYING_ABR) {
1750
+ sdkLogger.error("BEFORE MOVE_TO_BACKGROUND AFTER SET SUBTITLE");
1751
+ lifecycle._moveToBackground();
1752
+ }
1753
+ }
1754
+ this._isSetSubtitleByApplication = false;
1755
+ sdkLogger.info("SetSubtitleLanguage: local video element set subtitle end");
1756
+ }
1757
+ }
1758
+ return res
1759
+ }
1760
+
1761
+ async _atomicSetAudioLanguage() {
1762
+ sdkLogger.info("SetAudioLanguage: local video element set start while isPLaying=", this._isPlaying);
1763
+
1764
+ this._targetSetAudioPlayingState = this._isPlaying ? TargetPlayingState.PLAYING_UI : TargetPlayingState.PAUSED;
1765
+ this._abortSetAudioLanguage = false;
1766
+ this._isSetAudioByApplication = true;
1767
+
1768
+ let state = SetAudioLanguageState.INIT;
1769
+
1770
+ let previousPendingAudioLanguage = this._pendingAudioLanguage;
1771
+ let initialAudioLanguage= this._pendingAudioLanguage;
1772
+ let res;
1773
+
1774
+ while (!this._abortSetAudioLanguage && state !== SetAudioLanguageState.DONE) {
1775
+ try {
1776
+ // TODO - Implement the logic for setting audio language
1777
+ switch(state) {
1778
+ case SetAudioLanguageState.INIT:
1779
+ state = this._isPlaying ? SetAudioLanguageState.STOPPED : SetAudioLanguageState.SET;
1780
+ break;
1781
+ case SetAudioLanguageState.STOPPED:
1782
+ await lifecycle.moveToForeground();
1783
+ state = SetAudioLanguageState.SET;
1784
+ break;
1785
+ case SetAudioLanguageState.SET:
1786
+ initialAudioLanguage = this._pendingAudioLanguage;
1787
+ previousPendingAudioLanguage = this._selectedAudioTrack;
1788
+ res = await this._selectAudioTrackV3(initialAudioLanguage, previousPendingAudioLanguage);
1789
+ sdkLogger.error("BEFORE PLAY AFTER SET AUDIO 1");
1790
+ state = SetAudioLanguageState.DONE;
1791
+ break;
1792
+ }
1793
+ } catch (error) {
1794
+ sdkLogger.error(`Error during set audio process: ${error.message}`);
1795
+ state = SetAudioLanguageState.DONE;
1796
+ res = Promise.reject(error);
1797
+ } finally {
1798
+ sdkLogger.error("ABORT SET AUDIO", this._abortSetAudioLanguage);
1799
+ if (!this._abortSetAudioLanguage) {
1800
+ sdkLogger.error("TARGET PLAYING STATE", this._targetSetAudioPlayingState);
1801
+ if (this._targetSetAudioPlayingState === TargetPlayingState.PLAYING_UI) {
1802
+ sdkLogger.error("BEFORE PLAY AFTER SET AUDIO 2");
1803
+ this._play();
1804
+ } else if (this._targetSetAudioPlayingState === TargetPlayingState.PLAYING_ABR) {
1805
+ sdkLogger.error("BEFORE MOVE_TO_BACKGROUND AFTER SET AUDIO");
1806
+ lifecycle._moveToBackground();
1807
+ }
1808
+ }
1809
+ this._isSetAudioByApplication = false;
1810
+ sdkLogger.info("SetAudioLanguage: local video element set audio end");
1811
+ }
1812
+ }
1813
+ return res
1814
+ }
1675
1815
  }
1676
1816
  /**
1677
1817
  *
package/src/utils.js CHANGED
@@ -155,6 +155,24 @@ export const TargetPlayingState = Object.freeze({
155
155
  PLAYING_ABR: "playingAbr"
156
156
  });
157
157
 
158
+ export const SetAudioLanguageState = Object.freeze({
159
+ INIT: "init",
160
+ STOPPED: "stopped",
161
+ SET: "set",
162
+ MULTI_SET: "multiSet",
163
+ WAITING: "waiting",
164
+ DONE: "done"
165
+ });
166
+
167
+ export const SetSubtitleLanguageState = Object.freeze({
168
+ INIT: "init",
169
+ STOPPED: "stopped",
170
+ SET: "set",
171
+ MULTI_SET: "multiSet",
172
+ WAITING: "waiting",
173
+ DONE: "done"
174
+ });
175
+
158
176
  export const iso6393to1 = {
159
177
  "aar": "aa",
160
178
  "abk": "ab",