unified-video-framework
Version:
Cross-platform video player framework supporting iOS, Android, Web, Smart TVs (Samsung/LG), Roku, and more
321 lines • 9.07 kB
TypeScript
export interface FallbackSource {
url: string;
type?: 'mp4' | 'hls' | 'dash' | 'webm' | 'auto';
priority?: number;
}
export interface VideoSource {
url: string;
type?: 'mp4' | 'hls' | 'dash' | 'webm' | 'auto';
drm?: DRMConfig;
subtitles?: SubtitleTrack[];
metadata?: VideoMetadata;
fallbackSources?: FallbackSource[];
fallbackPoster?: string;
fallbackShowErrorMessage?: boolean;
fallbackRetryDelay?: number;
fallbackRetryAttempts?: number;
onAllSourcesFailed?: (errors: Array<{
url: string;
error: any;
}>) => void;
}
export interface DRMConfig {
licenseUrl: string;
certificateUrl?: string;
headers?: Record<string, string>;
type: 'widevine' | 'playready' | 'fairplay' | 'clearkey';
}
export interface SubtitleTrack {
url: string;
language: string;
label: string;
kind: 'subtitles' | 'captions' | 'descriptions';
default?: boolean;
}
export interface VideoMetadata {
id?: string;
videoId?: string;
title?: string;
description?: string;
duration?: number;
thumbnailUrl?: string;
posterUrl?: string;
}
export interface Quality {
height: number;
width: number;
bitrate: number;
label: string;
index: number;
}
export interface PlayerState {
isPlaying: boolean;
isPaused: boolean;
isBuffering: boolean;
isEnded: boolean;
isError: boolean;
currentTime: number;
duration: number;
bufferedPercentage: number;
volume: number;
isMuted: boolean;
playbackRate: number;
currentQuality?: Quality;
availableQualities: Quality[];
}
export interface PlayerEvents {
onReady?: () => void;
onPlay?: () => void;
onPause?: () => void;
onEnded?: () => void;
onTimeUpdate?: (time: number) => void;
onBuffering?: (isBuffering: boolean) => void;
onError?: (error: PlayerError) => void;
onQualityChanged?: (quality: Quality) => void;
onVolumeChanged?: (volume: number) => void;
onFullscreenChanged?: (isFullscreen: boolean) => void;
onProgress?: (buffered: number) => void;
onSeeking?: () => void;
onSeeked?: () => void;
onLoadedMetadata?: (metadata: VideoMetadata) => void;
onFreePreviewEnded?: () => void;
epgToggle?: (data?: any) => void;
epgDataSet?: (data?: any) => void;
frameworkBrandingClick?: (data: {
timestamp: number;
url: string;
userAgent: string;
}) => void;
chapterchange?: (chapter: any) => void;
segmententered?: (segment: any) => void;
segmentexited?: (segment: any) => void;
segmentskipped?: (segment: any) => void;
chapterSegmentEntered?: (data: any) => void;
chapterSegmentSkipped?: (data: any) => void;
chapterSkipButtonShown?: (data: any) => void;
chapterSkipButtonHidden?: (data: any) => void;
chaptersLoaded?: (data: any) => void;
chaptersLoadError?: (data: any) => void;
navigationBackClicked?: () => void;
navigationCloseClicked?: () => void;
onLiveStreamWaiting?: () => void;
onLiveStreamReady?: () => void;
onBandwidthDetected?: (data: {
bandwidth: number | null;
tier: string;
method: string;
}) => void;
onBandwidthTierChanged?: (data: {
tier: string;
bandwidth: number | null;
}) => void;
}
export interface PlayerError {
code: string;
message: string;
type: 'network' | 'media' | 'drm' | 'unknown';
fatal: boolean;
details?: any;
}
export interface PaywallConfig {
enabled: boolean;
apiBase: string;
userId: string;
videoId: string;
gateways: Array<'stripe' | 'cashfree'>;
branding?: {
title?: string;
description?: string;
logoUrl?: string;
theme?: any;
};
popup?: {
width?: number;
height?: number;
};
emailAuth?: {
enabled: boolean;
skipIfAuthenticated?: boolean;
sessionStorage?: {
tokenKey?: string;
refreshTokenKey?: string;
userIdKey?: string;
};
api?: {
requestOtp: string;
verifyOtp: string;
refreshToken?: string;
logout?: string;
};
ui?: {
title?: string;
description?: string;
emailPlaceholder?: string;
otpPlaceholder?: string;
submitButtonText?: string;
resendButtonText?: string;
resendCooldown?: number;
};
validation?: {
otpLength?: number;
otpTimeout?: number;
rateLimiting?: {
maxAttempts?: number;
windowMinutes?: number;
};
};
};
}
export interface ShareConfig {
enabled?: boolean;
url?: string;
title?: string;
text?: string;
generateUrl?: (videoData: {
videoId?: string;
metadata?: any;
}) => string;
}
export interface ControlsVisibilityConfig {
playback?: {
centerPlayButton?: boolean;
playPauseButton?: boolean;
skipButtons?: boolean;
previousButton?: boolean;
nextButton?: boolean;
};
audio?: {
volumeButton?: boolean;
volumeSlider?: boolean;
};
progress?: {
progressBar?: boolean;
timeDisplay?: boolean;
};
quality?: {
badge?: boolean;
settingsButton?: boolean;
};
display?: {
fullscreenButton?: boolean;
pipButton?: boolean;
};
features?: {
epgButton?: boolean;
playlistButton?: boolean;
castButton?: boolean;
shareButton?: boolean;
};
chrome?: {
navigationButtons?: boolean;
frameworkBranding?: boolean;
};
}
export interface PlayerConfig {
autoPlay?: boolean;
muted?: boolean;
volume?: number;
controls?: boolean;
loop?: boolean;
preload?: 'none' | 'metadata' | 'auto';
crossOrigin?: 'anonymous' | 'use-credentials';
playsInline?: boolean;
defaultQuality?: number;
enableAdaptiveBitrate?: boolean;
debug?: boolean;
startTime?: number;
freeDuration?: number;
isLive?: boolean;
liveWaitingMessages?: {
waitingForStream?: string;
loading?: string;
comingBack?: string;
};
liveMessageRotationInterval?: number;
liveRetryInterval?: number;
liveMaxRetryAttempts?: number;
liveCountdown?: {
nextProgramStartTime?: number;
noProgramMessage?: string;
countdownMessage?: string;
timerColor?: string;
onCountdownComplete?: () => void;
autoReloadOnComplete?: boolean;
updateInterval?: number;
};
paywall?: PaywallConfig;
share?: ShareConfig;
adaptiveBitrate?: {
startBitrate?: number;
};
playlist?: {
showPrevNext?: boolean;
onPreviousTrack?: () => void;
onNextTrack?: () => void;
replaceSkipWithPrevNext?: boolean;
onPlaylistToggle?: () => void;
};
controlsVisibility?: ControlsVisibilityConfig;
settings?: {
enabled?: boolean;
speed?: boolean;
quality?: boolean;
subtitles?: boolean;
};
navigation?: {
onBack?: () => void;
onClose?: () => void;
};
showFrameworkBranding?: boolean;
fullscreenElement?: HTMLElement;
}
export interface IVideoPlayer {
initialize(container: HTMLElement | string, config?: PlayerConfig): Promise<void>;
destroy(): Promise<void>;
load(source: VideoSource): Promise<void>;
play(): Promise<void>;
pause(): void;
stop(): void;
seek(time: number): void;
setVolume(level: number): void;
mute(): void;
unmute(): void;
toggleMute(): void;
getQualities(): Quality[];
getCurrentQuality(): Quality | null;
setQuality(index: number): void;
setAutoQuality(enabled: boolean): void;
setPlaybackRate(rate: number): void;
getPlaybackRate(): number;
getCurrentTime(): number;
getDuration(): number;
getBufferedPercentage(): number;
getState(): PlayerState;
isPlaying(): boolean;
isPaused(): boolean;
isEnded(): boolean;
enterFullscreen(): Promise<void>;
exitFullscreen(): Promise<void>;
toggleFullscreen(): Promise<void>;
enterPictureInPicture(): Promise<void>;
exitPictureInPicture(): Promise<void>;
on(event: string, handler: Function): void;
off(event: string, handler?: Function): void;
once(event: string, handler: Function): void;
getSubtitles(): SubtitleTrack[];
setSubtitleTrack(index: number): void;
disableSubtitles(): void;
setAudioTrack?(index: number): void;
getAudioTracks?(): any[];
getThumbnail?(time: number): string;
getStats?(): any;
setFreeDuration?(seconds: number): void;
resetFreePreviewGate?(): void;
getBandwidthInfo?(): {
estimated: number | null;
tier: string | null;
method: string | null;
};
redetectBandwidth?(): Promise<void>;
}
//# sourceMappingURL=IVideoPlayer.d.ts.map