mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-07-09 03:04:20 -04:00
wip: cast state
This commit is contained in:
parent
846c0d77d3
commit
de3fda6a1a
@ -22,6 +22,15 @@ import { atom, useAtomValue, useSetAtom } from "jotai";
|
|||||||
import { useEffect, useMemo } from "react";
|
import { useEffect, useMemo } from "react";
|
||||||
import { bakedAtom } from "~/utils/jotai-utils";
|
import { bakedAtom } from "~/utils/jotai-utils";
|
||||||
|
|
||||||
|
export type Media = {
|
||||||
|
name: string;
|
||||||
|
episodeName?: null;
|
||||||
|
episodeNumber?: number;
|
||||||
|
seasonNumber?: number;
|
||||||
|
absoluteNumber?: string;
|
||||||
|
thunbnail?: string;
|
||||||
|
};
|
||||||
|
|
||||||
const playerAtom = atom(() => {
|
const playerAtom = atom(() => {
|
||||||
const player = new cast.framework.RemotePlayer();
|
const player = new cast.framework.RemotePlayer();
|
||||||
return {
|
return {
|
||||||
@ -36,13 +45,16 @@ export const [_playAtom, playAtom] = bakedAtom<boolean, never>(true, (get) => {
|
|||||||
});
|
});
|
||||||
export const [_durationAtom, durationAtom] = bakedAtom(1, (get, _, value) => {
|
export const [_durationAtom, durationAtom] = bakedAtom(1, (get, _, value) => {
|
||||||
const { controller } = get(playerAtom);
|
const { controller } = get(playerAtom);
|
||||||
controller.seek()
|
controller.seek();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const [_mediaAtom, mediaAtom] = bakedAtom<Media | null, string>(null, (get, _, value) => {});
|
||||||
|
|
||||||
export const useCastController = () => {
|
export const useCastController = () => {
|
||||||
const { player, controller } = useAtomValue(playerAtom);
|
const { player, controller } = useAtomValue(playerAtom);
|
||||||
const setPlay = useSetAtom(_playAtom);
|
const setPlay = useSetAtom(_playAtom);
|
||||||
const setDuration = useSetAtom(_durationAtom);
|
const setDuration = useSetAtom(_durationAtom);
|
||||||
|
const setMedia = useSetAtom(_mediaAtom);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const eventListeners: [
|
const eventListeners: [
|
||||||
@ -51,11 +63,15 @@ export const useCastController = () => {
|
|||||||
][] = [
|
][] = [
|
||||||
[cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, (event) => setPlay(event.value)],
|
[cast.framework.RemotePlayerEventType.IS_PAUSED_CHANGED, (event) => setPlay(event.value)],
|
||||||
[cast.framework.RemotePlayerEventType.DURATION_CHANGED, (event) => setDuration(event.value)],
|
[cast.framework.RemotePlayerEventType.DURATION_CHANGED, (event) => setDuration(event.value)],
|
||||||
|
[
|
||||||
|
cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED,
|
||||||
|
() => setMedia(player.mediaInfo?.metadata),
|
||||||
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
for (const [key, handler] of eventListeners) controller.addEventListener(key, handler);
|
for (const [key, handler] of eventListeners) controller.addEventListener(key, handler);
|
||||||
return () => {
|
return () => {
|
||||||
for (const [key, handler] of eventListeners) controller.removeEventListener(key, handler);
|
for (const [key, handler] of eventListeners) controller.removeEventListener(key, handler);
|
||||||
};
|
};
|
||||||
}, [player, controller, setPlay]);
|
}, [player, controller, setPlay, setDuration, setMedia]);
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user