From 398644951e6b4e412ac775f48b24b193115c6487 Mon Sep 17 00:00:00 2001 From: mrjvs Date: Sun, 19 Feb 2023 22:55:58 +0100 Subject: [PATCH] more chromecast fixes Co-authored-by: Jip Frijlink Co-authored-by: James Hawkins Co-authored-by: William Oldham --- .../controllers/ProgressListenerController.tsx | 13 +++++++++++++ src/video/state/providers/castingStateProvider.ts | 5 ++++- src/video/state/providers/utils.ts | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/video/components/controllers/ProgressListenerController.tsx b/src/video/components/controllers/ProgressListenerController.tsx index 2739f412..1a1d2bd1 100644 --- a/src/video/components/controllers/ProgressListenerController.tsx +++ b/src/video/components/controllers/ProgressListenerController.tsx @@ -4,6 +4,7 @@ import { useVideoPlayerDescriptor } from "@/video/state/hooks"; import { useMediaPlaying } from "@/video/state/logic/mediaplaying"; import { useProgress } from "@/video/state/logic/progress"; import { useControls } from "@/video/state/logic/controls"; +import { useMisc } from "@/video/state/logic/misc"; interface Props { startAt?: number; @@ -15,6 +16,7 @@ export function ProgressListenerController(props: Props) { const mediaPlaying = useMediaPlaying(descriptor); const progress = useProgress(descriptor); const controls = useControls(descriptor); + const misc = useMisc(descriptor); const didInitialize = useRef(null); const lastTime = useRef(props.startAt ?? 0); @@ -46,6 +48,17 @@ export function ProgressListenerController(props: Props) { didInitialize.current = true; }, [didInitialize, props, progress, mediaPlaying, controls]); + // when switching state providers + // TODO stateProviderId is somehow ALWAYS "video" + const lastStateProviderId = useRef(null); + const stateProviderId = useMemo(() => misc.stateProviderId, [misc]); + useEffect(() => { + if (lastStateProviderId.current === stateProviderId) return; + if (mediaPlaying.isFirstLoading) return; + lastStateProviderId.current = stateProviderId; + controls.setTime(lastTime.current); + }, [controls, mediaPlaying, stateProviderId]); + useEffect(() => { // if it initialized, but media starts loading for the first time again. // reset initalized so it will restore time again diff --git a/src/video/state/providers/castingStateProvider.ts b/src/video/state/providers/castingStateProvider.ts index d78190c1..6c7c66d5 100644 --- a/src/video/state/providers/castingStateProvider.ts +++ b/src/video/state/providers/castingStateProvider.ts @@ -176,7 +176,10 @@ export function createCastingStateProvider( state.mediaPlaying.isLoading = e.value === "BUFFERING"; state.mediaPlaying.isPaused = e.value !== "PLAYING"; state.mediaPlaying.isPlaying = e.value === "PLAYING"; - if (e.value === "PLAYING") state.mediaPlaying.hasPlayedOnce = true; + if (e.value === "PLAYING") { + state.mediaPlaying.hasPlayedOnce = true; + state.mediaPlaying.isFirstLoading = false; + } updateMediaPlaying(descriptor, state); break; case "isMuted": diff --git a/src/video/state/providers/utils.ts b/src/video/state/providers/utils.ts index 273d9fff..9d5d47e5 100644 --- a/src/video/state/providers/utils.ts +++ b/src/video/state/providers/utils.ts @@ -26,11 +26,11 @@ export function unsetStateProvider( !state.stateProvider || state.stateProvider?.getId() !== stateProviderId ) { - state.stateProviderId = "video"; // go back to video when casting stops return; } state.stateProvider = null; state.stateProviderId = "video"; // go back to video when casting stops + updateMisc(descriptor, state); } export function handleBuffered(time: number, buffered: TimeRanges): number {