* feat(VideoNativeComponent.ts): add support for cmcd configuration in VideoSrc type to enable cmcd feature on android feat(video.ts): introduce CmcdMode enum and CmcdConfiguration type to define cmcd configuration options * feat(Video.tsx): add support for CMCD configuration in Video component to handle Content Management and Delivery (CMCD) headers for Android platform. * feat(CMCDProps.kt): add CMCDProps class to handle CMCD related properties and parsing logic for React Native module * feat(CMCDConfig.kt): add CMCDConfig class to handle CMCD configuration for ExoPlayer with support for custom data and configuration options. * feat(ReactExoplayerViewManager.java): add support for CMCD configuration in ReactExoplayerViewManager to enable Content Management and Control Data (CMCD) for better video playback optimization. * feat(ReactExoplayerView.java): add support for setting CmcdConfiguration.Factory to customize CMCD configuration for media playback * feat(Source.kt): add support for CMCD properties linked to the source to enhance functionality and data handling * docs(props.mdx): add documentation for configuring CMCD parameters in the component, including usage examples and default values * refactor(ReactExoplayerViewManager.java): remove unused PROP_CMCD and prevCmcdConfig variables to clean up code and improve readability * refactor(Video.tsx): simplify cmcd configuration logic for better readability and maintainability * docs(props.mdx): improve props documentation for clarity and consistency feat(props.mdx): add definitions for CmcdMode enum and CmcdData type to enhance understanding of CMCD data structure and usage * refactor(CMCDProps.kt): refactor CMCDProps class to data class for improved readability and immutability - update CMCDProps class to use List instead of Array for properties * refactor(Video.tsx): refactor createCmcdHeader function to improve code readability and reduce duplication * fix(CMCDProps.kt): remove import statement for CmcdConfiguration * feat(ReactExoplayerView.java): add support for CMCD configuration in ReactExoplayerView component feat(ReactExoplayerViewManager.java): remove redundant CMCD configuration logic from ReactExoplayerViewManager to simplify code and improve maintainability * fix(Video.tsx): merge _cmcd memo into src memo for optimization
314 lines
7.7 KiB
TypeScript
314 lines
7.7 KiB
TypeScript
import type {ISO639_1} from './language';
|
|
import type {ReactVideoEvents} from './events';
|
|
import type {
|
|
ImageProps,
|
|
StyleProp,
|
|
ViewProps,
|
|
ViewStyle,
|
|
ImageRequireSource,
|
|
ImageURISource,
|
|
} from 'react-native';
|
|
import type {ReactNode} from 'react';
|
|
import type VideoResizeMode from './ResizeMode';
|
|
import type FilterType from './FilterType';
|
|
import type ViewType from './ViewType';
|
|
|
|
export type Headers = Record<string, string>;
|
|
|
|
export type EnumValues<T extends string | number> = T extends string
|
|
? `${T}` | T
|
|
: T;
|
|
|
|
export type ReactVideoSourceProperties = {
|
|
uri?: string;
|
|
isNetwork?: boolean;
|
|
isAsset?: boolean;
|
|
shouldCache?: boolean;
|
|
type?: string;
|
|
mainVer?: number;
|
|
patchVer?: number;
|
|
headers?: Headers;
|
|
startPosition?: number;
|
|
cropStart?: number;
|
|
cropEnd?: number;
|
|
metadata?: VideoMetadata;
|
|
drm?: Drm;
|
|
cmcd?: Cmcd; // android
|
|
textTracksAllowChunklessPreparation?: boolean;
|
|
};
|
|
|
|
export type ReactVideoSource = Readonly<
|
|
Omit<ReactVideoSourceProperties, 'uri'> & {
|
|
uri?: string | NodeRequire;
|
|
}
|
|
>;
|
|
|
|
export type ReactVideoPosterSource = ImageURISource | ImageRequireSource;
|
|
|
|
export type ReactVideoPoster = Omit<ImageProps, 'source'> & {
|
|
// prevents giving source in the array
|
|
source?: ReactVideoPosterSource;
|
|
};
|
|
|
|
export type VideoMetadata = Readonly<{
|
|
title?: string;
|
|
subtitle?: string;
|
|
description?: string;
|
|
artist?: string;
|
|
imageUri?: string;
|
|
}>;
|
|
|
|
export type DebugConfig = Readonly<{
|
|
enable?: boolean;
|
|
thread?: boolean;
|
|
}>;
|
|
|
|
export enum DRMType {
|
|
WIDEVINE = 'widevine',
|
|
PLAYREADY = 'playready',
|
|
CLEARKEY = 'clearkey',
|
|
FAIRPLAY = 'fairplay',
|
|
}
|
|
|
|
export type Drm = Readonly<{
|
|
type?: DRMType;
|
|
licenseServer?: string;
|
|
headers?: Headers;
|
|
contentId?: string; // ios
|
|
certificateUrl?: string; // ios
|
|
base64Certificate?: boolean; // ios default: false
|
|
multiDrm?: boolean; // android
|
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
getLicense?: (
|
|
spcBase64: string,
|
|
contentId: string,
|
|
licenseUrl: string,
|
|
loadedLicenseUrl: string,
|
|
) => string | Promise<string>; // ios
|
|
/* eslint-enable @typescript-eslint/no-unused-vars */
|
|
}>;
|
|
|
|
export enum CmcdMode {
|
|
MODE_REQUEST_HEADER = 0,
|
|
MODE_QUERY_PARAMETER = 1,
|
|
}
|
|
/**
|
|
* Custom key names MUST carry a hyphenated prefix to ensure that there will not be a
|
|
* namespace collision with future revisions to this specification. Clients SHOULD
|
|
* use a reverse-DNS syntax when defining their own prefix.
|
|
*
|
|
* @see https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf CTA-5004 Specification (Page 6, Section 3.1)
|
|
*/
|
|
export type CmcdData = Record<`${string}-${string}`, string | number>;
|
|
export type CmcdConfiguration = Readonly<{
|
|
mode?: CmcdMode; // default: MODE_QUERY_PARAMETER
|
|
request?: CmcdData;
|
|
session?: CmcdData;
|
|
object?: CmcdData;
|
|
status?: CmcdData;
|
|
}>;
|
|
export type Cmcd = boolean | CmcdConfiguration;
|
|
|
|
export enum BufferingStrategyType {
|
|
DEFAULT = 'Default',
|
|
DISABLE_BUFFERING = 'DisableBuffering',
|
|
DEPENDING_ON_MEMORY = 'DependingOnMemory',
|
|
}
|
|
|
|
export type BufferConfigLive = {
|
|
maxPlaybackSpeed?: number;
|
|
minPlaybackSpeed?: number;
|
|
maxOffsetMs?: number;
|
|
minOffsetMs?: number;
|
|
targetOffsetMs?: number;
|
|
};
|
|
|
|
export type BufferConfig = {
|
|
minBufferMs?: number;
|
|
maxBufferMs?: number;
|
|
bufferForPlaybackMs?: number;
|
|
bufferForPlaybackAfterRebufferMs?: number;
|
|
backBufferDurationMs?: number; // Android
|
|
maxHeapAllocationPercent?: number;
|
|
minBackBufferMemoryReservePercent?: number;
|
|
minBufferMemoryReservePercent?: number;
|
|
cacheSizeMB?: number;
|
|
live?: BufferConfigLive;
|
|
};
|
|
|
|
export enum SelectedTrackType {
|
|
SYSTEM = 'system',
|
|
DISABLED = 'disabled',
|
|
TITLE = 'title',
|
|
LANGUAGE = 'language',
|
|
INDEX = 'index',
|
|
}
|
|
|
|
export type SelectedTrack = {
|
|
type: SelectedTrackType;
|
|
value?: string | number;
|
|
};
|
|
|
|
export enum SelectedVideoTrackType {
|
|
AUTO = 'auto',
|
|
DISABLED = 'disabled',
|
|
RESOLUTION = 'resolution',
|
|
INDEX = 'index',
|
|
}
|
|
|
|
export type SelectedVideoTrack = {
|
|
type: SelectedVideoTrackType;
|
|
value?: string | number;
|
|
};
|
|
|
|
export type SubtitleStyle = {
|
|
fontSize?: number;
|
|
paddingTop?: number;
|
|
paddingBottom?: number;
|
|
paddingLeft?: number;
|
|
paddingRight?: number;
|
|
opacity?: number;
|
|
};
|
|
|
|
export enum TextTrackType {
|
|
SUBRIP = 'application/x-subrip',
|
|
TTML = 'application/ttml+xml',
|
|
VTT = 'text/vtt',
|
|
}
|
|
|
|
export type TextTracks = {
|
|
title: string;
|
|
language: ISO639_1;
|
|
type: TextTrackType;
|
|
uri: string;
|
|
}[];
|
|
|
|
export type TextTrackSelectionType =
|
|
| 'system'
|
|
| 'disabled'
|
|
| 'title'
|
|
| 'language'
|
|
| 'index';
|
|
|
|
export type SelectedTextTrack = Readonly<{
|
|
type: TextTrackSelectionType;
|
|
value?: string | number;
|
|
}>;
|
|
|
|
export type AudioTrackSelectionType =
|
|
| 'system'
|
|
| 'disabled'
|
|
| 'title'
|
|
| 'language'
|
|
| 'index';
|
|
|
|
export type SelectedAudioTrack = Readonly<{
|
|
type: AudioTrackSelectionType;
|
|
value?: string | number;
|
|
}>;
|
|
|
|
export type Chapters = {
|
|
title: string;
|
|
startTime: number;
|
|
endTime: number;
|
|
uri?: string;
|
|
};
|
|
|
|
export enum FullscreenOrientationType {
|
|
ALL = 'all',
|
|
LANDSCAPE = 'landscape',
|
|
PORTRAIT = 'portrait',
|
|
}
|
|
|
|
export enum IgnoreSilentSwitchType {
|
|
INHERIT = 'inherit',
|
|
IGNORE = 'ignore',
|
|
OBEY = 'obey',
|
|
}
|
|
|
|
export enum MixWithOthersType {
|
|
INHERIT = 'inherit',
|
|
MIX = 'mix',
|
|
DUCK = 'duck',
|
|
}
|
|
|
|
export enum PosterResizeModeType {
|
|
CONTAIN = 'contain',
|
|
CENTER = 'center',
|
|
COVER = 'cover',
|
|
NONE = 'none',
|
|
REPEAT = 'repeat',
|
|
STRETCH = 'stretch',
|
|
}
|
|
|
|
export type AudioOutput = 'speaker' | 'earpiece';
|
|
|
|
export type ControlsStyles = {
|
|
hideSeekBar?: boolean;
|
|
hideDuration?: boolean;
|
|
seekIncrementMS?: number;
|
|
};
|
|
|
|
export interface ReactVideoProps extends ReactVideoEvents, ViewProps {
|
|
source?: ReactVideoSource;
|
|
/** @deprecated */
|
|
drm?: Drm;
|
|
style?: StyleProp<ViewStyle>;
|
|
adTagUrl?: string;
|
|
audioOutput?: AudioOutput; // Mobile
|
|
automaticallyWaitsToMinimizeStalling?: boolean; // iOS
|
|
bufferConfig?: BufferConfig; // Android
|
|
bufferingStrategy?: BufferingStrategyType;
|
|
chapters?: Chapters[]; // iOS
|
|
contentStartTime?: number; // Android
|
|
controls?: boolean;
|
|
currentPlaybackTime?: number; // Android
|
|
disableFocus?: boolean;
|
|
disableDisconnectError?: boolean; // Android
|
|
filter?: EnumValues<FilterType>; // iOS
|
|
filterEnabled?: boolean; // iOS
|
|
focusable?: boolean; // Android
|
|
fullscreen?: boolean; // iOS
|
|
fullscreenAutorotate?: boolean; // iOS
|
|
fullscreenOrientation?: EnumValues<FullscreenOrientationType>; // iOS
|
|
hideShutterView?: boolean; // Android
|
|
ignoreSilentSwitch?: EnumValues<IgnoreSilentSwitchType>; // iOS
|
|
minLoadRetryCount?: number; // Android
|
|
maxBitRate?: number;
|
|
mixWithOthers?: EnumValues<MixWithOthersType>; // iOS
|
|
muted?: boolean;
|
|
paused?: boolean;
|
|
pictureInPicture?: boolean; // iOS
|
|
playInBackground?: boolean;
|
|
playWhenInactive?: boolean; // iOS
|
|
poster?: string | ReactVideoPoster; // string is deprecated
|
|
/** @deprecated use **resizeMode** key in **poster** props instead */
|
|
posterResizeMode?: EnumValues<PosterResizeModeType>;
|
|
preferredForwardBufferDuration?: number; // iOS
|
|
preventsDisplaySleepDuringVideoPlayback?: boolean;
|
|
progressUpdateInterval?: number;
|
|
rate?: number;
|
|
renderLoader?: ReactNode;
|
|
repeat?: boolean;
|
|
reportBandwidth?: boolean; //Android
|
|
resizeMode?: EnumValues<VideoResizeMode>;
|
|
showNotificationControls?: boolean; // Android, iOS
|
|
selectedAudioTrack?: SelectedTrack;
|
|
selectedTextTrack?: SelectedTrack;
|
|
selectedVideoTrack?: SelectedVideoTrack; // android
|
|
subtitleStyle?: SubtitleStyle; // android
|
|
shutterColor?: string; // Android
|
|
textTracks?: TextTracks;
|
|
testID?: string;
|
|
viewType?: ViewType;
|
|
/** @deprecated */
|
|
useTextureView?: boolean; // Android
|
|
/** @deprecated */
|
|
useSecureView?: boolean; // Android
|
|
volume?: number;
|
|
localSourceEncryptionKeyScheme?: string;
|
|
debug?: DebugConfig;
|
|
allowsExternalPlayback?: boolean; // iOS
|
|
controlsStyles?: ControlsStyles; // Android
|
|
}
|