function loadScript(src) {
return 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 extension = url.split('?')[0].split('#')[0].split('.').pop().toLowerCase();
const mimeTypes = {
mp4: 'video/mp4',
webm: 'video/webm',
ogg: 'video/ogg',
ogv: 'video/ogg',
mp3: 'audio/mp3',
wav: 'audio/wav',
flv: 'video/x-flv',
mov: 'video/quicktime',
avi: 'video/x-msvideo',
wmv: 'video/x-ms-wmv',
mpd: 'application/dash+xml',
m3u8: 'application/x-mpegURL',
};
return mimeTypes[extension] || 'application/octet-stream';
}
export default function artplayerPluginChromecast(option) {
const DEFAULT_ICON = ``;
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,
});
}
};
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: `${option.icon || DEFAULT_ICON}`,
click() {
const castSession = window.cast.framework.CastContext.getInstance().getCurrentSession();
if (castSession) {
castVideo(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);
},
);
}
},
});
return {
name: 'artplayerPluginChromecast',
};
};
}
if (typeof window !== 'undefined') {
window['artplayerPluginChromecast'] = artplayerPluginChromecast;
}