import { TrackInfo } from "@/modules/vlc-player"; import { BaseItemDto, MediaSourceInfo, } from "@jellyfin/sdk/lib/generated-client"; import React, { createContext, useContext, useState, ReactNode, useEffect, } from "react"; import { useControlContext } from "./ControlContext"; interface VideoContextProps { audioTracks: TrackInfo[] | null; subtitleTracks: TrackInfo[] | null; setAudioTrack: ((index: number) => void) | undefined; setSubtitleTrack: ((index: number) => void) | undefined; setSubtitleURL: ((url: string, customName: string) => void) | undefined; } const VideoContext = createContext(undefined); interface VideoProviderProps { children: ReactNode; getAudioTracks: | (() => Promise) | (() => TrackInfo[]) | undefined; getSubtitleTracks: | (() => Promise) | (() => TrackInfo[]) | undefined; setAudioTrack: ((index: number) => void) | undefined; setSubtitleTrack: ((index: number) => void) | undefined; setSubtitleURL: ((url: string, customName: string) => void) | undefined; } export const VideoProvider: React.FC = ({ children, getSubtitleTracks, getAudioTracks, setSubtitleTrack, setSubtitleURL, setAudioTrack, }) => { const [audioTracks, setAudioTracks] = useState(null); const [subtitleTracks, setSubtitleTracks] = useState( null ); const ControlContext = useControlContext(); const isVideoLoaded = ControlContext?.isVideoLoaded; useEffect(() => { const fetchTracks = async () => { if ( getSubtitleTracks && (subtitleTracks === null || subtitleTracks.length === 0) ) { const subtitles = await getSubtitleTracks(); console.log("Getting embeded subtitles...", subtitles); setSubtitleTracks(subtitles); } if ( getAudioTracks && (audioTracks === null || audioTracks.length === 0) ) { const audio = await getAudioTracks(); setAudioTracks(audio); } }; fetchTracks(); }, [isVideoLoaded, getAudioTracks, getSubtitleTracks]); return ( {children} ); }; export const useVideoContext = () => { const context = useContext(VideoContext); if (context === undefined) { throw new Error("useVideoContext must be used within a VideoProvider"); } return context; };