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) { const subtitles = await getSubtitleTracks(); console.log("Getting embeded subtitles...", subtitles); setSubtitleTracks(subtitles); } if (getAudioTracks) { 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; };