unified-video-framework
Version:
Cross-platform video player framework supporting iOS, Android, Web, Smart TVs (Samsung/LG), Roku, and more
440 lines • 14 kB
TypeScript
import React from 'react';
import type { CSSProperties } from 'react';
import type { SubtitleTrack, VideoMetadata, ControlsVisibilityConfig } from '../../core/dist';
import { WebPlayer } from '../WebPlayer';
import type { EPGData, EPGConfig, EPGProgram, EPGProgramRow } from './types/EPGTypes';
import type { VCManifest, VCProduct, VCEvent } from './types/VideoCommerceTypes';
import type { FlashNewsTickerConfig } from './types/FlashNewsTickerTypes';
import type { ThumbnailPreviewConfig } from './types/ThumbnailPreviewTypes';
import type { PlaylistConfig } from './types/PlaylistTypes';
export interface ChapterAPI {
loadChapters: (chapters: any) => Promise<void>;
loadChaptersFromUrl: (url: string) => Promise<void>;
getCurrentSegment: () => any | null;
skipToSegment: (segmentId: string) => void;
getSegments: () => any[];
updateChapterConfig: (config: any) => void;
hasChapters: () => boolean;
getChapters: () => any | null;
getCoreChapters: () => any[];
getCoreSegments: () => any[];
getCurrentChapterInfo: () => any | null;
seekToChapter: (chapterId: string) => void;
getNextChapter: () => any | null;
getPreviousChapter: () => any | null;
}
export interface QualityAPI {
getQualities: () => any[];
getCurrentQuality: () => any | null;
setQuality: (index: number) => void;
setAutoQuality: (enabled: boolean) => void;
}
export interface EPGControlAPI {
setEPGData: (data: any) => void;
showEPGButton: () => void;
hideEPGButton: () => void;
isEPGButtonVisible: () => boolean;
}
export interface UIHelperAPI {
focusPlayer: () => void;
showFullscreenTip: () => void;
triggerFullscreenButton: () => void;
showTemporaryMessage: (message: string) => void;
showFullscreenInstructions: () => void;
enterFullscreenSynchronously: () => void;
}
export interface FullscreenAPI {
enterFullscreen: () => Promise<void>;
exitFullscreen: () => Promise<void>;
toggleFullscreen: () => Promise<void>;
enterPictureInPicture: () => Promise<void>;
exitPictureInPicture: () => Promise<void>;
}
export interface PlaybackAPI {
play: () => Promise<void>;
pause: () => void;
requestPause: () => void;
seek: (time: number) => void;
setVolume: (level: number) => void;
mute: () => void;
unmute: () => void;
toggleMute: () => void;
setPlaybackRate: (rate: number) => void;
getPlaybackRate: () => number;
getCurrentTime: () => number;
getDuration: () => number;
getState: () => any;
}
export type WebPlayerViewProps = {
autoPlay?: boolean;
muted?: boolean;
volume?: number;
controls?: boolean;
loop?: boolean;
preload?: 'none' | 'metadata' | 'auto';
crossOrigin?: 'anonymous' | 'use-credentials';
playsInline?: boolean;
defaultQuality?: number;
enableAdaptiveBitrate?: boolean;
adaptiveBitrate?: {
startBitrate?: number;
minBitrate?: number;
maxBitrate?: number;
};
debug?: boolean;
startTime?: number;
freeDuration?: number;
isLive?: boolean;
liveWaitingMessages?: {
waitingForStream?: string;
loading?: string;
comingBack?: string;
};
liveMessageRotationInterval?: number;
liveRetryInterval?: number;
liveMaxRetryAttempts?: number;
liveBufferingTimeout?: number;
liveCountdown?: {
nextProgramStartTime?: number;
noProgramMessage?: string;
countdownMessage?: string;
timerColor?: string;
onCountdownComplete?: () => void;
autoReloadOnComplete?: boolean;
updateInterval?: number;
};
commerce?: {
manifest?: VCManifest;
manifestUrl?: string;
autoOpenPanel?: boolean;
onEvent?: (evt: VCEvent) => void;
onProductClick?: (p: VCProduct) => void;
};
youtubeNativeControls?: boolean;
controlsVisibility?: ControlsVisibilityConfig;
settings?: {
enabled?: boolean;
speed?: boolean;
quality?: boolean;
subtitles?: boolean;
};
qualityFilter?: {
allowedHeights?: number[];
allowedLabels?: string[];
minHeight?: number;
maxHeight?: number;
};
premiumQualities?: {
enabled?: boolean;
requiredHeights?: number[];
requiredLabels?: string[];
minPremiumHeight?: number;
isPremiumUser?: boolean;
premiumLabel?: string;
onPremiumQualityClick?: (quality: {
height: number;
label: string;
}) => void;
unlockUrl?: string;
};
showFrameworkBranding?: boolean;
share?: {
enabled?: boolean;
url?: string;
title?: string;
text?: string;
generateUrl?: (videoData: {
videoId?: string;
metadata?: any;
}) => string;
};
watermark?: boolean | {
enabled?: boolean;
text?: string;
showTime?: boolean;
updateInterval?: number;
randomPosition?: boolean;
position?: {
x?: number | 'left' | 'center' | 'right' | 'random';
y?: number | 'top' | 'center' | 'bottom' | 'random';
};
style?: {
fontSize?: number;
fontFamily?: string;
opacity?: number;
color?: string;
gradientColors?: [string, string];
};
};
paywall?: import('../../core/dist').PaywallConfig;
paywallConfigUrl?: string;
emailAuth?: {
enabled?: boolean;
skipIfAuthenticated?: boolean;
apiEndpoints?: {
requestOtp?: string;
verifyOtp?: string;
refreshToken?: string;
logout?: string;
};
sessionStorage?: {
tokenKey?: string;
refreshTokenKey?: string;
userIdKey?: 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;
};
};
};
url: string;
type?: 'mp4' | 'hls' | 'dash' | 'webm' | 'auto';
subtitles?: SubtitleTrack[];
metadata?: VideoMetadata;
fallbackSources?: Array<{
url: string;
type?: 'mp4' | 'hls' | 'dash' | 'webm' | 'auto';
priority?: number;
}>;
fallbackPoster?: string;
fallbackShowErrorMessage?: boolean;
fallbackRetryDelay?: number;
fallbackRetryAttempts?: number;
onAllSourcesFailed?: (errors: Array<{
url: string;
error: any;
}>) => void;
cast?: boolean;
className?: string;
style?: CSSProperties;
playerTheme?: string | {
accent?: string;
accent2?: string;
iconColor?: string;
textPrimary?: string;
textSecondary?: string;
};
responsive?: {
enabled?: boolean;
aspectRatio?: number;
maxWidth?: string;
maxHeight?: string;
breakpoints?: {
mobile?: number;
tablet?: number;
};
mobilePortrait?: {
maxHeight?: string;
aspectRatio?: number;
};
mobileLandscape?: {
maxHeight?: string;
aspectRatio?: number;
};
tablet?: {
maxWidth?: string;
maxHeight?: string;
};
};
settingsScrollbar?: {
style?: 'default' | 'compact' | 'overlay';
widthPx?: number;
intensity?: number;
};
autoFocusPlayer?: boolean;
showFullscreenTipOnMount?: boolean;
playerRef?: React.RefObject<WebPlayer>;
onChapterAPI?: (api: ChapterAPI) => void;
onQualityAPI?: (api: QualityAPI) => void;
onEPGAPI?: (api: EPGControlAPI) => void;
onUIHelperAPI?: (api: UIHelperAPI) => void;
onFullscreenAPI?: (api: FullscreenAPI) => void;
onPlaybackAPI?: (api: PlaybackAPI) => void;
onReady?: (player: WebPlayer) => void;
onError?: (error: unknown) => void;
onPlay?: () => void;
onPause?: () => void;
onEnded?: () => void;
onTimeUpdate?: (data: {
currentTime: number;
duration: number;
}) => void;
onProgress?: (data: {
buffered: number;
}) => void;
onVolumeChange?: (data: {
volume: number;
muted: boolean;
}) => void;
onQualityChange?: (quality: any) => void;
onBuffering?: (isBuffering: boolean) => void;
onFullscreenChange?: (isFullscreen: boolean) => void;
onPictureInPictureChange?: (isPiP: boolean) => void;
onLiveStreamWaiting?: () => void;
onLiveStreamReady?: () => void;
onLiveStreamUnavailable?: (data: {
reason: string;
attempts: number;
}) => void;
onBandwidthDetected?: (data: {
bandwidth: number | null;
tier: string;
method: string;
}) => void;
onBandwidthTierChanged?: (data: {
tier: string;
bandwidth: number | null;
}) => void;
epg?: EPGData;
epgConfig?: Partial<EPGConfig>;
showEPG?: boolean;
onToggleEPG?: (visible: boolean) => void;
onEPGFavorite?: (program: EPGProgram, channel: EPGProgramRow) => void | Promise<void>;
onEPGRecord?: (program: EPGProgram, channel: EPGProgramRow) => void | Promise<void>;
onEPGSetReminder?: (program: EPGProgram, channel: EPGProgramRow) => void | Promise<void>;
onEPGCatchup?: (program: EPGProgram, channel: EPGProgramRow) => void | Promise<void>;
onEPGProgramSelect?: (program: EPGProgram, channel: EPGProgramRow) => void;
onEPGChannelSelect?: (channel: EPGProgramRow) => void;
chapters?: {
enabled?: boolean;
data?: {
videoId: string;
duration: number;
segments: Array<{
id: string;
type: 'intro' | 'recap' | 'content' | 'credits' | 'ad' | 'sponsor' | 'offensive';
startTime: number;
endTime: number;
title: string;
skipLabel?: string;
description?: string;
thumbnail?: string;
autoSkip?: boolean;
autoSkipDelay?: number;
metadata?: Record<string, any>;
}>;
};
dataUrl?: string;
autoHide?: boolean;
autoHideDelay?: number;
showChapterMarkers?: boolean;
skipButtonPosition?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
customStyles?: {
skipButton?: {
backgroundColor?: string;
borderColor?: string;
textColor?: string;
fontSize?: string;
borderRadius?: string;
padding?: string;
fontWeight?: string;
};
progressMarkers?: {
intro?: string;
recap?: string;
credits?: string;
ad?: string;
};
};
userPreferences?: {
autoSkipIntro?: boolean;
autoSkipRecap?: boolean;
autoSkipCredits?: boolean;
showSkipButtons?: boolean;
skipButtonTimeout?: number;
rememberChoices?: boolean;
resumePlaybackAfterSkip?: boolean;
};
};
navigation?: {
backButton?: {
enabled?: boolean;
icon?: 'arrow' | 'chevron' | 'custom';
customIcon?: string;
title?: string;
ariaLabel?: string;
onClick?: () => void | Promise<void>;
href?: string;
replace?: boolean;
};
closeButton?: {
enabled?: boolean;
icon?: 'x' | 'close' | 'custom';
customIcon?: string;
title?: string;
ariaLabel?: string;
onClick?: () => void | Promise<void>;
exitFullscreen?: boolean;
closeModal?: boolean;
};
};
onNavigationBackClicked?: () => void;
onNavigationCloseClicked?: () => void;
googleAds?: {
adTagUrl: string;
midrollTimes?: number[];
liveAdBreakMode?: 'periodic' | 'manual';
periodicAdInterval?: number;
syncToLiveEdge?: boolean;
pauseStreamDuringAd?: boolean;
liveEdgeOffset?: number;
companionAdSlots?: Array<{
containerId: string;
width: number;
height: number;
}>;
onAdStart?: () => void;
onAdEnd?: () => void;
onAdError?: (error: any) => void;
onAllAdsComplete?: () => void;
onAdCuePoints?: (cuePoints: number[]) => void;
};
onChapterChange?: (chapter: any) => void;
onSegmentEntered?: (segment: any) => void;
onSegmentExited?: (segment: any) => void;
onSegmentSkipped?: (segment: any) => void;
onChapterSegmentEntered?: (data: {
segment: any;
timestamp: number;
}) => void;
onChapterSegmentSkipped?: (data: {
fromSegment: any;
toSegment?: any;
timestamp: number;
}) => void;
onChapterSkipButtonShown?: (data: {
segment: any;
position: string;
}) => void;
onChapterSkipButtonHidden?: (data: {
segment: any;
reason: string;
}) => void;
onChaptersLoaded?: (data: {
segmentCount: number;
chapters: any[];
}) => void;
onChaptersLoadError?: (data: {
error: Error;
url?: string;
}) => void;
flashNewsTicker?: FlashNewsTickerConfig;
thumbnailPreview?: ThumbnailPreviewConfig;
playlist?: PlaylistConfig;
};
export declare const WebPlayerView: React.FC<WebPlayerViewProps>;
export default WebPlayerView;
//# sourceMappingURL=WebPlayerView.d.ts.map