UNPKG

@zezosoft/zezo-ott-react-native-video-player

Version:

React Native OTT Video Player for Android & iOS. Supports playlists, seasons, auto-next playback, subtitles, theming, analytics, fullscreen mode, and custom controls. 🚀 Powered by ZezoSoft.

193 lines (154 loc) • 4.4 kB
/** * @author Naresh * @lastModified Sat 16 Aug 2025 at 12:15 PM */ import { type EnumValues, type OnLoadData, ResizeMode, SelectedVideoTrackType, } from 'react-native-video'; export interface BaseEntity { id: string; title: string; contentId: string; } export interface TimeRange { start: number; end: number; } export interface SubtitleTrack { title?: string; language?: string; type: | 'application/x-subrip' | 'application/ttml+xml' | 'text/vtt' | 'application/octet-stream'; url: string; } export interface MediaEpisode extends BaseEntity { description: string; duration: number; sourceLink: string; sourceType: 'HLS' | 'MP4'; subtitles: SubtitleTrack[]; thumbnail: string; episodeNumber: number; skipIntro?: TimeRange | null; nextEpisodeAt?: number | null; publishDate?: string | null; } export interface MediaSeason extends BaseEntity { order: number; seasonNumber?: number; episodes: MediaEpisode[] | null; isActive: boolean; createdBy: string; } export interface MediaTrack extends BaseEntity { description: string; duration: number; thumbnail: string; type: 'movie' | 'series' | 'live_stream'; isTrailer?: boolean; sourceType: 'HLS' | 'MP4'; sourceLink: string; trailerSource?: string | null; episodeId?: string | null; episodeName?: string | null; episodeNumber?: number | null; seasonId?: string | null; seasonNumber?: number | null; skipIntro?: TimeRange | null; nextEpisodeAt?: number | null; subtitles?: SubtitleTrack[] | null; publishDate?: string | null; } export interface TrackSelection { index?: number; type: string; value: string | number; isExternal: boolean; title?: string; uri?: string; language?: string; } export interface IosTrackResolution { width: number | string | null; height: number | string | null; bandwidth: number; } export type SettingsAction = | 'playbackRate' | 'audioOrSubtitle' | 'settings' | 'episodes' | 'speed' | 'none'; type StateSetter<T> = (value: T) => void; export interface VideoPlayerStore { currentTime: number; setCurrentTime: StateSetter<number>; duration: number; setDuration: StateSetter<number>; isPaused: boolean; setIsPaused: StateSetter<boolean>; isBuffering: boolean; setIsBuffering: StateSetter<boolean>; resizeMode: EnumValues<ResizeMode>; setResizeMode: StateSetter<EnumValues<ResizeMode>>; playableDuration: number; setPlayableDuration: StateSetter<number>; onLoad: OnLoadData | null; setOnLoad: StateSetter<OnLoadData>; error: string | null; setError: StateSetter<string | null>; playBackRate: number; playBackRateLabel: string | null; setPlayBackRate: (rate: number, label: string) => void; controlsVisible: boolean; setControlsVisible: StateSetter<boolean>; controlsTimer: number; setControlsTimer: StateSetter<number>; selectedAudioTrack: TrackSelection | null; setSelectedAudioTrack: StateSetter<TrackSelection | null>; selectedSubtitleTrack: TrackSelection | null; setSelectedSubtitleTrack: StateSetter<TrackSelection | null>; selectedVideoTrack: { type: SelectedVideoTrackType; value: number } | null; setSelectedVideoTrack: StateSetter<{ type: SelectedVideoTrackType; value: number; } | null>; activeSubtitle: SubtitleTrack | null; setActiveSubtitle: StateSetter<SubtitleTrack | null>; activeTrack: MediaTrack | null; setActiveTrack: StateSetter<MediaTrack | null>; playList: MediaTrack[]; setPlayList: StateSetter<MediaTrack[]>; currentTrackIndex: number; setCurrentTrackIndex: StateSetter<number>; contentSeasons: MediaSeason[] | null; setContentSeasons: StateSetter<MediaSeason[] | null>; activeSeason: MediaSeason | null; setActiveSeason: StateSetter<MediaSeason | null>; settingsModal: { isVisible: boolean; action: SettingsAction; }; setSettingsModal: StateSetter<{ isVisible: boolean; action: SettingsAction; }>; maxBitRate: number | null; setMaxBitRate: StateSetter<number | null>; startWatchTime: number | null; setStartWatchTime: StateSetter<number | null>; isViewCounted: boolean; setIsViewCounted: StateSetter<boolean>; isSkipIntroVisible: boolean; setIsSkipIntroVisible: StateSetter<boolean>; isNextEpisodeVisible: boolean; setIsNextEpisodeVisible: StateSetter<boolean>; resetStore: () => void; }