senza-sdk 4.2.51-d3779b1.0 → 4.2.51-f4d1f9b.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 +204 -40
- package/src/utils.js +2 -4
package/package.json
CHANGED
package/src/remotePlayer.js
CHANGED
|
@@ -1424,8 +1424,7 @@ class RemotePlayer extends EventTarget {
|
|
|
1424
1424
|
* @param {string} prevSelectedTextTrack - The previously selected text track ID.
|
|
1425
1425
|
* @returns {Promise<void>} Resolves when the operation is complete.
|
|
1426
1426
|
* */
|
|
1427
|
-
async _selectTextTrackV3(textTrackId
|
|
1428
|
-
sdkLogger.log(`remotePlayer _selectTextTrackV3: prevAudioTrack=${prevSelectedTextTrack} textTrackId=${textTrackId} isPlaying=${this._isPlaying}`);
|
|
1427
|
+
async _selectTextTrackV3(textTrackId) {
|
|
1429
1428
|
if (window.cefQuery) {
|
|
1430
1429
|
const FCID = getFCID();
|
|
1431
1430
|
const logger = sdkLogger.withFields({ FCID });
|
|
@@ -1701,62 +1700,225 @@ class RemotePlayer extends EventTarget {
|
|
|
1701
1700
|
sdkLogger.info("Seeking: local video element seeking end");
|
|
1702
1701
|
}
|
|
1703
1702
|
|
|
1703
|
+
async _stopAudio() {
|
|
1704
|
+
if (window.cefQuery) {
|
|
1705
|
+
if (this._remotePlayerApiVersion >= 2) {
|
|
1706
|
+
return new Promise((resolve, reject) => {
|
|
1707
|
+
const FCID = getFCID();
|
|
1708
|
+
const logger = sdkLogger.withFields({ FCID });
|
|
1709
|
+
logger.log(`remotePlayer _stopAudio: sending stop action remotePlayer._isPlaying=${remotePlayer._isPlaying}`);
|
|
1710
|
+
const message = {
|
|
1711
|
+
type: "remotePlayer.stop",
|
|
1712
|
+
class: "remotePlayer",
|
|
1713
|
+
action: "stop",
|
|
1714
|
+
streamType: StreamType.AUDIO,
|
|
1715
|
+
fcid: FCID
|
|
1716
|
+
};
|
|
1717
|
+
let timerId = 0;
|
|
1718
|
+
const timeBeforeSendingRequest = Date.now();
|
|
1719
|
+
const queryId = window.cefQuery({
|
|
1720
|
+
request: JSON.stringify({ target: "TC", waitForResponse: true, internalAction: "uiActive", message: JSON.stringify(message) }),
|
|
1721
|
+
persistent: false,
|
|
1722
|
+
onSuccess: () => {
|
|
1723
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1724
|
+
logger.withFields({ duration }).log(`stop audio completed successfully after ${duration} ms`);
|
|
1725
|
+
this._inTransition = false;
|
|
1726
|
+
timerId = clearTimer(timerId);
|
|
1727
|
+
resolve(true);
|
|
1728
|
+
},
|
|
1729
|
+
onFailure: (code, msg) => {
|
|
1730
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1731
|
+
logger.withFields({ duration }).log(`stop audio failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
|
|
1732
|
+
this._inTransition = false;
|
|
1733
|
+
timerId = clearTimer(timerId);
|
|
1734
|
+
reject(new SenzaError(code, msg));
|
|
1735
|
+
}
|
|
1736
|
+
});
|
|
1737
|
+
logger.log(`window.cefQuery for stop audio returned query id ${queryId}`);
|
|
1738
|
+
const timeout = this._remotePlayerConfirmationTimeout + 1000;
|
|
1739
|
+
timerId = setTimeout(() => {
|
|
1740
|
+
logger.log(`stop audio reached timeout of ${timeout} ms, canceling query id ${queryId}`);
|
|
1741
|
+
this._inTransition = false;
|
|
1742
|
+
window.cefQueryCancel(queryId);
|
|
1743
|
+
reject(new SenzaError(6000, `stop audio reached timeout of ${timeout} ms`));
|
|
1744
|
+
}, timeout, queryId);
|
|
1745
|
+
});
|
|
1746
|
+
}
|
|
1747
|
+
}
|
|
1748
|
+
|
|
1749
|
+
}
|
|
1750
|
+
|
|
1751
|
+
async _stopSubtitle() {
|
|
1752
|
+
if (window.cefQuery) {
|
|
1753
|
+
if (this._remotePlayerApiVersion >= 2) {
|
|
1754
|
+
return new Promise((resolve, reject) => {
|
|
1755
|
+
const FCID = getFCID();
|
|
1756
|
+
const logger = sdkLogger.withFields({ FCID });
|
|
1757
|
+
logger.log(`remotePlayer _stopSubtitle: sending stop action remotePlayer._isPlaying=${remotePlayer._isPlaying}`);
|
|
1758
|
+
const message = {
|
|
1759
|
+
type: "remotePlayer.stop",
|
|
1760
|
+
class: "remotePlayer",
|
|
1761
|
+
action: "stop",
|
|
1762
|
+
streamType: StreamType.SUBTITLE,
|
|
1763
|
+
fcid: FCID
|
|
1764
|
+
};
|
|
1765
|
+
let timerId = 0;
|
|
1766
|
+
const timeBeforeSendingRequest = Date.now();
|
|
1767
|
+
const queryId = window.cefQuery({
|
|
1768
|
+
request: JSON.stringify({ target: "TC", waitForResponse: true, message: JSON.stringify(message) }),
|
|
1769
|
+
persistent: false,
|
|
1770
|
+
onSuccess: () => {
|
|
1771
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1772
|
+
logger.withFields({ duration }).log(`stopSubtitle completed successfully after ${duration} ms`);
|
|
1773
|
+
this._inTransition = false;
|
|
1774
|
+
timerId = clearTimer(timerId);
|
|
1775
|
+
resolve(true);
|
|
1776
|
+
},
|
|
1777
|
+
onFailure: (code, msg) => {
|
|
1778
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1779
|
+
logger.withFields({ duration }).log(`stopSubtitle failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
|
|
1780
|
+
this._inTransition = false;
|
|
1781
|
+
timerId = clearTimer(timerId);
|
|
1782
|
+
reject(new SenzaError(code, msg));
|
|
1783
|
+
}
|
|
1784
|
+
});
|
|
1785
|
+
logger.log(`window.cefQuery for stopSubtitle returned query id ${queryId}`);
|
|
1786
|
+
const timeout = this._remotePlayerConfirmationTimeout + 1000;
|
|
1787
|
+
timerId = setTimeout(() => {
|
|
1788
|
+
logger.log(`stopSubtitle reached timeout of ${timeout} ms, canceling query id ${queryId}`);
|
|
1789
|
+
window.cefQueryCancel(queryId);
|
|
1790
|
+
reject(new SenzaError(6000, `stopSubtitle reached timeout of ${timeout} ms`));
|
|
1791
|
+
}, timeout, queryId);
|
|
1792
|
+
});
|
|
1793
|
+
}
|
|
1794
|
+
}
|
|
1795
|
+
|
|
1796
|
+
}
|
|
1797
|
+
|
|
1798
|
+
async _playSubtitle() {
|
|
1799
|
+
if (window.cefQuery) {
|
|
1800
|
+
if (this._remotePlayerApiVersion >= 2) {
|
|
1801
|
+
return new Promise((resolve, reject) => {
|
|
1802
|
+
const FCID = getFCID();
|
|
1803
|
+
const logger = sdkLogger.withFields({ FCID });
|
|
1804
|
+
logger.log("remotePlayer play subtitle: sending play action");
|
|
1805
|
+
const configuration = remotePlayer.getConfiguration();
|
|
1806
|
+
if (!remotePlayer.textTrackVisibility) {
|
|
1807
|
+
sdkLogger.info("override selected track on _playSubtitle with \"\"");
|
|
1808
|
+
}
|
|
1809
|
+
const subtitlesLanguage = remotePlayer.textTrackVisibility && (remotePlayer._selectedSubtitlesTrack || configuration.preferredSubtitlesLanguage) || "";
|
|
1810
|
+
let request;
|
|
1811
|
+
const message = {
|
|
1812
|
+
action: "play",
|
|
1813
|
+
fcid: FCID,
|
|
1814
|
+
subtitlesLanguage
|
|
1815
|
+
};
|
|
1816
|
+
if (this._remotePlayerApiVersion >= 2) {
|
|
1817
|
+
message.type = "remotePlayer.play";
|
|
1818
|
+
message.class = "remotePlayer";
|
|
1819
|
+
message.streamType = StreamType.SUBTITLE;
|
|
1820
|
+
request = {
|
|
1821
|
+
target: "TC",
|
|
1822
|
+
waitForResponse: true,
|
|
1823
|
+
message: JSON.stringify(message)
|
|
1824
|
+
};
|
|
1825
|
+
} else {
|
|
1826
|
+
request = message;
|
|
1827
|
+
}
|
|
1828
|
+
let timerId = 0;
|
|
1829
|
+
const timeBeforeSendingRequest = Date.now();
|
|
1830
|
+
const queryId = window.cefQuery({
|
|
1831
|
+
request: JSON.stringify(request),
|
|
1832
|
+
persistent: false,
|
|
1833
|
+
onSuccess: () => {
|
|
1834
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1835
|
+
logger.withFields({ duration }).log(`play subtitle completed successfully after ${duration} ms`);
|
|
1836
|
+
this._inTransition = false;
|
|
1837
|
+
timerId = clearTimer(timerId);
|
|
1838
|
+
resolve();
|
|
1839
|
+
},
|
|
1840
|
+
onFailure: (code, msg) => {
|
|
1841
|
+
const duration = Date.now() - timeBeforeSendingRequest;
|
|
1842
|
+
logger.withFields({ duration }).log(`play subtitle failed after ${duration} ms. Error code: ${code}, error message: ${msg}`);
|
|
1843
|
+
this._inTransition = false;
|
|
1844
|
+
timerId = clearTimer(timerId);
|
|
1845
|
+
reject(new SenzaError(code, msg));
|
|
1846
|
+
}
|
|
1847
|
+
});
|
|
1848
|
+
if (this._remotePlayerApiVersion >= 2) {
|
|
1849
|
+
logger.log(`window.cefQuery for play subtitle returned query id ${queryId}`);
|
|
1850
|
+
const timeout = this._remotePlayerConfirmationTimeout + 1000;
|
|
1851
|
+
timerId = setTimeout(() => {
|
|
1852
|
+
logger.log(`play subtitle reached timeout of ${timeout} ms, canceling query id ${queryId}`);
|
|
1853
|
+
this._inTransition = false;
|
|
1854
|
+
window.cefQueryCancel(queryId);
|
|
1855
|
+
reject(new SenzaError(6000, `play subtitle reached timeout of ${timeout} ms`));
|
|
1856
|
+
}, timeout, queryId);
|
|
1857
|
+
}
|
|
1858
|
+
});
|
|
1859
|
+
}
|
|
1860
|
+
|
|
1861
|
+
}
|
|
1862
|
+
sdkLogger.error("remotePlayer play subtitle: window.cefQuery is undefined");
|
|
1863
|
+
return Promise.resolve(undefined);
|
|
1864
|
+
}
|
|
1865
|
+
|
|
1704
1866
|
async _atomicSetSubtitleLanguage() {
|
|
1705
1867
|
sdkLogger.info("SetSubtitleLanguage: local video element set start while isPLaying=", this._isPlaying);
|
|
1706
1868
|
|
|
1707
|
-
this.
|
|
1869
|
+
this._targetSetSubtitlePlayingState = this._isPlaying ? TargetPlayingState.PLAYING_UI : TargetPlayingState.PAUSED;
|
|
1708
1870
|
this._abortSetSubtitleLanguage = false;
|
|
1709
1871
|
this._isSetSubtitleByApplication = true;
|
|
1710
1872
|
|
|
1711
1873
|
let state = SetSubtitleLanguageState.INIT;
|
|
1712
1874
|
|
|
1713
|
-
let
|
|
1714
|
-
let initialSubtitleLanguage= this._pendingSubtitleLanguage;
|
|
1875
|
+
let initialSubtitleLanguage = this._pendingSubtitleLanguage;
|
|
1715
1876
|
let res;
|
|
1716
1877
|
|
|
1717
1878
|
while (!this._abortSetSubtitleLanguage && state !== SetSubtitleLanguageState.DONE) {
|
|
1718
1879
|
try {
|
|
1719
|
-
// TODO - Implement the logic for setting audio language
|
|
1720
1880
|
switch(state) {
|
|
1721
1881
|
case SetSubtitleLanguageState.INIT:
|
|
1722
|
-
state =
|
|
1882
|
+
state = SetSubtitleLanguageState.STOPPED; // always stop
|
|
1723
1883
|
break;
|
|
1724
1884
|
case SetSubtitleLanguageState.STOPPED:
|
|
1725
|
-
|
|
1885
|
+
sdkLogger.info("BEFORE STOP BEFORE SET SUBTITLE");
|
|
1886
|
+
await this._stopSubtitle();
|
|
1887
|
+
sdkLogger.info("AFTER STOP BEFORE SET SUBTITLE");
|
|
1726
1888
|
state = SetSubtitleLanguageState.SET;
|
|
1727
1889
|
break;
|
|
1728
1890
|
case SetSubtitleLanguageState.SET:
|
|
1729
1891
|
initialSubtitleLanguage = this._pendingSubtitleLanguage;
|
|
1730
|
-
|
|
1731
|
-
res = await this._selectTextTrackV3(initialSubtitleLanguage
|
|
1892
|
+
sdkLogger.log(`remotePlayer _selectTextTrackV3: textTrackId=${textTrackId} isPlaying=${this._isPlaying}`);
|
|
1893
|
+
res = await this._selectTextTrackV3(initialSubtitleLanguage);
|
|
1894
|
+
sdkLogger.info("AFTER SET SUBTITLE 1");
|
|
1895
|
+
state = this._isPlaying ? SetSubtitleLanguageState.PLAYING: SetSubtitleLanguageState.DONE;
|
|
1896
|
+
break;
|
|
1897
|
+
case SetSubtitleLanguageState.PLAYING:
|
|
1898
|
+
if (!this._abortSetSubtitleLanguage) {
|
|
1899
|
+
sdkLogger.info("TARGET PLAYING STATE", this._targetSetSubtitlePlayingState);
|
|
1900
|
+
sdkLogger.info("BEFORE PLAY AFTER SET SUBTITLE");
|
|
1901
|
+
this._playSubtitle();
|
|
1902
|
+
}
|
|
1732
1903
|
state = SetSubtitleLanguageState.DONE;
|
|
1733
1904
|
break;
|
|
1734
1905
|
}
|
|
1735
1906
|
} catch (error) {
|
|
1736
|
-
sdkLogger.
|
|
1907
|
+
sdkLogger.info(`Error during set subtitle process: ${error.message}`);
|
|
1737
1908
|
state = SetSubtitleLanguageState.DONE;
|
|
1738
1909
|
res = Promise.reject(error);
|
|
1739
|
-
} finally {
|
|
1740
|
-
if (!this._abortSetSubtitleLanguage) {
|
|
1741
|
-
if (this._targetSeekPlayingState === TargetPlayingState.PLAYING_UI) {
|
|
1742
|
-
console.log("BEFORE PLAY AFTER SET SUBTITLE");
|
|
1743
|
-
await this._play();
|
|
1744
|
-
} else if (this._targetSeekPlayingState === TargetPlayingState.PLAYING_ABR) {
|
|
1745
|
-
console.log("BEFORE MOVE_TO_BACKGROUND AFTER SET SUBTITLE");
|
|
1746
|
-
await lifecycle._moveToBackground();
|
|
1747
|
-
}
|
|
1748
|
-
}
|
|
1749
|
-
this._isSetSubtitleByApplication = false;
|
|
1750
|
-
sdkLogger.info("SetSubtitleLanguage: local video element set subtitle end");
|
|
1751
1910
|
}
|
|
1752
1911
|
}
|
|
1912
|
+
|
|
1913
|
+
this._isSetSubtitleByApplication = false;
|
|
1914
|
+
sdkLogger.info("SetSubtitleLanguage: local video element set subtitle end");
|
|
1753
1915
|
return res
|
|
1754
1916
|
}
|
|
1755
1917
|
|
|
1756
1918
|
async _atomicSetAudioLanguage() {
|
|
1757
1919
|
sdkLogger.info("SetAudioLanguage: local video element set start while isPLaying=", this._isPlaying);
|
|
1758
1920
|
|
|
1759
|
-
this.
|
|
1921
|
+
this._targetSetAudioPlayingState = this._isPlaying ? TargetPlayingState.PLAYING_UI : TargetPlayingState.PAUSED;
|
|
1760
1922
|
this._abortSetAudioLanguage = false;
|
|
1761
1923
|
this._isSetAudioByApplication = true;
|
|
1762
1924
|
|
|
@@ -1768,40 +1930,42 @@ class RemotePlayer extends EventTarget {
|
|
|
1768
1930
|
|
|
1769
1931
|
while (!this._abortSetAudioLanguage && state !== SetAudioLanguageState.DONE) {
|
|
1770
1932
|
try {
|
|
1771
|
-
|
|
1933
|
+
|
|
1772
1934
|
switch(state) {
|
|
1773
1935
|
case SetAudioLanguageState.INIT:
|
|
1774
|
-
|
|
1936
|
+
sdkLogger.info("BEFORE STOP BEFORE SET AUDIO");
|
|
1937
|
+
await this._stopAudio();
|
|
1938
|
+
sdkLogger.info("AFTER STOP BEFORE SET AUDIO");
|
|
1939
|
+
state = SetAudioLanguageState.SET;
|
|
1775
1940
|
break;
|
|
1776
1941
|
case SetAudioLanguageState.STOPPED:
|
|
1777
|
-
await lifecycle.moveToForeground();
|
|
1778
1942
|
state = SetAudioLanguageState.SET;
|
|
1779
1943
|
break;
|
|
1780
1944
|
case SetAudioLanguageState.SET:
|
|
1781
1945
|
initialAudioLanguage = this._pendingAudioLanguage;
|
|
1782
1946
|
previousPendingAudioLanguage = this._selectedAudioTrack;
|
|
1783
1947
|
res = await this._selectAudioTrackV3(initialAudioLanguage, previousPendingAudioLanguage);
|
|
1948
|
+
sdkLogger.info("BEFORE PLAY AFTER SET AUDIO 1");
|
|
1784
1949
|
state = SetAudioLanguageState.DONE;
|
|
1785
1950
|
break;
|
|
1786
1951
|
}
|
|
1787
1952
|
} catch (error) {
|
|
1788
|
-
sdkLogger.
|
|
1953
|
+
sdkLogger.info(`Error during set audio process: ${error.message}`);
|
|
1789
1954
|
state = SetAudioLanguageState.DONE;
|
|
1790
1955
|
res = Promise.reject(error);
|
|
1791
|
-
} finally {
|
|
1792
|
-
if (!this._abortSetAudioLanguage) {
|
|
1793
|
-
if (this._targetSeekPlayingState === TargetPlayingState.PLAYING_UI) {
|
|
1794
|
-
console.log("BEFORE PLAY AFTER SET AUDIO");
|
|
1795
|
-
await this._play();
|
|
1796
|
-
} else if (this._targetSeekPlayingState === TargetPlayingState.PLAYING_ABR) {
|
|
1797
|
-
console.log("BEFORE MOVE_TO_BACKGROUND AFTER SET AUDIO");
|
|
1798
|
-
await lifecycle._moveToBackground();
|
|
1799
|
-
}
|
|
1800
|
-
}
|
|
1801
|
-
this._isSetAudioByApplication = false;
|
|
1802
|
-
sdkLogger.info("SetAudioLanguage: local video element set audio end");
|
|
1803
1956
|
}
|
|
1804
1957
|
}
|
|
1958
|
+
|
|
1959
|
+
if (!this._abortSetAudioLanguage) {
|
|
1960
|
+
sdkLogger.info("TARGET PLAYING STATE", this._targetSetAudioPlayingState);
|
|
1961
|
+
if (this._targetSetAudioPlayingState === TargetPlayingState.PLAYING_UI) {
|
|
1962
|
+
sdkLogger.info("BEFORE PLAY AFTER SET AUDIO 2");
|
|
1963
|
+
this._play();
|
|
1964
|
+
}
|
|
1965
|
+
}
|
|
1966
|
+
|
|
1967
|
+
this._isSetAudioByApplication = false;
|
|
1968
|
+
sdkLogger.info("SetAudioLanguage: local video element set audio end");
|
|
1805
1969
|
return res
|
|
1806
1970
|
}
|
|
1807
1971
|
}
|
package/src/utils.js
CHANGED
|
@@ -159,8 +159,7 @@ export const SetAudioLanguageState = Object.freeze({
|
|
|
159
159
|
INIT: "init",
|
|
160
160
|
STOPPED: "stopped",
|
|
161
161
|
SET: "set",
|
|
162
|
-
|
|
163
|
-
WAITING: "waiting",
|
|
162
|
+
PLAYING: "playing",
|
|
164
163
|
DONE: "done"
|
|
165
164
|
});
|
|
166
165
|
|
|
@@ -168,8 +167,7 @@ export const SetSubtitleLanguageState = Object.freeze({
|
|
|
168
167
|
INIT: "init",
|
|
169
168
|
STOPPED: "stopped",
|
|
170
169
|
SET: "set",
|
|
171
|
-
|
|
172
|
-
WAITING: "waiting",
|
|
170
|
+
PLAYING: "playing",
|
|
173
171
|
DONE: "done"
|
|
174
172
|
});
|
|
175
173
|
|