senza-sdk 4.2.51-90a45e8.0 → 4.2.51-9731116.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/package.json +1 -1
- package/src/remotePlayer.js +298 -5
- package/src/utils.js +18 -0
package/package.json
CHANGED
package/src/remotePlayer.js
CHANGED
|
@@ -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
|
-
|
|
1238
|
+
this._pendingAudioLanguage = audioTrackId;
|
|
1239
|
+
return this._atomicSetAudioLanguage();
|
|
1213
1240
|
}
|
|
1214
1241
|
}
|
|
1215
1242
|
|
|
@@ -1271,7 +1298,6 @@ class RemotePlayer extends EventTarget {
|
|
|
1271
1298
|
action: "setAudioLanguage",
|
|
1272
1299
|
fcid: FCID,
|
|
1273
1300
|
language: audioTrackId,
|
|
1274
|
-
playbackPosition: this.currentTime
|
|
1275
1301
|
};
|
|
1276
1302
|
const request = { target: "TC", waitForResponse: true, message: JSON.stringify(message) };
|
|
1277
1303
|
return new Promise((resolve, reject) => {
|
|
@@ -1303,6 +1329,7 @@ class RemotePlayer extends EventTarget {
|
|
|
1303
1329
|
}, timeout, queryId);
|
|
1304
1330
|
});
|
|
1305
1331
|
}
|
|
1332
|
+
|
|
1306
1333
|
sdkLogger.error("remotePlayer _selectAudioTrackV3: window.cefQuery is undefined");
|
|
1307
1334
|
return Promise.resolve(undefined);
|
|
1308
1335
|
}
|
|
@@ -1346,7 +1373,8 @@ class RemotePlayer extends EventTarget {
|
|
|
1346
1373
|
case 2:
|
|
1347
1374
|
return this._selectTextTrackV2(textTrackId, prevSelectedTextTrack);
|
|
1348
1375
|
default:
|
|
1349
|
-
|
|
1376
|
+
this._pendingSubtitleLanguage = textTrackId;
|
|
1377
|
+
return this._atomicSetSubtitleLanguage();
|
|
1350
1378
|
}
|
|
1351
1379
|
}
|
|
1352
1380
|
|
|
@@ -1408,7 +1436,6 @@ class RemotePlayer extends EventTarget {
|
|
|
1408
1436
|
action: "setSubtitleLanguage",
|
|
1409
1437
|
fcid: FCID,
|
|
1410
1438
|
language: textTrackId,
|
|
1411
|
-
playbackPosition: this.currentTime
|
|
1412
1439
|
};
|
|
1413
1440
|
const request = { target: "TC", waitForResponse: true, message: JSON.stringify(message) };
|
|
1414
1441
|
return new Promise((resolve, reject) => {
|
|
@@ -1673,6 +1700,272 @@ class RemotePlayer extends EventTarget {
|
|
|
1673
1700
|
this._isSeekingByApplication = false;
|
|
1674
1701
|
sdkLogger.info("Seeking: local video element seeking end");
|
|
1675
1702
|
}
|
|
1703
|
+
|
|
1704
|
+
async _stopAudio() {
|
|
1705
|
+
if (window.cefQuery) {
|
|
1706
|
+
if (this._remotePlayerApiVersion >= 2) {
|
|
1707
|
+
return new Promise((resolve, reject) => {
|
|
1708
|
+
const FCID = getFCID();
|
|
1709
|
+
const logger = sdkLogger.withFields({ FCID });
|
|
1710
|
+
logger.log(`remotePlayer _stopAudio: sending stop action remotePlayer._isPlaying=${remotePlayer._isPlaying}`);
|
|
1711
|
+
const message = {
|
|
1712
|
+
type: "remotePlayer.stop",
|
|
1713
|
+
class: "remotePlayer",
|
|
1714
|
+
action: "stop",
|
|
1715
|
+
streamType: StreamType.AUDIO,
|
|
1716
|
+
fcid: FCID
|
|
1717
|
+
};
|
|
1718
|
+
let timerId = 0;
|
|
1719
|
+
const timeBeforeSendingRequest = Date.now();
|
|
1720
|
+
const queryId = window.cefQuery({
|
|
1721
|
+
request: JSON.stringify({ target: "TC", waitForResponse: true, internalAction: "uiActive", message: JSON.stringify(message) }),
|
|
1722
|
+
persistent: false,
|
|
1723
|
+
onSuccess: () => {
|
|
1724
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1725
|
+
logger.withFields({ duration }).log(`stop audio completed successfully after ${duration} ms`);
|
|
1726
|
+
this._inTransition = false;
|
|
1727
|
+
timerId = clearTimer(timerId);
|
|
1728
|
+
resolve(true);
|
|
1729
|
+
},
|
|
1730
|
+
onFailure: (code, msg) => {
|
|
1731
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1732
|
+
logger.withFields({ duration }).log(`stop audio failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
|
|
1733
|
+
this._inTransition = false;
|
|
1734
|
+
timerId = clearTimer(timerId);
|
|
1735
|
+
reject(new SenzaError(code, msg));
|
|
1736
|
+
}
|
|
1737
|
+
});
|
|
1738
|
+
logger.log(`window.cefQuery for stop audio returned query id ${queryId}`);
|
|
1739
|
+
const timeout = this._remotePlayerConfirmationTimeout + 1000;
|
|
1740
|
+
timerId = setTimeout(() => {
|
|
1741
|
+
logger.log(`stop audio reached timeout of ${timeout} ms, canceling query id ${queryId}`);
|
|
1742
|
+
this._inTransition = false;
|
|
1743
|
+
window.cefQueryCancel(queryId);
|
|
1744
|
+
reject(new SenzaError(6000, `stop audio reached timeout of ${timeout} ms`));
|
|
1745
|
+
}, timeout, queryId);
|
|
1746
|
+
});
|
|
1747
|
+
}
|
|
1748
|
+
}
|
|
1749
|
+
|
|
1750
|
+
}
|
|
1751
|
+
|
|
1752
|
+
async _stopSubtitle() {
|
|
1753
|
+
if (window.cefQuery) {
|
|
1754
|
+
if (this._remotePlayerApiVersion >= 2) {
|
|
1755
|
+
return new Promise((resolve, reject) => {
|
|
1756
|
+
const FCID = getFCID();
|
|
1757
|
+
const logger = sdkLogger.withFields({ FCID });
|
|
1758
|
+
logger.log(`remotePlayer _stopSubtitle: sending stop action remotePlayer._isPlaying=${remotePlayer._isPlaying}`);
|
|
1759
|
+
const message = {
|
|
1760
|
+
type: "remotePlayer.stop",
|
|
1761
|
+
class: "remotePlayer",
|
|
1762
|
+
action: "stop",
|
|
1763
|
+
streamType: StreamType.SUBTITLE,
|
|
1764
|
+
fcid: FCID
|
|
1765
|
+
};
|
|
1766
|
+
let timerId = 0;
|
|
1767
|
+
const timeBeforeSendingRequest = Date.now();
|
|
1768
|
+
const queryId = window.cefQuery({
|
|
1769
|
+
request: JSON.stringify({ target: "TC", waitForResponse: true, internalAction: "uiActive", message: JSON.stringify(message) }),
|
|
1770
|
+
persistent: false,
|
|
1771
|
+
onSuccess: () => {
|
|
1772
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1773
|
+
logger.withFields({ duration }).log(`stop subtitle completed successfully after ${duration} ms`);
|
|
1774
|
+
this._inTransition = false;
|
|
1775
|
+
timerId = clearTimer(timerId);
|
|
1776
|
+
resolve(true);
|
|
1777
|
+
},
|
|
1778
|
+
onFailure: (code, msg) => {
|
|
1779
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1780
|
+
logger.withFields({ duration }).log(`stop subtitle failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
|
|
1781
|
+
this._inTransition = false;
|
|
1782
|
+
timerId = clearTimer(timerId);
|
|
1783
|
+
reject(new SenzaError(code, msg));
|
|
1784
|
+
}
|
|
1785
|
+
});
|
|
1786
|
+
logger.log(`window.cefQuery for stop returned query id ${queryId}`);
|
|
1787
|
+
const timeout = this._remotePlayerConfirmationTimeout + 1000;
|
|
1788
|
+
timerId = setTimeout(() => {
|
|
1789
|
+
logger.log(`stop reached timeout of ${timeout} ms, canceling query id ${queryId}`);
|
|
1790
|
+
window.cefQueryCancel(queryId);
|
|
1791
|
+
reject(new SenzaError(6000, `stop reached timeout of ${timeout} ms`));
|
|
1792
|
+
}, timeout, queryId);
|
|
1793
|
+
});
|
|
1794
|
+
}
|
|
1795
|
+
}
|
|
1796
|
+
|
|
1797
|
+
}
|
|
1798
|
+
|
|
1799
|
+
async _playSubtitle() {
|
|
1800
|
+
if (window.cefQuery) {
|
|
1801
|
+
if (this._remotePlayerApiVersion >= 2) {
|
|
1802
|
+
return new Promise((resolve, reject) => {
|
|
1803
|
+
const FCID = getFCID();
|
|
1804
|
+
const logger = sdkLogger.withFields({ FCID });
|
|
1805
|
+
logger.log("remotePlayer play subtitle: sending play action");
|
|
1806
|
+
const configuration = remotePlayer.getConfiguration();
|
|
1807
|
+
const subtitlesLanguage = remotePlayer.textTrackVisibility && (remotePlayer._selectedSubtitlesTrack || configuration.preferredSubtitlesLanguage) || "";
|
|
1808
|
+
let request;
|
|
1809
|
+
const message = {
|
|
1810
|
+
action: "play",
|
|
1811
|
+
fcid: FCID,
|
|
1812
|
+
subtitlesLanguage
|
|
1813
|
+
};
|
|
1814
|
+
if (this._remotePlayerApiVersion >= 2) {
|
|
1815
|
+
message.type = "remotePlayer.play";
|
|
1816
|
+
message.class = "remotePlayer";
|
|
1817
|
+
message.streamType = StreamType.SUBTITLE;
|
|
1818
|
+
request = {
|
|
1819
|
+
target: "TC",
|
|
1820
|
+
waitForResponse: true,
|
|
1821
|
+
internalAction: "uiExit",
|
|
1822
|
+
message: JSON.stringify(message)
|
|
1823
|
+
};
|
|
1824
|
+
} else {
|
|
1825
|
+
request = message;
|
|
1826
|
+
}
|
|
1827
|
+
let timerId = 0;
|
|
1828
|
+
const timeBeforeSendingRequest = Date.now();
|
|
1829
|
+
const queryId = window.cefQuery({
|
|
1830
|
+
request: JSON.stringify(request),
|
|
1831
|
+
persistent: false,
|
|
1832
|
+
onSuccess: () => {
|
|
1833
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1834
|
+
logger.withFields({ duration }).log(`play subtitle completed successfully after ${duration} ms`);
|
|
1835
|
+
this._inTransition = false;
|
|
1836
|
+
timerId = clearTimer(timerId);
|
|
1837
|
+
resolve();
|
|
1838
|
+
},
|
|
1839
|
+
onFailure: (code, msg) => {
|
|
1840
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1841
|
+
logger.withFields({ duration }).log(`play subtitle failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
|
|
1842
|
+
this._inTransition = false;
|
|
1843
|
+
timerId = clearTimer(timerId);
|
|
1844
|
+
reject(new SenzaError(code, msg));
|
|
1845
|
+
}
|
|
1846
|
+
});
|
|
1847
|
+
if (this._remotePlayerApiVersion >= 2) {
|
|
1848
|
+
logger.log(`window.cefQuery for play subtitle returned query id ${queryId}`);
|
|
1849
|
+
const timeout = this._remotePlayerConfirmationTimeout + 1000;
|
|
1850
|
+
timerId = setTimeout(() => {
|
|
1851
|
+
logger.log(`play subtitle reached timeout of ${timeout} ms, canceling query id ${queryId}`);
|
|
1852
|
+
this._inTransition = false;
|
|
1853
|
+
window.cefQueryCancel(queryId);
|
|
1854
|
+
reject(new SenzaError(6000, `play subtitle reached timeout of ${timeout} ms`));
|
|
1855
|
+
}, timeout, queryId);
|
|
1856
|
+
}
|
|
1857
|
+
});
|
|
1858
|
+
}
|
|
1859
|
+
|
|
1860
|
+
}
|
|
1861
|
+
sdkLogger.error("remotePlayer play subtitle: window.cefQuery is undefined");
|
|
1862
|
+
return Promise.resolve(undefined);
|
|
1863
|
+
}
|
|
1864
|
+
|
|
1865
|
+
async _atomicSetSubtitleLanguage() {
|
|
1866
|
+
sdkLogger.info("SetSubtitleLanguage: local video element set start while isPLaying=", this._isPlaying);
|
|
1867
|
+
|
|
1868
|
+
this._targetSetSubtitlePlayingState = this._isPlaying ? TargetPlayingState.PLAYING_UI : TargetPlayingState.PAUSED;
|
|
1869
|
+
this._abortSetSubtitleLanguage = false;
|
|
1870
|
+
this._isSetSubtitleByApplication = true;
|
|
1871
|
+
|
|
1872
|
+
let state = SetSubtitleLanguageState.INIT;
|
|
1873
|
+
|
|
1874
|
+
let previousPendingSubtitleLanguage = this._pendingSubtitleLanguage;
|
|
1875
|
+
let initialSubtitleLanguage = this._pendingSubtitleLanguage;
|
|
1876
|
+
let res;
|
|
1877
|
+
|
|
1878
|
+
while (!this._abortSetSubtitleLanguage && state !== SetSubtitleLanguageState.DONE) {
|
|
1879
|
+
try {
|
|
1880
|
+
switch(state) {
|
|
1881
|
+
case SetSubtitleLanguageState.INIT:
|
|
1882
|
+
state = this._isPlaying ? SetSubtitleLanguageState.STOPPED : SetSubtitleLanguageState.SET;
|
|
1883
|
+
break;
|
|
1884
|
+
case SetSubtitleLanguageState.STOPPED:
|
|
1885
|
+
sdkLogger.info("BEFORE STOP BEFORE SET SUBTITLE");
|
|
1886
|
+
await this._stopSubtitle();
|
|
1887
|
+
sdkLogger.info("AFTER STOP BEFORE SET SUBTITLE");
|
|
1888
|
+
state = SetSubtitleLanguageState.SET;
|
|
1889
|
+
break;
|
|
1890
|
+
case SetSubtitleLanguageState.SET:
|
|
1891
|
+
initialSubtitleLanguage = this._pendingSubtitleLanguage;
|
|
1892
|
+
previousPendingSubtitleLanguage = this._selectedSubtitleTrack;
|
|
1893
|
+
res = await this._selectTextTrackV3(initialSubtitleLanguage, previousPendingSubtitleLanguage);
|
|
1894
|
+
sdkLogger.info("BEFORE PLAY AFTER SET SUBTITLE 1");
|
|
1895
|
+
state = SetSubtitleLanguageState.DONE;
|
|
1896
|
+
break;
|
|
1897
|
+
}
|
|
1898
|
+
} catch (error) {
|
|
1899
|
+
sdkLogger.info(`Error during set subtitle process: ${error.message}`);
|
|
1900
|
+
state = SetSubtitleLanguageState.DONE;
|
|
1901
|
+
res = Promise.reject(error);
|
|
1902
|
+
}
|
|
1903
|
+
}
|
|
1904
|
+
|
|
1905
|
+
if (!this._abortSetSubtitleLanguage) {
|
|
1906
|
+
sdkLogger.info("TARGET PLAYING STATE", this._targetSetSubtitlePlayingState);
|
|
1907
|
+
sdkLogger.info("TEXT TRACK VISIBILITY", this._textTrackVisibility);
|
|
1908
|
+
if (this._targetSetSubtitlePlayingState === TargetPlayingState.PLAYING_UI) {
|
|
1909
|
+
sdkLogger.info("BEFORE PLAY AFTER SET SUBTITLE 2");
|
|
1910
|
+
this._playSubtitle();
|
|
1911
|
+
}
|
|
1912
|
+
}
|
|
1913
|
+
this._isSetSubtitleByApplication = false;
|
|
1914
|
+
sdkLogger.info("SetSubtitleLanguage: local video element set subtitle end");
|
|
1915
|
+
return res
|
|
1916
|
+
}
|
|
1917
|
+
|
|
1918
|
+
async _atomicSetAudioLanguage() {
|
|
1919
|
+
sdkLogger.info("SetAudioLanguage: local video element set start while isPLaying=", this._isPlaying);
|
|
1920
|
+
|
|
1921
|
+
this._targetSetAudioPlayingState = this._isPlaying ? TargetPlayingState.PLAYING_UI : TargetPlayingState.PAUSED;
|
|
1922
|
+
this._abortSetAudioLanguage = false;
|
|
1923
|
+
this._isSetAudioByApplication = true;
|
|
1924
|
+
|
|
1925
|
+
let state = SetAudioLanguageState.INIT;
|
|
1926
|
+
|
|
1927
|
+
let previousPendingAudioLanguage = this._pendingAudioLanguage;
|
|
1928
|
+
let initialAudioLanguage= this._pendingAudioLanguage;
|
|
1929
|
+
let res;
|
|
1930
|
+
|
|
1931
|
+
while (!this._abortSetAudioLanguage && state !== SetAudioLanguageState.DONE) {
|
|
1932
|
+
try {
|
|
1933
|
+
|
|
1934
|
+
switch(state) {
|
|
1935
|
+
case SetAudioLanguageState.INIT:
|
|
1936
|
+
state = this._isPlaying ? SetAudioLanguageState.STOPPED : SetAudioLanguageState.SET;
|
|
1937
|
+
break;
|
|
1938
|
+
case SetAudioLanguageState.STOPPED:
|
|
1939
|
+
await this._stopAudio();
|
|
1940
|
+
state = SetAudioLanguageState.SET;
|
|
1941
|
+
break;
|
|
1942
|
+
case SetAudioLanguageState.SET:
|
|
1943
|
+
initialAudioLanguage = this._pendingAudioLanguage;
|
|
1944
|
+
previousPendingAudioLanguage = this._selectedAudioTrack;
|
|
1945
|
+
res = await this._selectAudioTrackV3(initialAudioLanguage, previousPendingAudioLanguage);
|
|
1946
|
+
sdkLogger.info("BEFORE PLAY AFTER SET AUDIO 1");
|
|
1947
|
+
state = SetAudioLanguageState.DONE;
|
|
1948
|
+
break;
|
|
1949
|
+
}
|
|
1950
|
+
} catch (error) {
|
|
1951
|
+
sdkLogger.info(`Error during set audio process: ${error.message}`);
|
|
1952
|
+
state = SetAudioLanguageState.DONE;
|
|
1953
|
+
res = Promise.reject(error);
|
|
1954
|
+
}
|
|
1955
|
+
}
|
|
1956
|
+
|
|
1957
|
+
if (!this._abortSetAudioLanguage) {
|
|
1958
|
+
sdkLogger.info("TARGET PLAYING STATE", this._targetSetAudioPlayingState);
|
|
1959
|
+
if (this._targetSetAudioPlayingState === TargetPlayingState.PLAYING_UI) {
|
|
1960
|
+
sdkLogger.info("BEFORE PLAY AFTER SET AUDIO 2");
|
|
1961
|
+
this._play();
|
|
1962
|
+
}
|
|
1963
|
+
}
|
|
1964
|
+
|
|
1965
|
+
this._isSetAudioByApplication = false;
|
|
1966
|
+
sdkLogger.info("SetAudioLanguage: local video element set audio end");
|
|
1967
|
+
return res
|
|
1968
|
+
}
|
|
1676
1969
|
}
|
|
1677
1970
|
/**
|
|
1678
1971
|
*
|
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",
|