mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-08 10:56:15 -08:00
feat: 添加对 Chromecast 状态和会话变化的监听支持
This commit is contained in:
1 parent
e7c31e55b3
commit
fae71811db
3 files changed
+139
-11
No files matched your search
@@ -176,6 +176,7 @@ function artplayerPluginChromecast(option) {
|
||||
const DEFAULT_SDK = "https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1";
|
||||
let isCastInitialized = false;
|
||||
let castSession = null;
|
||||
let castState = null;
|
||||
const initializeCastApi = ()=>{
|
||||
return new Promise((resolve, reject)=>{
|
||||
window["__onGCastApiAvailable"] = (isAvailable)=>{
|
||||
@@ -185,9 +186,49 @@ function artplayerPluginChromecast(option) {
|
||||
receiverApplicationId: window.chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,
|
||||
autoJoinPolicy: window.chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED
|
||||
});
|
||||
// Listen for session state changes
|
||||
context.addEventListener(window.cast.framework.CastContextEventType.SESSION_STATE_CHANGED, (event)=>{
|
||||
const SessionState = window.cast.framework.SessionState;
|
||||
castState = event.sessionState;
|
||||
castSession = event.session;
|
||||
updateCastButton();
|
||||
switch(event.sessionState){
|
||||
case SessionState.NO_SESSION:
|
||||
option.onStateChange?.("disconnected");
|
||||
updateCastButton("disconnected");
|
||||
break;
|
||||
case SessionState.SESSION_STARTING:
|
||||
option.onStateChange?.("connecting");
|
||||
updateCastButton("connecting");
|
||||
break;
|
||||
case SessionState.SESSION_STARTED:
|
||||
option.onStateChange?.("connected");
|
||||
updateCastButton("connected");
|
||||
break;
|
||||
case SessionState.SESSION_ENDING:
|
||||
option.onStateChange?.("disconnecting");
|
||||
updateCastButton("disconnecting");
|
||||
break;
|
||||
case SessionState.SESSION_RESUMED:
|
||||
option.onStateChange?.("connected");
|
||||
updateCastButton("connected");
|
||||
break;
|
||||
}
|
||||
});
|
||||
// Listen for cast state changes
|
||||
context.addEventListener(window.cast.framework.CastContextEventType.CAST_STATE_CHANGED, (event)=>{
|
||||
const CastState = window.cast.framework.CastState;
|
||||
switch(event.castState){
|
||||
case CastState.NO_DEVICES_AVAILABLE:
|
||||
option.onCastAvailable?.(false);
|
||||
break;
|
||||
case CastState.NOT_CONNECTED:
|
||||
option.onCastAvailable?.(true);
|
||||
break;
|
||||
case CastState.CONNECTING:
|
||||
case CastState.CONNECTED:
|
||||
option.onCastAvailable?.(true);
|
||||
break;
|
||||
}
|
||||
});
|
||||
isCastInitialized = true;
|
||||
resolve();
|
||||
@@ -200,14 +241,30 @@ function artplayerPluginChromecast(option) {
|
||||
const url = option.url || art.option.url;
|
||||
const mediaInfo = new window.chrome.cast.media.MediaInfo(url, option.mimeType || getMimeType(url));
|
||||
const request = new window.chrome.cast.media.LoadRequest(mediaInfo);
|
||||
session.loadMedia(request).then(()=>art.notice.show = "Casting started").catch((error)=>{
|
||||
session.loadMedia(request).then(()=>{
|
||||
art.notice.show = "Casting started";
|
||||
option.onCastStart?.();
|
||||
}).catch((error)=>{
|
||||
art.notice.show = "Error casting media";
|
||||
option.onError?.(error);
|
||||
throw error;
|
||||
});
|
||||
};
|
||||
const updateCastButton = ()=>{
|
||||
const updateCastButton = (state)=>{
|
||||
const button = document.querySelector(".art-icon-cast");
|
||||
if (button) button.style.color = castSession ? "red" : "white";
|
||||
if (button) switch(state){
|
||||
case "connected":
|
||||
button.style.color = "red";
|
||||
break;
|
||||
case "connecting":
|
||||
case "disconnecting":
|
||||
button.style.color = "orange";
|
||||
break;
|
||||
case "disconnected":
|
||||
default:
|
||||
button.style.color = "white";
|
||||
break;
|
||||
}
|
||||
};
|
||||
return async (art)=>{
|
||||
art.controls.add({
|
||||
@@ -220,6 +277,7 @@ function artplayerPluginChromecast(option) {
|
||||
await initializeCastApi();
|
||||
} catch (error) {
|
||||
art.notice.show = "Failed to initialize Cast API";
|
||||
option.onError?.(error);
|
||||
throw error;
|
||||
}
|
||||
const context = window.cast.framework.CastContext.getInstance();
|
||||
@@ -229,12 +287,15 @@ function artplayerPluginChromecast(option) {
|
||||
castVideo(art, session);
|
||||
} catch (error) {
|
||||
art.notice.show = "Error connecting to cast session";
|
||||
option.onError?.(error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
});
|
||||
return {
|
||||
name: "artplayerPluginChromecast"
|
||||
name: "artplayerPluginChromecast",
|
||||
getCastState: ()=>castState,
|
||||
isCasting: ()=>castSession !== null
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"mappings":"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","sources":["packages/artplayer-plugin-chromecast/src/index.js","node_modules/@parcel/transformer-js/src/esmodule-helpers.js"],"sourcesContent":["const loadScript = (src) =>\n new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = src;\n script.onload = resolve;\n script.onerror = reject;\n document.body.appendChild(script);\n });\n\nconst getMimeType = (url) => {\n const extension = url.split('?')[0].split('#')[0].split('.').pop().toLowerCase();\n const mimeTypes = {\n mp4: 'video/mp4',\n webm: 'video/webm',\n ogg: 'video/ogg',\n ogv: 'video/ogg',\n mp3: 'audio/mp3',\n wav: 'audio/wav',\n flv: 'video/x-flv',\n mov: 'video/quicktime',\n avi: 'video/x-msvideo',\n wmv: 'video/x-ms-wmv',\n mpd: 'application/dash+xml',\n m3u8: 'application/x-mpegURL',\n };\n return mimeTypes[extension] || 'application/octet-stream';\n};\n\nexport default function artplayerPluginChromecast(option) {\n const DEFAULT_ICON = `<svg height=\"20\" width=\"20\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\"><path d=\"M512 96H64v99c-13-2-26.4-3-40-3H0V96C0 60.7 28.7 32 64 32H512c35.3 0 64 28.7 64 64V416c0 35.3-28.7 64-64 64H288V456c0-13.6-1-27-3-40H512V96zM24 224c128.1 0 232 103.9 232 232c0 13.3-10.7 24-24 24s-24-10.7-24-24c0-101.6-82.4-184-184-184c-13.3 0-24-10.7-24-24s10.7-24 24-24zm8 192a32 32 0 1 1 0 64 32 32 0 1 1 0-64zM0 344c0-13.3 10.7-24 24-24c75.1 0 136 60.9 136 136c0 13.3-10.7 24-24 24s-24-10.7-24-24c0-48.6-39.4-88-88-88c-13.3 0-24-10.7-24-24z\"/></svg>`;\n const DEFAULT_SDK = 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1';\n\n let isCastInitialized = false;\n let castSession = null;\n\n const initializeCastApi = () => {\n return new Promise((resolve, reject) => {\n window['__onGCastApiAvailable'] = (isAvailable) => {\n if (isAvailable) {\n const context = window.cast.framLine truncated
|
||||
{"mappings":"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","sources":["packages/artplayer-plugin-chromecast/src/index.js","node_modules/@parcel/transformer-js/src/esmodule-helpers.js"],"sourcesContent":["const loadScript = (src) =>\n new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = src;\n script.onload = resolve;\n script.onerror = reject;\n document.body.appendChild(script);\n });\n\nconst getMimeType = (url) => {\n const extension = url.split('?')[0].split('#')[0].split('.').pop().toLowerCase();\n const mimeTypes = {\n mp4: 'video/mp4',\n webm: 'video/webm',\n ogg: 'video/ogg',\n ogv: 'video/ogg',\n mp3: 'audio/mp3',\n wav: 'audio/wav',\n flv: 'video/x-flv',\n mov: 'video/quicktime',\n avi: 'video/x-msvideo',\n wmv: 'video/x-ms-wmv',\n mpd: 'application/dash+xml',\n m3u8: 'application/x-mpegURL',\n };\n return mimeTypes[extension] || 'application/octet-stream';\n};\n\nexport defaulLine truncated
|
||||
@@ -32,6 +32,7 @@ export default function artplayerPluginChromecast(option) {
|
||||
|
||||
let isCastInitialized = false;
|
||||
let castSession = null;
|
||||
let castState = null;
|
||||
|
||||
const initializeCastApi = () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
@@ -42,13 +43,57 @@ export default function artplayerPluginChromecast(option) {
|
||||
receiverApplicationId: window.chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,
|
||||
autoJoinPolicy: window.chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,
|
||||
});
|
||||
|
||||
// Listen for session state changes
|
||||
context.addEventListener(
|
||||
window.cast.framework.CastContextEventType.SESSION_STATE_CHANGED,
|
||||
(event) => {
|
||||
const SessionState = window.cast.framework.SessionState;
|
||||
castState = event.sessionState;
|
||||
castSession = event.session;
|
||||
updateCastButton();
|
||||
|
||||
switch (event.sessionState) {
|
||||
case SessionState.NO_SESSION:
|
||||
option.onStateChange?.('disconnected');
|
||||
updateCastButton('disconnected');
|
||||
break;
|
||||
case SessionState.SESSION_STARTING:
|
||||
option.onStateChange?.('connecting');
|
||||
updateCastButton('connecting');
|
||||
break;
|
||||
case SessionState.SESSION_STARTED:
|
||||
option.onStateChange?.('connected');
|
||||
updateCastButton('connected');
|
||||
break;
|
||||
case SessionState.SESSION_ENDING:
|
||||
option.onStateChange?.('disconnecting');
|
||||
updateCastButton('disconnecting');
|
||||
break;
|
||||
case SessionState.SESSION_RESUMED:
|
||||
option.onStateChange?.('connected');
|
||||
updateCastButton('connected');
|
||||
break;
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
// Listen for cast state changes
|
||||
context.addEventListener(window.cast.framework.CastContextEventType.CAST_STATE_CHANGED, (event) => {
|
||||
const CastState = window.cast.framework.CastState;
|
||||
switch (event.castState) {
|
||||
case CastState.NO_DEVICES_AVAILABLE:
|
||||
option.onCastAvailable?.(false);
|
||||
break;
|
||||
case CastState.NOT_CONNECTED:
|
||||
option.onCastAvailable?.(true);
|
||||
break;
|
||||
case CastState.CONNECTING:
|
||||
case CastState.CONNECTED:
|
||||
option.onCastAvailable?.(true);
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
isCastInitialized = true;
|
||||
resolve();
|
||||
} else {
|
||||
@@ -67,17 +112,33 @@ export default function artplayerPluginChromecast(option) {
|
||||
const request = new window.chrome.cast.media.LoadRequest(mediaInfo);
|
||||
session
|
||||
.loadMedia(request)
|
||||
.then(() => (art.notice.show = 'Casting started'))
|
||||
.then(() => {
|
||||
art.notice.show = 'Casting started';
|
||||
option.onCastStart?.();
|
||||
})
|
||||
.catch((error) => {
|
||||
art.notice.show = 'Error casting media';
|
||||
option.onError?.(error);
|
||||
throw error;
|
||||
});
|
||||
};
|
||||
|
||||
const updateCastButton = () => {
|
||||
const updateCastButton = (state) => {
|
||||
const button = document.querySelector('.art-icon-cast');
|
||||
if (button) {
|
||||
button.style.color = castSession ? 'red' : 'white';
|
||||
switch (state) {
|
||||
case 'connected':
|
||||
button.style.color = 'red';
|
||||
break;
|
||||
case 'connecting':
|
||||
case 'disconnecting':
|
||||
button.style.color = 'orange';
|
||||
break;
|
||||
case 'disconnected':
|
||||
default:
|
||||
button.style.color = 'white';
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -93,6 +154,7 @@ export default function artplayerPluginChromecast(option) {
|
||||
await initializeCastApi();
|
||||
} catch (error) {
|
||||
art.notice.show = 'Failed to initialize Cast API';
|
||||
option.onError?.(error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
@@ -106,13 +168,18 @@ export default function artplayerPluginChromecast(option) {
|
||||
castVideo(art, session);
|
||||
} catch (error) {
|
||||
art.notice.show = 'Error connecting to cast session';
|
||||
option.onError?.(error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
return { name: 'artplayerPluginChromecast' };
|
||||
return {
|
||||
name: 'artplayerPluginChromecast',
|
||||
getCastState: () => castState,
|
||||
isCasting: () => castSession !== null,
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user