@jwplayer/jwplayer-react-native
Version:
React-native Android/iOS plugin for JWPlayer SDK (https://www.jwplayer.com/)
592 lines (510 loc) • 12.2 kB
TypeScript
/**
* Unified JWPlayer React Native Configuration Types
*
* This file provides a unified configuration interface that works across
* both iOS (JWJSONParser) and Android (JsonHelper) platforms.
*
* Platform-specific features are clearly marked with @platform tags.
*
* @see iOS Parser: ios-json-parser/jwplayer-config.d.ts
* @see Android Parser: android-json-parser/jwplayer-config-types.d.ts
*/
import { JWAdvertisingConfig } from './advertising';
import { JWPlaylistItem, JWSource, JWTrack, Playlist } from './playlist';
import {
AudioSessionCategory,
AudioSessionCategoryOptions,
AudioSessionMode,
JWStyling,
JWUiConfig,
JWLogoView,
JWRelatedConfig,
Stretching,
ThumbnailPreview,
Preload,
InterfaceBehavior,
UIGroup,
NextUpStyle,
JWExternalPlaybackSettings,
} from './platform-specific';
/**
* Unified JWPlayer Configuration
*
* Main configuration interface supporting both iOS and Android platforms.
* Uses native JSON parsers: JWJSONParser (iOS) and JsonHelper (Android)
*
* @platforms iOS, Android
*
* @example Basic Video
* ```typescript
* const config: JWPlayerConfig = {
* license: 'YOUR_LICENSE_KEY',
* file: 'https://example.com/video.m3u8',
* autostart: true
* };
* ```
*
* @example With IMA DAI (Cross-Platform)
* ```typescript
* const config: JWPlayerConfig = {
* license: 'YOUR_LICENSE_KEY',
* file: 'https://example.com/video.m3u8',
* advertising: {
* client: 'dai',
* imaDaiSettings: {
* videoId: 'tears-of-steel',
* cmsId: '2528370'
* }
* }
* };
* ```
*/
export interface JWPlayerConfig {
// ========== REQUIRED ==========
/**
* Platform-specific license key
*
* This is required for the wrapper but not parsed by native JSON parsers.
* You must provide the correct license for each platform.
*
* @see https://docs.jwplayer.com/players/docs/android-overview#requirements
* @see https://docs.jwplayer.com/players/docs/ios-overview#requirements
*/
license: string;
// ========== MEDIA CONTENT (Both platforms) ==========
/**
* URL of a single media file
*
* Use this for a single video configuration.
* Mutually exclusive with `sources` and `playlist`.
*
* @platforms iOS, Android
*/
file?: string;
/**
* Array of video sources for multiple quality levels
*
* Use this for a single video with multiple renditions.
* Mutually exclusive with `file` and `playlist`.
*
* @platforms iOS, Android
*/
sources?: JWSource[];
/**
* Array of playlist items or URL string pointing to a playlist feed
*
* Use this for multiple videos or a remote playlist.
* Mutually exclusive with `file` and `sources`.
*
* @platforms iOS, Android
*/
playlist?: Playlist;
/**
* Index of playlist item to start with (0-based)
*
* @default 0
* @platforms iOS, Android
*/
playlistIndex?: number;
// ========== PLAYBACK SETTINGS (Both platforms) ==========
/**
* Whether the video should start playing automatically
*
* @default false
* @platforms iOS, Android
*/
autostart?: boolean;
/**
* Whether to mute audio initially
*
* @default false
* @platforms iOS, Android
*/
mute?: boolean;
/**
* Whether content should repeat after it's done playing
*
* @default false
* @platforms iOS, Android
*/
repeat?: boolean;
/**
* Preload behavior for content
* - "auto": Loads the manifest before playback (default)
* - "none": Doesn't preload content
*
* @default "auto"
* @platforms iOS, Android
*/
preload?: Preload | boolean;
/**
* Video stretching mode
*
* @platforms iOS, Android
*/
stretching?: Stretching;
/**
* Array of playback speed rates available in the player
* Must be between 0.25 and 4.0
*
* @example [0.5, 0.75, 1, 1.25, 1.5, 2]
* @platforms iOS, Android
*/
playbackRates?: number[];
/**
* Whether to show playback rate controls
*
* @default false
* @platforms iOS, Android
*/
playbackRateControls?: boolean;
/**
* Maximum bitrate (in bits per second) for automatic quality switching
*
* Useful for limiting bandwidth consumption.
*
* @platforms iOS, Android
*/
bitrateUpperBound?: number;
// ========== ADVERTISING (Both platforms) ==========
/**
* Advertising configuration
*
* Supports multiple ad clients: VAST, VMAP, Google IMA, Google DAI
*
* @platforms iOS, Android
*/
advertising?: JWAdvertisingConfig;
// ========== RELATED CONTENT (Both platforms) ==========
/**
* Related content configuration
*
* Controls the display and behavior of recommended content.
*
* @platforms iOS, Android
*/
related?: JWRelatedConfig;
// ========== PLAYER IDENTIFICATION (Both platforms) ==========
/**
* Player ID for JWPlayer Dashboard analytics
*
* Must be an 8-character alphanumeric string.
* Also accepted as "playerId".
*
* @platforms iOS, Android
*/
pid?: string;
/**
* Alternative naming for pid
*
* @platforms iOS, Android
*/
playerId?: string;
// ========== DISPLAY SETTINGS ==========
/**
* Whether to display the title in the player UI
*
* @platform android
*/
displaytitle?: boolean;
/**
* Alternative camelCase naming for displaytitle
*
* @platform android
*/
displayTitle?: boolean;
/**
* Whether to display the description in the player UI
*
* @platforms iOS, Android
*/
displaydescription?: boolean;
/**
* Alternative camelCase naming for displaydescription
*
* @platforms iOS, Android
*/
displayDescription?: boolean;
/**
* Next up offset - when to show the next up overlay
* Can be a number (seconds) or string with % (percentage)
*
* @platforms iOS, Android
*/
nextupoffset?: string | number;
/**
* Next up style configuration
*
* @platform ios
*/
nextUpStyle?: NextUpStyle;
/**
* Thumbnail preview quality level
*
* @platform android
*/
thumbnailPreview?: ThumbnailPreview;
/**
* Logo view configuration
*
* @platforms iOS, Android
*/
logoView?: JWLogoView;
// ========== STYLING (iOS only) ==========
/**
* Styling configuration for iOS
*
* Controls colors, fonts, captions styling, etc.
*
* Note: Android requires overloading of JWP IDs using XML styling.
* @see https://docs.jwplayer.com/players/docs/android-styling-guide
*
* @platform ios
*/
styling?: JWStyling;
// ========== UI CONFIGURATION (Android only) ==========
/**
* UI configuration for Android
*
* Controls which UI elements are visible.
* When using this, specify all elements - unspecified default to false.
*
* @platform android
*/
uiConfig?: JWUiConfig;
/**
* Whether to show player controls
*
* @default true
* @platforms iOS, Android
*/
controls?: boolean;
// ========== AUDIO SESSION (iOS only) ==========
/**
* Enable background audio playback
*
* @platform ios
*/
backgroundAudioEnabled?: boolean;
/**
* Audio session category
*
* Controls how the app's audio interacts with other audio.
*
* @platform ios
*/
category?: AudioSessionCategory;
/**
* Audio session category options
*
* Modifies the behavior of the audio session category.
*
* @platform ios
*/
categoryOptions?: AudioSessionCategoryOptions[];
/**
* Audio session mode
*
* Specialized modes for specific use cases.
*
* @platform ios
*/
mode?: AudioSessionMode;
/**
* Interface behavior mode
*
* @platform ios
*/
interfaceBehavior?: InterfaceBehavior;
/**
* Delay before interface fades out (in seconds)
*
* @platform ios
*/
interfaceFadeDelay?: number;
/**
* UI groups to hide
*
* @platform ios
*/
hideUIGroups?: UIGroup[];
/**
* FairPlay certificate URL for DRM
*
* @platform ios
*/
fairplayCertUrl?: string;
/**
* Alternative naming for fairplayCertUrl
*
* @platform ios
*/
certificateUrl?: string;
/**
* Process SPC URL for FairPlay DRM
*
* @platform ios
*/
processSpcUrl?: string;
/**
* Content UUID for DRM
*
* @platform ios
*/
contentUUID?: string;
/**
* View-only mode (no interaction)
*
* @platform ios
*/
viewOnly?: boolean;
/**
* Offline message to display when offline
*
* @platform ios
*/
offlineMessage?: string;
/**
* Offline image to display when offline
*
* @platform ios
*/
offlineImage?: string;
/**
* Force fullscreen when device is in landscape
*
* @platform ios
*/
forceFullScreenOnLandscape?: boolean;
/**
* Force landscape when entering fullscreen
*
* @platform ios
*/
forceLandscapeOnFullScreen?: boolean;
/**
* External playback settings (AirPlay)
*
* @platform ios
*/
externalPlaybackSettings?: JWExternalPlaybackSettings;
// ========== ANDROID-SPECIFIC ==========
/**
* Use TextureView instead of SurfaceView
*
* @platform android
*/
useTextureView?: boolean;
/**
* Allow cross-protocol redirects (HTTP to HTTPS)
*
* @platform android
*/
allowCrossProtocolRedirectsSupport?: boolean;
// ========== WRAPPER-SPECIFIC (Not in JSON parsers) ==========
/**
* Force use of legacy configuration builder instead of JSON parser
*
* When true, bypasses native JSON parsers and uses custom builder logic.
*
* @default false
*/
forceLegacyConfig?: boolean;
/**
* Enable playlist item callback functionality
*
* If true, `onBeforeNextPlaylistItem` MUST be implemented with
* `player.resolveNextPlaylistItem()` called in the callback or content will hang.
*
* @default false
*/
playlistItemCallbackEnabled?: boolean;
/**
* Whether player is displayed in a modal
*
* Affects fullscreen behavior.
*/
playerInModal?: boolean;
/**
* Enter fullscreen when device rotates to landscape
*/
fullScreenOnLandscape?: boolean;
/**
* Rotate device to landscape when entering fullscreen
*/
landscapeOnFullScreen?: boolean;
/**
* Rotate device to portrait when exiting fullscreen
*/
portraitOnExitFullScreen?: boolean;
/**
* Exit fullscreen when device rotates to portrait
*/
exitFullScreenOnPortrait?: boolean;
/**
* Enable lock screen controls (iOS)
*
* @platform ios
*/
enableLockScreenControls?: boolean;
/**
* Enable Picture-in-Picture support
*/
pipEnabled?: boolean;
// ========== LEGACY PROPERTIES (for single-item configs) ==========
// These are applied when using `file` or `sources` instead of `playlist`
/**
* Title of the media item
*/
title?: string;
/**
* Description of the media item
*/
description?: string;
/**
* URL of the poster image
*/
image?: string;
/**
* Array of caption, thumbnail, or chapter tracks
*/
tracks?: JWTrack[];
/**
* Start time in seconds
*/
starttime?: number;
/**
* Media identifier
*/
mediaid?: string;
/**
* Alternative camelCase naming for mediaid
*/
mediaId?: string;
}
/**
* Type guard to check if advertising config is IMA DAI
*/
export function isImaDaiAdvertising(
advertising: JWAdvertisingConfig
): advertising is import('./advertising').ImaDaiAdvertisingConfig {
return (
advertising.client === 'dai' ||
advertising.client === 'GoogleIMADAI' ||
advertising.client === 'IMA_DAI'
);
}
/**
* Type guard to check if playlist is an array of items
*/
export function isPlaylistArray(
playlist: Playlist
): playlist is JWPlaylistItem[] {
return Array.isArray(playlist);
}
/**
* Type guard to check if playlist is a URL string
*/
export function isPlaylistUrl(playlist: Playlist): playlist is string {
return typeof playlist === 'string';
}