bitmovin-player-react-native
Version:
Official React Native bindings for Bitmovin's mobile Player SDKs.
586 lines • 18.5 kB
TypeScript
import { TimeRange, Seconds, Milliseconds } from './utils/temporal';
/**
* Enumerates all supported types of timed metadata entries.
*
* @see {@link MetadataEntry} for the full type narrowing documentation
*/
export declare enum MetadataType {
/**
* ID3 metadata embedded in the media stream.
*
* Used for timed ID3 tags such as text frames, comments, artwork,
* chapters, private frames, and other ID3v2 structures.
*
* @see {@link Id3MetadataEntry}
*/
ID3 = "ID3",
/**
* Event Message metadata as defined in ISO/IEC 23009-1.
*
* Represents MP4 Event Message boxes (`emsg`) or DASH `EventStream`
* events carrying an application- or spec-defined payload.
*
* @platform Android
* @remarks This metadata type is never emitted on iOS or tvOS, as the native
* player does not surface EMSG events on those platforms.
* @see {@link EventMessageMetadataEntry}
*/
EMSG = "EMSG",
/**
* SCTE-35 signaling extracted from HLS `#EXT-X-SCTE35` tags.
*
* Typically used for ad insertion, blackout signaling, or other
* broadcast-style cue messages.
*
* @see {@link ScteMetadataEntry}
*/
SCTE = "SCTE",
/**
* HLS `#EXT-X-DATERANGE` tags representing timed opportunities or annotations.
*
* Used for in-playlist markers such as interstitial opportunities,
* blackout windows, content labels, or other time-bounded ranges.
*
* @see {@link DateRangeMetadataEntry}
*/
DATERANGE = "DATERANGE",
/**
* Sentinel type for unsupported metadata.
*
* This value indicates that the underlying native player reported timed metadata
* at some point in the stream, but the React Native SDK does not yet map it to
* one of the supported metadata entry types of ({@link ID3}, {@link SCTE},
* {@link DATERANGE}, or {@link EMSG}).
*
* @see {@link UnsupportedMetadataEntry}
*/
Unsupported = "NONE"
}
/**
* Raw data encoded as Base64 with no `data:...;base64,` prefix.
*
* Use this type whenever the value is just the Base64 string itself, not a full
* data URI string.
*
* @example
* // Correct format:
* "SGVsbG8gV29ybGQ="
*
* @example
* // Incorrect (includes a data URI scheme — not allowed):
* "data:text/plain;base64,SGVsbG8gV29ybGQ="
*/
export type Base64Raw = string;
export type CueingOption = 'PRE' | 'POST' | 'ONCE';
interface BaseDateRangeMetadataEntry<TPlatform extends 'ios' | 'android'> {
metadataType: MetadataType.DATERANGE;
/**
* Platform discriminator for TypeScript type narrowing.
*/
platform: TPlatform;
/**
* The unique identifier for the date range.
*/
id: string;
/**
* The class associated with the date range.
*/
classLabel?: string;
/**
* The declared duration of the range in seconds.
*/
duration?: Seconds;
/**
* All the attributes associated with the date range.
*
* @example "X-ASSET-URI": "https://www.example.com"
*/
attributes: Record<string, string>;
}
/**
* Represents in-playlist timed metadata from an HLS `#EXT-X-DATERANGE` tag.
*
* @platform Android
*/
export interface AndroidDateRangeMetadataEntry extends BaseDateRangeMetadataEntry<'android'> {
/**
* Time range of the entry relative to the beginning of the playback, in seconds.
*/
relativeTimeRange: TimeRange<Seconds>;
/**
* The planned duration of the range in seconds.
*
* Used for live streams where the actual end time may not be known yet.
*/
plannedDuration?: Seconds;
/**
* Indicates whether the date range ends at the start of the next date range
* with the same {@link classLabel}.
*/
endOnNext: boolean;
}
/**
* Represents in-playlist timed metadata from an HLS `#EXT-X-DATERANGE` tag.
*
* @platform iOS, tvOS
*/
export interface IosDateRangeMetadataEntry extends BaseDateRangeMetadataEntry<'ios'> {
/**
* Time range of the entry relative to Unix Epoch, in seconds.
*
* If the metadata represents an instantaneous event, {@link TimeRange.end} should be equal
* to {@link TimeRange.start}.
* An omitted {@link TimeRange.end} indicates an open-ended range.
*/
absoluteTimeRange: TimeRange<Seconds>;
/**
* The `CUE` attribute values from an `#EXT-X-DATERANGE` tag.
*
* Empty array if the attribute is not present.
* `"PRE"` triggers before playback; `"POST"` triggers after completion; `"ONCE"` limits triggering to once.
* When multiple values are provided, the first takes precedence (e.g., `"PRE,POST"` -> `"PRE"`).
* `"PRE"` and `"POST"` are re-playable unless `"ONCE"` is included.
*
* @remarks Applies only to HLS Interstitial opportunities (pre-, mid-, post-roll).
*/
cueingOptions: CueingOption[];
}
/**
* Represents Event Message metadata according to ISO 23009-1.
*
* This is used for both MP4 Event Message boxes (`emsg`) and DASH EventStream events.
*
* @platform Android
*/
export interface EventMessageMetadataEntry {
metadataType: MetadataType.EMSG;
/** The instance identifier for this specific event occurrence. */
id: number;
/** The duration of the event in seconds. */
duration?: Seconds;
/**
* Raw event message payload encoded as Base64 with no `data:...;base64,` prefix.
*/
messageData: Base64Raw;
/**
* The message scheme URI identifying the event type.
*
* @example "urn:mpeg:dash:event:callback:2014"
*/
schemeIdUri: string;
/** The value for the event. */
value: string;
}
/**
* Typed representations of an iOS metadata value.
*
* Depending on the underlying value, one or more of these fields may be present;
* others will be `undefined`.
*/
export interface IosMetadataValue {
/**
* A text representation of the value, if available.
*/
stringValue?: string;
/**
* A numeric representation of the value, if available.
*/
numberValue?: number;
/**
* A date/time representation of the value, formatted as an ISO 8601 string, if available.
*
* @example "2025-12-02T00:00:00Z"
*/
dateValue?: string;
/**
* A binary representation of the value as Base64 data
* with no `data:...;base64,` prefix, if available.
*
* @remarks Use this accessor to retrieve encapsulated artwork, thumbnails,
* proprietary frames, or any encoded value.
*/
dataValue?: Base64Raw;
}
/**
* iOS representation of ID3 metadata items.
*
* @platform iOS, tvOS
*/
export interface IosId3Frame {
metadataType: MetadataType.ID3;
/**
* Platform discriminator for TypeScript type narrowing.
*/
platform: 'ios';
/**
* ID3 frame identifier.
*
* @example "TXXX"
*/
id?: string;
/**
* String representation of the metadata value.
*
* The underlying value is first interpreted as the most appropriate type
* (date, number, text, or binary data) and then converted to a string.
* - Dates are formatted as ISO 8601 strings (e.g. "2025-12-02T00:00:00Z").
* - Binary data is encoded as a Base64 with no `data:...;base64,` prefix.
*
* This will be `undefined` if the value cannot be interpreted.
*/
value?: string;
/**
* Full typed representation of the underlying value as reported by iOS.
*/
rawValue?: IosMetadataValue;
/**
* Time range of the entry relative to the beginning of the playback, in seconds.
*/
relativeTimeRange?: TimeRange<Seconds>;
/**
* The duration of the metadata item in seconds.
*/
duration?: Seconds;
/**
* The IETF BCP 47 language identifier of the metadata item.
*/
extendedLanguageTag?: string;
/**
* Additional attributes attached to the metadata item.
*/
extraAttributes?: Record<string, unknown>;
}
/**
* Base interface for all Android ID3 frames.
*
* @platform Android
*/
interface AndroidId3FrameBase {
metadataType: MetadataType.ID3;
/**
* Platform discriminator for TypeScript type narrowing.
*/
platform: 'android';
/**
* ID3 frame identifier.
*
* @example "TXXX"
*/
id: string;
}
/**
* Stores text-based metadata.
*
* @platform Android
*/
export interface AndroidTextInformationFrame extends AndroidId3FrameBase {
frameType: 'text';
description?: string;
value: string;
}
/**
* Encapsulates an ID3 frame whose payload is treated as opaque binary data.
*
* @platform Android
*/
export interface AndroidBinaryFrame extends AndroidId3FrameBase {
frameType: 'binary';
/** Raw frame payload encoded as Base64 data with no `data:...;base64,` prefix. */
data: Base64Raw;
}
/**
* Encapsulates an attached picture.
*
* @platform Android
*/
export interface AndroidApicFrame extends AndroidId3FrameBase {
frameType: 'apic';
/**
* MIME type of the embedded image as stored in the APIC frame.
*
* @example "image/jpeg"
*/
mimeType: string;
description?: string;
/**
* Picture type as defined by the ID3 specification.
*
* @example 3 // front cover
*/
pictureType: number;
/** Raw image data encoded as Base64 data with no `data:...;base64,` prefix. */
pictureData: Base64Raw;
}
/**
* Stores an external resource via URL.
*
* @platform Android
*/
export interface AndroidUrlLinkFrame extends AndroidId3FrameBase {
frameType: 'url';
description?: string;
url: string;
}
/**
* Stores user comments or notes.
*
* @platform Android
*/
export interface AndroidCommentFrame extends AndroidId3FrameBase {
frameType: 'comment';
language: string;
description: string;
/** The comment text. */
text: string;
}
/**
* Encapsulates owner-specific private data.
*
* The structure and semantics of the payload are defined solely by the `owner`
* identifier and are opaque to generic parsers.
*
* @platform Android
*/
export interface AndroidPrivFrame extends AndroidId3FrameBase {
frameType: 'priv';
/**
* Owner identifier string.
*
* Typically a reverse-DNS or application-specific identifier.
*
* @example "com.example.app"
*/
owner: string;
/**
* Raw private payload encoded as Base64 data with no `data:...;base64,` prefix.
*
* Consumers should only attempt to interpret this data if they recognize
* and understand the corresponding {@link owner} value.
*/
privateData: Base64Raw;
}
/**
* Encapsulates arbitrary binary objects with metadata.
*
* @platform Android
*/
export interface AndroidGeobFrame extends AndroidId3FrameBase {
frameType: 'geob';
/**
* MIME type of the encapsulated object.
*
* @example "application/octet-stream"
*/
mimeType: string;
/** Original filename of the object. */
filename: string;
description: string;
/**
* Raw object encoded as Base64 data with no `data:...;base64,` prefix.
*/
data: Base64Raw;
}
/**
* Defines a content chapter.
*
* @platform Android
*/
export interface AndroidChapterFrame extends AndroidId3FrameBase {
frameType: 'chapter';
/** Identifier of the chapter element. */
chapterId: string;
/** Time range of the chapter in milliseconds. */
timeRange: TimeRange<Milliseconds>;
/** The byte offset of the start of the chapter, or `-1` if not set. */
startOffset: number;
/** The byte offset of the end of the chapter, or `-1` if not set. */
endOffset: number;
/**
* Nested ID3 subframes associated with this chapter (e.g. title, URL, etc.).
*/
subFrames: AndroidId3Frame[];
}
/**
* Defines hierarchical chapter structure.
*
* @platform Android
*/
export interface AndroidChapterTocFrame extends AndroidId3FrameBase {
frameType: 'chapterToc';
/** Identifier of the table-of-contents element. */
elementId: string;
/** Whether this element is the root of the chapter tree. */
isRoot: boolean;
/** Whether the listed children are ordered. */
isOrdered: boolean;
/** IDs of child chapter or TOC elements. */
children: string[];
/**
* Nested ID3 subframes associated with this TOC element.
*/
subFrames: AndroidId3Frame[];
}
/**
* Android representation of ID3 metadata items.
*
* This is a discriminated union of Android ID3 frame types. Use {@link isAndroidId3Frame}
* for type-safe narrowing to specific frame types.
*
* @platform Android
* @see {@link isAndroidId3Frame} for frame type narrowing
*/
export type AndroidId3Frame = AndroidTextInformationFrame | AndroidBinaryFrame | AndroidApicFrame | AndroidUrlLinkFrame | AndroidCommentFrame | AndroidPrivFrame | AndroidGeobFrame | AndroidChapterFrame | AndroidChapterTocFrame;
/**
* Describes metadata associated with ID3 tags.
*
* This is a discriminated union over the `platform` field:
*
* - `"ios"`: {@link IosId3Frame}
* - `"android"`: {@link AndroidId3Frame}
*
* Narrowing on `platform` gives you access to the platform-specific fields.
*/
export type Id3MetadataEntry = IosId3Frame | AndroidId3Frame;
/**
* Describes metadata associated with HLS `#EXT-X-SCTE35` tags.
*
* @remarks On iOS, {@link TweaksConfig.isNativeHlsParsingEnabled} must be enabled
* to parse this type of metadata.
*/
export interface ScteMetadataEntry {
metadataType: MetadataType.SCTE;
/**
* The attribute name/key from the SCTE-35 tag.
*/
key: string;
/**
* The attribute value (nullable for key-only attributes).
*/
value?: string;
}
/**
* Metadata entry for unsupported metadata types.
*
* This type is emitted when the native player reports timed metadata that
* this SDK cannot attach to one of the supported types:
* - iOS: metadata that is not exposed as ID3, SCTE, or DATERANGE
* - Android: metadata that is not exposed as ID3, SCTE, DATERANGE, or EMSG
*/
export interface UnsupportedMetadataEntry {
metadataType: MetadataType.Unsupported;
/** The platform that reported the unsupported metadata. */
platform: 'ios' | 'android';
}
/**
* Represents in-playlist timed metadata from an HLS `#EXT-X-DATERANGE` tag.
*
* This is a discriminated union over the `platform` field:
*
* - `"ios"`: {@link IosDateRangeMetadataEntry}
* - `"android"`: {@link AndroidDateRangeMetadataEntry}
*
* Narrowing on `platform` gives you access to the platform-specific fields.
*/
export type DateRangeMetadataEntry = IosDateRangeMetadataEntry | AndroidDateRangeMetadataEntry;
/**
* Union type representing all supported timed metadata entry kinds.
*
* This is a discriminated union over the `metadataType` field:
*
* - {@link MetadataType.ID3}: {@link Id3MetadataEntry}
* - {@link MetadataType.DATERANGE}: {@link DateRangeMetadataEntry}
* - {@link MetadataType.SCTE}: {@link ScteMetadataEntry}
* - {@link MetadataType.EMSG}: {@link EventMessageMetadataEntry}
* - {@link MetadataType.Unsupported}: {@link UnsupportedMetadataEntry}
*
* Branching on `metadataType` using an `if`/`switch` statement narrows the type and
* gives access to entry-specific fields.
*
* @example
* ```ts
* function handleMetadata(entry: MetadataEntry) {
* switch (entry.metadataType) {
* case MetadataType.DATERANGE:
* // `entry` is a DateRangeMetadataEntry
* if (entry.platform === 'android') {
* // `entry` is now an AndroidDateRangeMetadataEntry
* console.log('End on next:', entry.endOnNext);
* } else {
* // `entry` is now an IosDateRangeMetadataEntry
* console.log('Cueing options:', entry.cueingOptions);
* }
* break;
*
* case MetadataType.SCTE:
* // `entry` is a ScteMetadataEntry
* console.log('SCTE key:', entry.key, 'value:', entry.value);
* break;
*
* case MetadataType.ID3:
* // `entry` is an Id3MetadataEntry
* if (entry.platform === 'android') {
* // `entry` is now an AndroidId3Frame
* console.log('Frame type:', entry.frameType);
* // Further narrow down on the frame type
* if (entry.frameType == 'apic') {
* console.log('APIC frame mimeType: ', entry.mimeType)
* }
* } else {
* // `entry` is now an IosId3Frame
* console.log('Frame ID:', entry.id, 'Value:', entry.value);
* }
* // Or use isAndroidId3Frame to directly narrow to specific Android frame
* if (isAndroidId3Frame(entry, 'text')) {
* console.log('Text frame:', entry.value);
* }
* break;
*
* case MetadataType.EMSG:
* // `entry` is an EventMessageMetadataEntry (Android only)
* console.log('EMSG data:', entry.messageData);
* break;
*
* case MetadataType.Unsupported:
* // `entry` is an UnsupportedMetadataEntry
* console.warn('Unsupported metadata encountered from: ', entry.platform)
* break;
* }
* }
* ```
*/
export type MetadataEntry = DateRangeMetadataEntry | EventMessageMetadataEntry | Id3MetadataEntry | ScteMetadataEntry | UnsupportedMetadataEntry;
/**
* A collection of timed metadata entries of the same type.
*
* All entries in the collection share the same `metadataType`.
*/
export interface MetadataCollection<T extends MetadataEntry> {
/**
* The playback time in seconds when this metadata should trigger, relative to the playback session.
*/
startTime?: Seconds;
/**
* The metadata entries.
*
* The group is homogeneous: all entries share the same metadata type.
*/
entries: T[];
}
/**
* Type-safe narrowing helper for Android ID3 frame types.
*
* Android ID3 frames have 9 distinct frame types (text, binary, apic, url, comment,
* priv, geob, chapter, chapterToc), each with different fields. This helper provides
* type-safe access to frame-specific properties.
*
* @param entry - The ID3 metadata entry to check
* @param frameType - The Android frame type to narrow to
* @returns `true` if entry is an Android frame of the specified type
*
* @see {@link MetadataEntry} for the full type narrowing documentation
*/
export declare function isAndroidId3Frame<T extends AndroidId3Frame['frameType']>(entry: Id3MetadataEntry, frameType: T): entry is Extract<AndroidId3Frame, {
frameType: T;
}>;
export {};
//# sourceMappingURL=metadata.d.ts.map