unified-video-framework
Version:
Cross-platform video player framework supporting iOS, Android, Web, Smart TVs (Samsung/LG), Roku, and more
526 lines • 14.9 kB
TypeScript
export declare enum PlatformType {
IOS = "ios",
ANDROID = "android",
TIZEN = "tizen",
WEBOS = "webos",
ROKU = "roku",
ANDROID_TV = "androidtv",
APPLE_TV = "appletv",
WEB = "web",
WINDOWS = "windows"
}
export declare enum PlayerStateEnum {
IDLE = "idle",
LOADING = "loading",
READY = "ready",
PLAYING = "playing",
PAUSED = "paused",
BUFFERING = "buffering",
ENDED = "ended",
ERROR = "error"
}
export { PlayerStateEnum as PlayerState };
export declare enum DRMType {
FAIRPLAY = "fairplay",
WIDEVINE = "widevine",
PLAYREADY = "playready",
CLEARKEY = "clearkey"
}
export interface VideoSource {
url: string;
type?: string;
title?: string;
description?: string;
thumbnail?: string;
duration?: number;
drm?: DRMConfig;
subtitles?: SubtitleTrack[];
metadata?: Record<string, any>;
}
export interface DRMConfig {
type: DRMType;
licenseUrl: string;
certificateUrl?: string;
headers?: Record<string, string>;
customData?: string;
fairplayOptions?: {
certificateUrl: string;
licenseUrl: string;
};
widevineOptions?: {
licenseUrl: string;
serverCertificate?: ArrayBuffer;
};
playreadyOptions?: {
licenseUrl: string;
customData?: string;
};
}
export interface SubtitleTrack {
id: string;
label: string;
language: string;
url?: string;
kind?: 'subtitles' | 'captions' | 'descriptions';
default?: boolean;
}
export interface AudioTrack {
id: string;
label: string;
language: string;
channels?: number;
bitrate?: number;
codec?: string;
}
export interface Quality {
id: string;
label: string;
height: number;
width: number;
bitrate: number;
frameRate?: number;
codec?: string;
}
export interface AdaptiveBitrateConfig {
minBitrate?: number;
maxBitrate?: number;
startBitrate?: number;
autoLevelEnabled?: boolean;
startLevel?: number;
}
export interface NavigationConfig {
backButton?: {
enabled?: boolean;
position?: 'top-left' | 'top-right';
icon?: 'arrow' | 'chevron' | 'custom';
customIcon?: string;
title?: string;
ariaLabel?: string;
onClick?: () => void | Promise<void>;
href?: string;
replace?: boolean;
};
closeButton?: {
enabled?: boolean;
position?: 'top-left' | 'top-right';
icon?: 'x' | 'close' | 'custom';
customIcon?: string;
title?: string;
ariaLabel?: string;
onClick?: () => void | Promise<void>;
exitFullscreen?: boolean;
closeModal?: boolean;
};
}
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 VideoPlayerConfig {
autoPlay?: boolean;
muted?: boolean;
controls?: boolean;
loop?: boolean;
preload?: 'none' | 'metadata' | 'auto';
crossOrigin?: 'anonymous' | 'use-credentials';
playsInline?: boolean;
pictureInPicture?: boolean;
controlsVisibility?: ControlsVisibilityConfig;
showFrameworkBranding?: boolean;
navigation?: NavigationConfig;
watermark?: WatermarkConfig;
share?: ShareConfig;
adaptiveBitrate?: AdaptiveBitrateConfig;
drm?: DRMConfig;
analytics?: AnalyticsConfig;
ads?: AdsConfig;
cast?: CastConfig;
offline?: OfflineConfig;
}
export interface AnalyticsConfig {
enabled: boolean;
providers: AnalyticsProvider[];
trackingInterval?: number;
customDimensions?: Record<string, any>;
}
export interface AnalyticsProvider {
name: string;
config: Record<string, any>;
track: (event: string, data: any) => void;
}
export interface AdsConfig {
enabled: boolean;
adTagUrl?: string;
adsManager?: any;
midrollPositions?: number[];
companionAds?: {
width: number;
height: number;
container: HTMLElement;
};
}
export interface CastConfig {
enabled: boolean;
receiverApplicationId?: string;
autoJoinPolicy?: 'ORIGIN_SCOPED' | 'TAB_AND_ORIGIN_SCOPED' | 'PAGE_SCOPED';
}
export interface OfflineConfig {
enabled: boolean;
storageLimit?: number;
downloadQuality?: 'auto' | 'high' | 'medium' | 'low';
}
export interface Chapter {
id: string;
title: string;
startTime: number;
endTime: number;
thumbnail?: string;
description?: string;
metadata?: Record<string, any>;
}
export interface ChapterSegment {
id: string;
startTime: number;
endTime: number;
category?: string;
action?: 'skip' | 'mute' | 'warn';
title?: string;
description?: string;
}
export interface ChapterConfig {
enabled?: boolean;
chapters?: Chapter[];
segments?: ChapterSegment[];
dataUrl?: string;
autoSkip?: boolean;
showSkipButton?: boolean;
skipButtonText?: string;
onChapterChange?: (chapter: Chapter | null) => void;
onSegmentEntered?: (segment: ChapterSegment) => void;
onSegmentExited?: (segment: ChapterSegment) => void;
onSegmentSkipped?: (segment: ChapterSegment) => void;
}
export interface WatermarkConfig {
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];
};
}
export interface PlayerMetrics {
sessionId: string;
playbackStarted?: number;
totalPlayTime: number;
bufferingCount: number;
bufferingDuration: number;
averageBitrate: number;
qualityChanges: number;
errors: PlayerError[];
bandwidth?: number;
droppedFrames?: number;
decodedFrames?: number;
}
export interface PlayerError {
code: string;
message: string;
timestamp: number;
fatal: boolean;
data?: any;
}
export interface ProgressEvent {
currentTime: number;
duration: number;
buffered: TimeRanges;
seekable: TimeRanges;
played: TimeRanges;
}
export interface TimeRanges {
length: number;
start(index: number): number;
end(index: number): number;
}
export interface PlatformInfo {
type: PlatformType;
os: string;
version: string;
isTV: boolean;
isMobile: boolean;
isDesktop?: boolean;
hasTouch?: boolean;
screenSize?: {
width: number;
height: number;
};
}
export type PlayerEvent = 'onReady' | 'onPlay' | 'onPause' | 'onEnded' | 'onError' | 'onLoadstart' | 'onLoadedMetadata' | 'onTimeUpdate' | 'onProgress' | 'onSeeking' | 'onSeeked' | 'onWaiting' | 'onCanplay' | 'onCanplaythrough' | 'onVolumeChanged' | 'onBuffering' | 'onRatechange' | 'onQualityChanged' | 'onSubtitlechange' | 'onAudiotrackchange' | 'onFullscreenChanged' | 'onPictureInPicturechange' | 'castStateChanged' | 'onAdstart' | 'onAdend' | 'onAderror' | 'onChapterchange' | 'segmententered' | 'segmentexited' | 'segmentskipped' | 'chapterSegmentEntered' | 'chapterSegmentSkipped' | 'chapterSkipButtonShown' | 'chapterSkipButtonHidden' | 'chaptersLoaded' | 'chaptersLoadError' | 'epgToggle' | 'epgDataSet' | 'frameworkBrandingClick' | 'onFreePreviewEnded' | 'statechange' | 'navigationBackClicked' | 'navigationCloseClicked' | 'creditsWatched' | 'nextEpisodeClicked' | 'creditsAutoRedirect' | 'creditsFullyWatched' | 'onLiveStreamWaiting' | 'onLiveStreamReady' | 'onLiveStreamUnavailable' | 'onBandwidthDetected' | 'onBandwidthTierChanged';
export type EventHandler = (data?: any) => void;
export interface EventEmitter {
on(event: PlayerEvent, handler: EventHandler): void;
off(event: PlayerEvent, handler: EventHandler): void;
once(event: PlayerEvent, handler: EventHandler): void;
emit(event: PlayerEvent, data?: any): void;
removeAllListeners(event?: PlayerEvent): void;
}
export type PlayerEvents = {
[K in PlayerEvent]: K;
};
export interface VideoPlayerInterface {
load(source: VideoSource): Promise<void>;
play(): Promise<void>;
pause(): void;
seek(position: number): void;
setVolume(volume: number): void;
getCurrentTime(): number;
getDuration(): number;
getVolume(): number;
isMuted(): boolean;
mute(): void;
unmute(): void;
setPlaybackRate(rate: number): void;
getPlaybackRate(): number;
enterFullscreen(): void;
exitFullscreen(): void;
enterPictureInPicture(): void;
exitPictureInPicture(): void;
on(event: string, handler: Function): void;
off(event: string, handler: Function): void;
destroy(): void;
getState(): VideoPlayerState;
}
export type VideoPlayerState = 'idle' | 'loading' | 'ready' | 'playing' | 'paused' | 'buffering' | 'ended' | 'error';
export interface IVideoPlayer {
initialize(container: any, config?: PlayerConfig): Promise<void>;
destroy(): Promise<void>;
load(videoSource: 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(): PlayerStateInterface;
isPlaying(): boolean;
isPaused(): boolean;
isEnded(): boolean;
enterFullscreen(): Promise<void>;
exitFullscreen(): Promise<void>;
toggleFullscreen(): Promise<void>;
enterPictureInPicture(): Promise<void>;
exitPictureInPicture(): Promise<void>;
on(event: PlayerEvent, handler: EventHandler): void;
off(event: PlayerEvent, handler?: EventHandler): void;
once(event: PlayerEvent, handler: EventHandler): void;
getSubtitles(): SubtitleTrack[];
setSubtitleTrack(index: number): void;
disableSubtitles(): void;
}
export interface PlayerStateInterface {
isPlaying: boolean;
isPaused: boolean;
isBuffering: boolean;
isEnded: boolean;
isError: boolean;
currentTime: number;
duration: number;
bufferedPercentage: number;
volume: number;
isMuted: boolean;
playbackRate: number;
currentQuality: Quality | null;
availableQualities: Quality[];
}
export interface PaywallConfig {
enabled?: boolean;
apiBase?: string;
userId?: string;
videoId?: string;
gateways?: (string | PaywallGateway)[];
pricing?: {
amount?: number;
currency?: string;
title?: string;
description?: string;
};
branding?: {
title?: string;
description?: string;
brandColor?: string;
paymentTitle?: string;
};
popup?: {
width?: number;
height?: number;
};
metadata?: {
slug?: string;
[key: string]: any;
};
paymentLink?: {
endpoint: string;
method?: 'POST' | 'GET';
headers?: Record<string, string>;
mapRequest?: (paymentData: any) => any;
mapResponse?: (response: any) => {
url: string;
orderId?: string;
};
popup?: {
width?: number;
height?: number;
features?: string;
};
};
emailAuth?: {
enabled?: boolean;
skipIfAuthenticated?: boolean;
api?: {
requestOtp?: string;
verifyOtp?: string;
refreshToken?: string;
logout?: string;
};
sessionStorage?: {
tokenKey?: string;
refreshTokenKey?: string;
userIdKey?: string;
emailKey?: string;
};
requestPayload?: {
[key: string]: any;
};
ui?: {
title?: string;
description?: string;
emailPlaceholder?: string;
otpPlaceholder?: string;
submitButtonText?: string;
resendButtonText?: string;
resendCooldown?: number;
verifyButtonText?: string;
brandColor?: string;
allowBackdropClose?: boolean;
showCancelButton?: boolean;
placeholderColor?: string;
};
validation?: {
otpLength?: number;
otpTimeout?: number;
rateLimiting?: {
maxAttempts?: number;
windowMinutes?: number;
};
};
};
access?: {
statusMessage?: string;
showRegisterBtn?: boolean;
showSubscribeBtn?: boolean;
showRentBtn?: boolean;
rentUrl?: string;
subscribeUrl?: string;
onLoginClick?: () => void;
allowGuest?: boolean;
};
}
export interface PaywallGateway {
id: string;
name: string;
description?: string;
icon?: string;
color?: string;
}
export interface AdaptiveBitrateConfig {
startBitrate?: number;
}
export interface PlayerConfig extends VideoPlayerConfig {
freeDuration?: number;
paywall?: PaywallConfig;
volume?: number;
chapters?: ChapterConfig;
thumbnailPreview?: ThumbnailPreviewConfig;
adaptiveBitrate?: AdaptiveBitrateConfig;
liveBufferingTimeout?: number;
settings?: {
enabled?: boolean;
speed?: boolean;
quality?: boolean;
subtitles?: boolean;
};
}
export interface ThumbnailPreviewConfig {
enabled?: boolean;
generationImage?: {
[imageUrl: string]: string;
};
style?: {
width?: number;
height?: number;
borderRadius?: number;
};
preloadImages?: boolean;
showTimeInThumbnail?: boolean;
}
//# sourceMappingURL=interfaces.d.ts.map