@scarlett-player/chromecast 0.5.3 → 1.0.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/index.cjs CHANGED
@@ -84,6 +84,7 @@ function chromecastPlugin() {
84
84
  let remotePlayerController = null;
85
85
  let localTimeBeforeCast = 0;
86
86
  let localSrcBeforeCast = "";
87
+ let previousIsMediaLoaded = false;
87
88
  let castStateHandler = null;
88
89
  let sessionStateHandler = null;
89
90
  let remotePlayerHandler = null;
@@ -114,6 +115,10 @@ function chromecastPlugin() {
114
115
  window.cast.framework.RemotePlayerEventType.ANY_CHANGE,
115
116
  remotePlayerHandler
116
117
  );
118
+ remotePlayerController.addEventListener(
119
+ window.cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED,
120
+ remotePlayerHandler
121
+ );
117
122
  const initialState = castContext.getCastState();
118
123
  const available = initialState !== window.cast.framework.CastState.NO_DEVICES_AVAILABLE;
119
124
  api.setState("chromecastAvailable", available);
@@ -214,6 +219,12 @@ function chromecastPlugin() {
214
219
  const handleRemotePlayerChange = () => {
215
220
  if (!remotePlayer) return;
216
221
  if (!api.getState("chromecastActive")) return;
222
+ const isMediaLoaded = remotePlayer.isMediaLoaded;
223
+ if (previousIsMediaLoaded && !isMediaLoaded) {
224
+ api.logger.debug("Cast media ended (isMediaLoaded transition)");
225
+ api.emit("playback:ended", void 0);
226
+ }
227
+ previousIsMediaLoaded = isMediaLoaded;
217
228
  api.setState("currentTime", remotePlayer.currentTime);
218
229
  api.setState("duration", remotePlayer.duration);
219
230
  api.setState("playing", !remotePlayer.isPaused);
@@ -230,6 +241,13 @@ function chromecastPlugin() {
230
241
  api = pluginApi;
231
242
  api.setState("chromecastAvailable", false);
232
243
  api.setState("chromecastActive", false);
244
+ const unsubLoadRequest = api.on("media:load-request", async ({ src }) => {
245
+ if (!api.getState("chromecastActive")) return;
246
+ await loadMediaOnCast(src, 0);
247
+ });
248
+ api.onDestroy(() => {
249
+ unsubLoadRequest();
250
+ });
233
251
  if (!isCastSupported()) {
234
252
  api.logger.debug("Chromecast not supported in this browser");
235
253
  return;
@@ -267,6 +285,10 @@ function chromecastPlugin() {
267
285
  window.cast.framework.RemotePlayerEventType.ANY_CHANGE,
268
286
  remotePlayerHandler
269
287
  );
288
+ remotePlayerController.removeEventListener(
289
+ window.cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED,
290
+ remotePlayerHandler
291
+ );
270
292
  }
271
293
  castContext = null;
272
294
  currentSession = null;
package/dist/index.js CHANGED
@@ -54,6 +54,7 @@ function chromecastPlugin() {
54
54
  let remotePlayerController = null;
55
55
  let localTimeBeforeCast = 0;
56
56
  let localSrcBeforeCast = "";
57
+ let previousIsMediaLoaded = false;
57
58
  let castStateHandler = null;
58
59
  let sessionStateHandler = null;
59
60
  let remotePlayerHandler = null;
@@ -84,6 +85,10 @@ function chromecastPlugin() {
84
85
  window.cast.framework.RemotePlayerEventType.ANY_CHANGE,
85
86
  remotePlayerHandler
86
87
  );
88
+ remotePlayerController.addEventListener(
89
+ window.cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED,
90
+ remotePlayerHandler
91
+ );
87
92
  const initialState = castContext.getCastState();
88
93
  const available = initialState !== window.cast.framework.CastState.NO_DEVICES_AVAILABLE;
89
94
  api.setState("chromecastAvailable", available);
@@ -184,6 +189,12 @@ function chromecastPlugin() {
184
189
  const handleRemotePlayerChange = () => {
185
190
  if (!remotePlayer) return;
186
191
  if (!api.getState("chromecastActive")) return;
192
+ const isMediaLoaded = remotePlayer.isMediaLoaded;
193
+ if (previousIsMediaLoaded && !isMediaLoaded) {
194
+ api.logger.debug("Cast media ended (isMediaLoaded transition)");
195
+ api.emit("playback:ended", void 0);
196
+ }
197
+ previousIsMediaLoaded = isMediaLoaded;
187
198
  api.setState("currentTime", remotePlayer.currentTime);
188
199
  api.setState("duration", remotePlayer.duration);
189
200
  api.setState("playing", !remotePlayer.isPaused);
@@ -200,6 +211,13 @@ function chromecastPlugin() {
200
211
  api = pluginApi;
201
212
  api.setState("chromecastAvailable", false);
202
213
  api.setState("chromecastActive", false);
214
+ const unsubLoadRequest = api.on("media:load-request", async ({ src }) => {
215
+ if (!api.getState("chromecastActive")) return;
216
+ await loadMediaOnCast(src, 0);
217
+ });
218
+ api.onDestroy(() => {
219
+ unsubLoadRequest();
220
+ });
203
221
  if (!isCastSupported()) {
204
222
  api.logger.debug("Chromecast not supported in this browser");
205
223
  return;
@@ -237,6 +255,10 @@ function chromecastPlugin() {
237
255
  window.cast.framework.RemotePlayerEventType.ANY_CHANGE,
238
256
  remotePlayerHandler
239
257
  );
258
+ remotePlayerController.removeEventListener(
259
+ window.cast.framework.RemotePlayerEventType.IS_MEDIA_LOADED_CHANGED,
260
+ remotePlayerHandler
261
+ );
240
262
  }
241
263
  castContext = null;
242
264
  currentSession = null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scarlett-player/chromecast",
3
- "version": "0.5.3",
3
+ "version": "1.0.0",
4
4
  "description": "Chromecast Plugin for Scarlett Player",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -17,7 +17,7 @@
17
17
  "dist"
18
18
  ],
19
19
  "peerDependencies": {
20
- "@scarlett-player/core": "^0.5.3"
20
+ "@scarlett-player/core": "^1.0.0"
21
21
  },
22
22
  "devDependencies": {
23
23
  "typescript": "^5.3.0",
@@ -25,7 +25,7 @@
25
25
  "vitest": "^1.6.0",
26
26
  "@vitest/coverage-v8": "^1.6.0",
27
27
  "jsdom": "^24.0.0",
28
- "@scarlett-player/core": "0.5.3"
28
+ "@scarlett-player/core": "1.0.0"
29
29
  },
30
30
  "keywords": [
31
31
  "video",