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; }