From 78b83ed8be7c5501eac28548b4ad63f96d5412bb Mon Sep 17 00:00:00 2001 From: Pas <74743263+Pasithea0@users.noreply.github.com> Date: Sat, 15 Mar 2025 22:06:41 -0700 Subject: [PATCH] update castingInternal to avoid errors --- .../player/internals/CastingInternal.tsx | 81 +++++++++++++------ 1 file changed, 55 insertions(+), 26 deletions(-) diff --git a/src/components/player/internals/CastingInternal.tsx b/src/components/player/internals/CastingInternal.tsx index b49ce837..0a90c161 100644 --- a/src/components/player/internals/CastingInternal.tsx +++ b/src/components/player/internals/CastingInternal.tsx @@ -1,4 +1,4 @@ -import { useEffect, useRef } from "react"; +import { useCallback, useEffect, useRef } from "react"; import { mediaItemTypeToMediaType } from "@/backend/metadata/tmdb"; import { makeVideoElementDisplayInterface } from "@/components/player/display/base"; @@ -80,38 +80,67 @@ export function CastingInternal() { }); }, [metaTitle, metaType, display]); - useEffect(() => { - if (!available) return; - - const ins = cast.framework.CastContext.getInstance(); - setInstance(ins); - ins.setOptions({ - receiverApplicationId: chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID, - autoJoinPolicy: chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED, - }); - - const newPlayer = new cast.framework.RemotePlayer(); - setPlayer(newPlayer); - const newControlller = new cast.framework.RemotePlayerController(newPlayer); - setController(newControlller); - - function connectionChanged(e: cast.framework.RemotePlayerChangedEvent) { + const connectionChanged = useCallback( + (e: cast.framework.RemotePlayerChangedEvent) => { if (e.field === "isConnected") { setIsCasting(e.value); } - } - newControlller.addEventListener( - cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, - connectionChanged, - ); + }, + [setIsCasting], + ); - return () => { - newControlller.removeEventListener( + useEffect(() => { + if (!available || !window.cast || !window.chrome || !window.chrome.cast) + return; + + if (!chrome.cast || !chrome.cast.media) { + console.error( + "Chrome Cast API not fully initialized: chrome.cast.media is undefined", + ); + return; + } + + try { + const ins = cast.framework.CastContext.getInstance(); + setInstance(ins); + + const receiverAppId = chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID; + const autoJoinPolicy = chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED; + + ins.setOptions({ + receiverApplicationId: receiverAppId, + autoJoinPolicy, + }); + + const newPlayer = new cast.framework.RemotePlayer(); + setPlayer(newPlayer); + const newControlller = new cast.framework.RemotePlayerController( + newPlayer, + ); + setController(newControlller); + + newControlller.addEventListener( cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, connectionChanged, ); - }; - }, [available, setPlayer, setController, setInstance, setIsCasting]); + + return () => { + newControlller.removeEventListener( + cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, + connectionChanged, + ); + }; + } catch (error) { + console.error("Error initializing Chromecast:", error); + } + }, [ + available, + setPlayer, + setController, + setInstance, + setIsCasting, + connectionChanged, + ]); return null; }