senza-sdk 4.2.51-9f586bc.0 → 4.2.51-b73b1af.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 +218 -20
package/package.json
CHANGED
package/src/remotePlayer.js
CHANGED
|
@@ -1067,6 +1067,18 @@ class RemotePlayer extends EventTarget {
|
|
|
1067
1067
|
}
|
|
1068
1068
|
}
|
|
1069
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
|
+
|
|
1070
1082
|
// If seeking in progress, wait for seek to complete before playing
|
|
1071
1083
|
if (this._isSeekingByApplication) {
|
|
1072
1084
|
sdkLogger.info("application requesting play during seek");
|
|
@@ -1106,6 +1118,16 @@ class RemotePlayer extends EventTarget {
|
|
|
1106
1118
|
this._targetSeekPlayingState = TargetPlayingState.PAUSED;
|
|
1107
1119
|
return Promise.resolve(true);
|
|
1108
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
|
+
}
|
|
1109
1131
|
return this._pause();
|
|
1110
1132
|
}
|
|
1111
1133
|
|
|
@@ -1679,33 +1701,197 @@ class RemotePlayer extends EventTarget {
|
|
|
1679
1701
|
sdkLogger.info("Seeking: local video element seeking end");
|
|
1680
1702
|
}
|
|
1681
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
|
+
|
|
1682
1865
|
async _atomicSetSubtitleLanguage() {
|
|
1683
1866
|
sdkLogger.info("SetSubtitleLanguage: local video element set start while isPLaying=", this._isPlaying);
|
|
1684
1867
|
|
|
1868
|
+
this._targetSetSubtitlePlayingState = lifecycle._state === lifecycle.UiState.BACKGROUND ? TargetPlayingState.PLAYING_ABR : TargetPlayingState.PAUSED;
|
|
1685
1869
|
this._abortSetSubtitleLanguage = false;
|
|
1686
1870
|
this._isSetSubtitleByApplication = true;
|
|
1687
1871
|
|
|
1688
1872
|
let state = SetSubtitleLanguageState.INIT;
|
|
1689
1873
|
|
|
1690
1874
|
let previousPendingSubtitleLanguage = this._pendingSubtitleLanguage;
|
|
1691
|
-
let initialSubtitleLanguage= this._pendingSubtitleLanguage;
|
|
1875
|
+
let initialSubtitleLanguage = this._pendingSubtitleLanguage;
|
|
1692
1876
|
let res;
|
|
1693
|
-
|
|
1877
|
+
|
|
1694
1878
|
while (!this._abortSetSubtitleLanguage && state !== SetSubtitleLanguageState.DONE) {
|
|
1695
1879
|
try {
|
|
1696
|
-
// TODO - Implement the logic for setting audio language
|
|
1697
1880
|
switch(state) {
|
|
1698
1881
|
case SetSubtitleLanguageState.INIT:
|
|
1699
|
-
state =
|
|
1882
|
+
state = lifecycle._state === lifecycle.UiState.BACKGROUND ? SetSubtitleLanguageState.STOPPED : SetSubtitleLanguageState.SET;
|
|
1700
1883
|
break;
|
|
1701
1884
|
case SetSubtitleLanguageState.STOPPED:
|
|
1702
|
-
|
|
1885
|
+
sdkLogger.error("BEFORE STOP BEFORE SET SUBTITLE");
|
|
1886
|
+
await this._stopSubtitle();
|
|
1887
|
+
sdkLogger.error("AFTER STOP BEFORE SET SUBTITLE");
|
|
1703
1888
|
state = SetSubtitleLanguageState.SET;
|
|
1704
1889
|
break;
|
|
1705
1890
|
case SetSubtitleLanguageState.SET:
|
|
1706
1891
|
initialSubtitleLanguage = this._pendingSubtitleLanguage;
|
|
1707
1892
|
previousPendingSubtitleLanguage = this._selectedSubtitleTrack;
|
|
1708
1893
|
res = await this._selectTextTrackV3(initialSubtitleLanguage, previousPendingSubtitleLanguage);
|
|
1894
|
+
sdkLogger.error("BEFORE PLAY AFTER SET SUBTITLE 1");
|
|
1709
1895
|
state = SetSubtitleLanguageState.DONE;
|
|
1710
1896
|
break;
|
|
1711
1897
|
}
|
|
@@ -1713,20 +1899,26 @@ class RemotePlayer extends EventTarget {
|
|
|
1713
1899
|
sdkLogger.error(`Error during set subtitle process: ${error.message}`);
|
|
1714
1900
|
state = SetSubtitleLanguageState.DONE;
|
|
1715
1901
|
res = Promise.reject(error);
|
|
1716
|
-
} finally {
|
|
1717
|
-
if (!this._abortSetSubtitleLanguage) {
|
|
1718
|
-
this._play();
|
|
1719
|
-
}
|
|
1720
|
-
this._isSetSubtitleByApplication = false;
|
|
1721
|
-
sdkLogger.info("SetSubtitleLanguage: local video element set subtitle end");
|
|
1722
1902
|
}
|
|
1723
1903
|
}
|
|
1904
|
+
|
|
1905
|
+
if (!this._abortSetSubtitleLanguage) {
|
|
1906
|
+
sdkLogger.error("TARGET PLAYING STATE", this._targetSetSubtitlePlayingState);
|
|
1907
|
+
sdkLogger.error("TEXT TRACK VISIBILITY", this._textTrackVisibility);
|
|
1908
|
+
if (this._targetSetSubtitlePlayingState === TargetPlayingState.PLAYING_ABR) {
|
|
1909
|
+
sdkLogger.error("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");
|
|
1724
1915
|
return res
|
|
1725
1916
|
}
|
|
1726
1917
|
|
|
1727
1918
|
async _atomicSetAudioLanguage() {
|
|
1728
1919
|
sdkLogger.info("SetAudioLanguage: local video element set start while isPLaying=", this._isPlaying);
|
|
1729
1920
|
|
|
1921
|
+
this._targetSetAudioPlayingState = this._isPlaying ? TargetPlayingState.PLAYING_UI : TargetPlayingState.PAUSED;
|
|
1730
1922
|
this._abortSetAudioLanguage = false;
|
|
1731
1923
|
this._isSetAudioByApplication = true;
|
|
1732
1924
|
|
|
@@ -1738,19 +1930,20 @@ class RemotePlayer extends EventTarget {
|
|
|
1738
1930
|
|
|
1739
1931
|
while (!this._abortSetAudioLanguage && state !== SetAudioLanguageState.DONE) {
|
|
1740
1932
|
try {
|
|
1741
|
-
|
|
1933
|
+
|
|
1742
1934
|
switch(state) {
|
|
1743
1935
|
case SetAudioLanguageState.INIT:
|
|
1744
1936
|
state = this._isPlaying ? SetAudioLanguageState.STOPPED : SetAudioLanguageState.SET;
|
|
1745
1937
|
break;
|
|
1746
1938
|
case SetAudioLanguageState.STOPPED:
|
|
1747
|
-
await
|
|
1939
|
+
await this._stopAudio();
|
|
1748
1940
|
state = SetAudioLanguageState.SET;
|
|
1749
1941
|
break;
|
|
1750
1942
|
case SetAudioLanguageState.SET:
|
|
1751
1943
|
initialAudioLanguage = this._pendingAudioLanguage;
|
|
1752
1944
|
previousPendingAudioLanguage = this._selectedAudioTrack;
|
|
1753
1945
|
res = await this._selectAudioTrackV3(initialAudioLanguage, previousPendingAudioLanguage);
|
|
1946
|
+
sdkLogger.error("BEFORE PLAY AFTER SET AUDIO 1");
|
|
1754
1947
|
state = SetAudioLanguageState.DONE;
|
|
1755
1948
|
break;
|
|
1756
1949
|
}
|
|
@@ -1758,14 +1951,19 @@ class RemotePlayer extends EventTarget {
|
|
|
1758
1951
|
sdkLogger.error(`Error during set audio process: ${error.message}`);
|
|
1759
1952
|
state = SetAudioLanguageState.DONE;
|
|
1760
1953
|
res = Promise.reject(error);
|
|
1761
|
-
} finally {
|
|
1762
|
-
if (!this._abortSetAudioLanguage) {
|
|
1763
|
-
this._play();
|
|
1764
|
-
}
|
|
1765
|
-
this._isSetAudioByApplication = false;
|
|
1766
|
-
sdkLogger.info("SetAudioLanguage: local video element set audio end");
|
|
1767
1954
|
}
|
|
1768
|
-
}
|
|
1955
|
+
}
|
|
1956
|
+
|
|
1957
|
+
if (!this._abortSetAudioLanguage) {
|
|
1958
|
+
sdkLogger.error("TARGET PLAYING STATE", this._targetSetAudioPlayingState);
|
|
1959
|
+
if (this._targetSetAudioPlayingState === TargetPlayingState.PLAYING_UI) {
|
|
1960
|
+
sdkLogger.error("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");
|
|
1769
1967
|
return res
|
|
1770
1968
|
}
|
|
1771
1969
|
}
|