feat: update version to 1.0.1 and enhance Chromecast plugin functionality

This commit is contained in:
Harvey Zack committed 2024-09-24 10:50:26 +08:00
1 parent c9d2d6c194
commit a6f0dc50e5
4 files changed
+125 -86

No files matched your search

@@ -1,6 +1,6 @@
{
"license": "MIT",
"version": "1.0.0",
"version": "1.0.1",
"name": "artplayer-plugin-chromecast",
"types": "types/artplayer-plugin-chromecast.d.ts",
"description": "Chromecast plugin for ArtPlayer",
@@ -21,4 +21,4 @@
"video",
"player"
]
}
}
@@ -1,14 +1,13 @@
function loadScript(src) {
return new Promise((resolve, reject) => {
const loadScript = (src) =>
new Promise((resolve, reject) => {
const script = document.createElement('script');
script.src = src;
script.onload = resolve;
script.onerror = reject;
document.body.appendChild(script);
});
}
function getMimeType(url) {
const getMimeType = (url) => {
const extension = url.split('?')[0].split('#')[0].split('.').pop().toLowerCase();
const mimeTypes = {
mp4: 'video/mp4',
@@ -25,71 +24,95 @@ function getMimeType(url) {
m3u8: 'application/x-mpegURL',
};
return mimeTypes[extension] || 'application/octet-stream';
}
};
export default function artplayerPluginChromecast(option) {
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>`;
const DEFAULT_SDK = 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1';
window['__onGCastApiAvailable'] = function (isAvailable) {
if (isAvailable) {
window.cast.framework.CastContext.getInstance().setOptions({
receiverApplicationId: window.chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,
autoJoinPolicy: window.chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,
let isCastInitialized = false;
let castSession = null;
const initializeCastApi = () => {
return new Promise((resolve, reject) => {
window['__onGCastApiAvailable'] = (isAvailable) => {
if (isAvailable) {
const context = window.cast.framework.CastContext.getInstance();
context.setOptions({
receiverApplicationId: window.chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,
autoJoinPolicy: window.chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,
});
context.addEventListener(
window.cast.framework.CastContextEventType.SESSION_STATE_CHANGED,
(event) => {
castSession = event.session;
updateCastButton();
},
);
isCastInitialized = true;
resolve();
} else {
reject(new Error('Cast API is not available'));
}
};
if (!window.chrome || !window.chrome.cast) {
loadScript(option.sdk || DEFAULT_SDK).catch(reject);
}
});
};
const castVideo = (art, session) => {
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) => {
art.notice.show = 'Error casting media';
throw error;
});
};
const updateCastButton = () => {
const button = document.querySelector('.art-icon-cast');
if (button) {
button.style.color = castSession ? 'red' : 'white';
}
};
return async (art) => {
if (!window.chrome || !window.chrome.cast) {
await loadScript(option.sdk || DEFAULT_SDK);
}
function castVideo(session) {
const url = option.url || art.option.url;
const mimeType = option.mimeType || getMimeType(url);
const mediaInfo = new window.chrome.cast.media.MediaInfo(url, mimeType);
const request = new window.chrome.cast.media.LoadRequest(mediaInfo);
session.loadMedia(request).then(
function () {
console.log('Media loaded successfully');
},
function (error) {
art.notice.show = 'Error casting media';
console.log('Error casting media', error);
},
);
}
art.controls.add({
name: 'chromecast',
position: 'right',
tooltip: 'Chromecast',
html: `<i class="art-icon art-icon-cast">${option.icon || DEFAULT_ICON}</i>`,
click() {
const castSession = window.cast.framework.CastContext.getInstance().getCurrentSession();
click: async () => {
if (!isCastInitialized) {
try {
await initializeCastApi();
} catch (error) {
art.notice.show = 'Failed to initialize Cast API';
throw error;
}
}
const context = window.cast.framework.CastContext.getInstance();
if (castSession) {
castVideo(castSession);
castVideo(art, castSession);
} else {
window.cast.framework.CastContext.getInstance()
.requestSession()
.then(
function (session) {
castVideo(session);
},
function (error) {
art.notice.show = 'Error connecting to cast session';
console.log('Error connecting to cast session', error);
},
);
try {
const session = await context.requestSession();
castVideo(art, session);
} catch (error) {
art.notice.show = 'Error connecting to cast session';
throw error;
}
}
},
});
return {
name: 'artplayerPluginChromecast',
};
return { name: 'artplayerPluginChromecast' };
};
}