diff --git a/docs/uncompiled/artplayer-plugin-chromecast/index.js b/docs/uncompiled/artplayer-plugin-chromecast/index.js
index b0f166118..f8a5464a9 100644
--- a/docs/uncompiled/artplayer-plugin-chromecast/index.js
+++ b/docs/uncompiled/artplayer-plugin-chromecast/index.js
@@ -145,16 +145,15 @@
})({"NDQPH":[function(require,module,exports) {
var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js");
parcelHelpers.defineInteropFlag(exports);
-function loadScript(src) {
- return new Promise((resolve, reject)=>{
+parcelHelpers.export(exports, "default", ()=>artplayerPluginChromecast);
+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",
@@ -171,49 +170,67 @@ function getMimeType(url) {
m3u8: "application/x-mpegURL"
};
return mimeTypes[extension] || "application/octet-stream";
-}
+};
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) {
- artplayerPluginChromecast.isAvailable = isAvailable;
- if (isAvailable) cast.framework.CastContext.getInstance().setOptions({
- receiverApplicationId: chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,
- autoJoinPolicy: 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)=>{
- 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 chrome.cast.media.MediaInfo(url, mimeType);
- const request = new 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 () {
- if (!artplayerPluginChromecast.isAvailable) {
- art.notice.show = "Cast API is not available";
- return;
+ click: async ()=>{
+ if (!isCastInitialized) try {
+ await initializeCastApi();
+ } catch (error) {
+ art.notice.show = "Failed to initialize Cast API";
+ throw error;
}
- const castSession = cast.framework.CastContext.getInstance().getCurrentSession();
- if (castSession) castVideo(castSession);
- else cast.framework.CastContext.getInstance().requestSession().then(function(session) {
- castVideo(session);
- }, function(error) {
+ const context = window.cast.framework.CastContext.getInstance();
+ if (castSession) castVideo(art, castSession);
+ else try {
+ const session = await context.requestSession();
+ castVideo(art, session);
+ } catch (error) {
art.notice.show = "Error connecting to cast session";
- console.log("Error connecting to cast session", error);
- });
+ throw error;
+ }
}
});
return {
@@ -221,7 +238,6 @@ function artplayerPluginChromecast(option) {
};
};
}
-exports.default = artplayerPluginChromecast;
if (typeof window !== "undefined") window["artplayerPluginChromecast"] = artplayerPluginChromecast;
},{"@parcel/transformer-js/src/esmodule-helpers.js":"5dUr6"}],"5dUr6":[function(require,module,exports) {
@@ -237,7 +253,7 @@ exports.defineInteropFlag = function(a) {
};
exports.exportAll = function(source, dest) {
Object.keys(source).forEach(function(key) {
- if (key === "default" || key === "__esModule" || dest.hasOwnProperty(key)) return;
+ if (key === "default" || key === "__esModule" || Object.prototype.hasOwnProperty.call(dest, key)) return;
Object.defineProperty(dest, key, {
enumerable: true,
get: function() {
diff --git a/docs/uncompiled/artplayer-plugin-chromecast/index.js.map b/docs/uncompiled/artplayer-plugin-chromecast/index.js.map
index c76fcd191..ea97b0d09 100644
--- a/docs/uncompiled/artplayer-plugin-chromecast/index.js.map
+++ b/docs/uncompiled/artplayer-plugin-chromecast/index.js.map
@@ -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":["function loadScript(src) {\n return 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}\n\nfunction 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 = ``;\n const DEFAULT_SDK = 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1';\n\n window['__onGCastApiAvailable'] = function (isAvailable) {\n artplayerPluginChromecast.isAvailable = isAvailable;\n if (isAvailable) {\n cast.framework.CastContext.getInstance().setOptions({\n receiverApplicationId: chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,\n autoJoinPolicy: chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,\n });\n }\n };\n\n return async (art) => {\n await loadScript(option.sdk || DEFAULT_SDK);\n\n function castVideo(session) {\n const url = option.url || art.option.url;\n const mimeType = option.mimeType || getMimeType(url);\n const mediaInfo = new chrome.cast.media.MediaInfo(url, mimeType);\n const request = new chrome.cast.media.LoadRequest(mediaInfo);\n session.loadMedia(request).then(\n function () {\n console.log('Media loaded successfully');\n },\n function (error) {\n art.notice.show = 'Error casting media';\n console.log('Error casting media', error);\n },\n );\n }\n\n art.controls.add({\n name: 'chromecast',\n position: 'right',\n tooltip: 'Chromecast',\n html: `${option.icon || DEFAULT_ICON}`,\n click() {\n if (!artplayerPluginChromecast.isAvailable) {\n art.notice.show = 'Cast API is not available';\n return;\n }\n\n const castSession = cast.framework.CastContext.getInstance().getCurrentSession();\n\n if (castSession) {\n castVideo(castSession);\n } else {\n cast.framework.CastContext.getInstance()\n .requestSession()\n .then(\n function (session) {\n castVideo(session);\n },\n function (error) {\n art.notice.show = 'Error connecting to cast session';\n console.log('Error connecting to cast session', error);\n },\n );\n }\n },\n });\n\n return {\n name: 'artplayerPluginChromecast',\n };\n };\n}\n\nif (typeof window !== 'undefined') {\n window['artplayerPluginChromecast'] = artplayerPluginChromecast;\n}\n","exports.interopDefault = function (a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function (a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function (source, dest) {\n Object.keys(source).forEach(function (key) {\n if (key === 'default' || key === '__esModule' || dest.hasOwnProperty(key)) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function () {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function (dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../../"}
\ No newline at end of file
+{"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 = ``;\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.framework.CastContext.getInstance();\n context.setOptions({\n receiverApplicationId: window.chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID,\n autoJoinPolicy: window.chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED,\n });\n context.addEventListener(\n window.cast.framework.CastContextEventType.SESSION_STATE_CHANGED,\n (event) => {\n castSession = event.session;\n updateCastButton();\n },\n );\n isCastInitialized = true;\n resolve();\n } else {\n reject(new Error('Cast API is not available'));\n }\n };\n if (!window.chrome || !window.chrome.cast) {\n loadScript(option.sdk || DEFAULT_SDK).catch(reject);\n }\n });\n };\n\n const castVideo = (art, session) => {\n const url = option.url || art.option.url;\n const mediaInfo = new window.chrome.cast.media.MediaInfo(url, option.mimeType || getMimeType(url));\n const request = new window.chrome.cast.media.LoadRequest(mediaInfo);\n session\n .loadMedia(request)\n .then(() => (art.notice.show = 'Casting started'))\n .catch((error) => {\n art.notice.show = 'Error casting media';\n throw error;\n });\n };\n\n const updateCastButton = () => {\n const button = document.querySelector('.art-icon-cast');\n if (button) {\n button.style.color = castSession ? 'red' : 'white';\n }\n };\n\n return async (art) => {\n art.controls.add({\n name: 'chromecast',\n position: 'right',\n tooltip: 'Chromecast',\n html: `${option.icon || DEFAULT_ICON}`,\n click: async () => {\n if (!isCastInitialized) {\n try {\n await initializeCastApi();\n } catch (error) {\n art.notice.show = 'Failed to initialize Cast API';\n throw error;\n }\n }\n\n const context = window.cast.framework.CastContext.getInstance();\n if (castSession) {\n castVideo(art, castSession);\n } else {\n try {\n const session = await context.requestSession();\n castVideo(art, session);\n } catch (error) {\n art.notice.show = 'Error connecting to cast session';\n throw error;\n }\n }\n },\n });\n\n return { name: 'artplayerPluginChromecast' };\n };\n}\n\nif (typeof window !== 'undefined') {\n window['artplayerPluginChromecast'] = artplayerPluginChromecast;\n}\n","exports.interopDefault = function (a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function (a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function (source, dest) {\n Object.keys(source).forEach(function (key) {\n if (\n key === 'default' ||\n key === '__esModule' ||\n Object.prototype.hasOwnProperty.call(dest, key)\n ) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function () {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function (dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../../"}
\ No newline at end of file
diff --git a/packages/artplayer-plugin-chromecast/package.json b/packages/artplayer-plugin-chromecast/package.json
index 76c5dc82d..c5e6ce8ce 100644
--- a/packages/artplayer-plugin-chromecast/package.json
+++ b/packages/artplayer-plugin-chromecast/package.json
@@ -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"
]
-}
+}
\ No newline at end of file
diff --git a/packages/artplayer-plugin-chromecast/src/index.js b/packages/artplayer-plugin-chromecast/src/index.js
index 8469b344e..f67a0a9ab 100644
--- a/packages/artplayer-plugin-chromecast/src/index.js
+++ b/packages/artplayer-plugin-chromecast/src/index.js
@@ -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 = ``;
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: `${option.icon || DEFAULT_ICON}`,
- 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' };
};
}