@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
text/typescript
/**
* @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;
}