UNPKG

@glomex/integration-web-component

Version:

Web component and types to integrate the glomex player

1,398 lines (1,356 loc) 43.9 kB
export declare interface Ad { sessionId: string; id: string; isLinear: boolean; duration: number; positionIndex: number; breakIndex: number; breakName: string; mimetype: string; totalAds: number; nonLinearWidth?: number; nonLinearHeight?: number; } export declare interface Channel { /** Name of the channel */ name: string; /** Identifier of the channel */ id?: string; /** Target URL of the channel */ url?: string; /** Square logo of the channel (optimal size: 96x96 pixels) */ logo?: string; } export declare enum ComponentName { INTEGRATION = "glomex-integration", EXTERNAL_MEDIA_ITEM = "glomex-external-media-item", GLOMEX_MEDIA_ITEM = "glomex-media-item" } /** * Describes the contract that an external API tracking script must implement so that it can be * imported and executed by the integration. The API script must be hosted on the remote server * with CORS enabled. * * @example * ```ts * import { IntegrationEvent } from '@glomex/integration'; * export const connectIntegration: ConnectIntegration = ( * integration, * // userId will be undefined when no consent is given * { userCountryCode, userId, integrationEnvironment } * ) => { * integration.addEventListener(IntegrationEvent.CONTENT_PLAY, () => { * console.log('play', integration.content); * }); * }; * ``` * * @example * ```js * export const connectIntegration = ( * integration, * // userId will be undefined when no consent is given * { userCountryCode, userId, integrationEnvironment } * ) => { * const { IntegrationEvent } = integration.constructor; * integration.addEventListener(IntegrationEvent.CONTENT_PLAY, () => { * console.log('play', integration.content); * }); * }; * ``` */ export declare type ConnectIntegration = (integration: IntegrationElement, context: { userCountryCode?: string; userId?: string; integrationEnvironment?: string; }, options?: { warnCallback?: (error: Error) => void; }) => (() => void) | undefined; export declare interface Consent { gdprApplies: boolean; consentString?: string; cmpId?: number; policyVersion?: number; vendorListVersion?: number; vendorConsents?: Record<string, boolean>; vendorLegitimateInterests?: Record<string, boolean>; purposeConsents?: Record<string, boolean>; purposeLegitimateInterests?: Record<string, boolean>; ready: boolean; addtlConsent?: string; } /** * Selected source of the given content. */ declare interface ContentSource { id: string; mimetype: Mimetype; src: string; playbackMode: PlaybackMode; entitlementToken?: string; drm: boolean; } export declare enum ContentStopReason { CLEAR_PLAYLIST = "clearPlaylist", SELECT_PLAYLIST_ITEM = "selectPlaylistItem", ENDED = "ended", CONTENT_ERROR = "contentError", API_STOP = "apiStop", LIVESTREAM_STOP = "livestreamStop", PAGE_HIDE = "pageHide" } export declare interface CustomMarker { /** {@inheritDoc Marker.name} */ name: string; /** {@inheritDoc Marker.type} */ type: MarkerType; /** {@inheritDoc Marker.threshold} */ threshold: number; } declare interface Experiment { name: string; enabled: boolean; participantPercentage: number; variants: Record<string, ExperimentVariant>; conditions: Record<string, unknown>; } declare interface ExperimentVariant { weight: number; contentOverride: Record<string, unknown>; } /** * A media item web component that allows to define an external media item. It can be placed * inside the integration element. For more complex use cases, see {@link MediaItemElement}. * * @tagname glomex-external-media-item * * @slot - (optional) Slot for inline JSON of type `application/glomex-external-media-item+json` * * @example the most simple glomex-external-media-item * * This only works when no `playlist-id` is assigned to `glomex-integration` * * ```html * <glomex-integration * integration-id="REPLACE_WITH_INTEGRATION_ID" * > * <glomex-external-media-item * id="SOME_ID" * src="SOME_VIDEO_URL" * duration="LENGTH_OF_VIDEO" * poster="POSTER_URL" * title="VIDEO_TITLE" * ></glomex-external-media-item> * <!-- further media items --> * </glomex-integration> * ``` * * @example the most simple glomex-external-media-item with inline JSON * * It is possible to use {@link MediaItem} or array of {@link MediaItem} * in JSON format. * * ```html * <glomex-integration * integration-id="REPLACE_WITH_INTEGRATION_ID" * > * <glomex-external-media-item> * <script type="application/glomex-external-media-item+json"> * { * "id": "SOME_ID", * "sources": [ * { * "src": "SOME_VIDEO_URL", * "mimetype": "video/mp4" * } * ], * "duration": "LENGTH_OF_VIDEO", * "poster": "POSTER_URL", * "title": "VIDEO_TITLE" * } * </script> * </glomex-external-media-item> * </glomex-integration> * ``` */ export declare class ExternalMediaItemElement extends HTMLElement implements MediaItemElement { #private; /** * {@inheritDoc MediaItem#id} */ id: string; /** * {@inheritDoc MediaSourceBase#src} */ src: string; /** * {@inheritDoc MediaSourceBase#mimetype} */ mimetype?: MediaSource_2['mimetype']; /** * {@inheritDoc MediaSourceBase#playbackMode} */ playbackMode?: MediaSourceBase['playbackMode']; /** * {@inheritDoc MediaItem#duration} */ duration?: number; /** * {@inheritDoc MediaItem#poster} */ poster: string; /** * {@inheritDoc MediaItem#title} */ title: string; /** * {@inheritDoc MediaItem#description} */ description?: string; /** * {@inheritDoc Channel#logo} */ channelLogo?: string; /** * {@inheritDoc Channel#name} */ channelName?: string; /** * {@inheritDoc MediaItem#aspectRatio} */ aspectRatio?: string; /** * {@inheritDoc MediaItem#minimumAge} */ minimumAge?: number; /** * {@inheritDoc MediaItem#releaseDate} */ releaseDate?: number; /** * {@inheritDoc MediaItem#endDate} */ endDate?: number; /** * {@inheritDoc MediaItem#hasProductPlacement} */ hasProductPlacement?: boolean; get data(): MediaItem; } export declare function getIntegrationCssUrl(integrationId: string): string; /** * Web component that allows to override title and poster of a given glomex content id. It can be placed * inside the integration element. For integrating external media items, see {@link ExternalMediaItemElement}. * * @tagname glomex-media-item * * @example with 2 glomex-media-items * * This only works when no `playlist-id` is assigned to `glomex-integration` * * ```html * <glomex-integration * integration-id="REPLACE_WITH_INTEGRATION_ID" * > * <glomex-media-item * id="REPLACE_WITH_MEDIA_OR_PLAYLIST_ID" * ></glomex-media-item> * <glomex-media-item * id="ANOTHER_MEDIA_OR_PLAYLIST_ID" * ></glomex-media-item> * </glomex-integration> * ``` * * @example glomex-media-item with title and poster override * * ```html * <glomex-integration * integration-id="REPLACE_WITH_INTEGRATION_ID" * > * <glomex-media-item * id="REPLACE_WITH_MEDIA_OR_PLAYLIST_ID" * title="REPLACE_WITH_TITLE_OVERRIDE" * poster="REPLACE_WITH_POSTER_URL_OVERRIDE" * ></glomex-media-item> * </glomex-integration> * ``` */ export declare class GlomexMediaItemElement extends HTMLElement { #private; /** * {@inheritDoc MediaItem#id} */ id: string; /** * Overridden poster of the media item. */ poster: string; /** * Overridden title of the media item. */ title: string; } export declare interface GlomexMediaItemWithOverrides { id: string; overrides: Partial<Omit<MediaItem, 'id' | 'sources' | 'isExternal'>>; } /** * Web component to integrate the player. * * @see {@link IntegrationElementEventMap} for a full list of event types and their payloads * @tagname glomex-integration * @slot - (optional) Slot for custom media items ({@link GlomexMediaItemElement}, {@link ExternalMediaItemElement} or {@link MediaItemElement}) * * @example with a playlist-id * * ```html * <glomex-integration * integration-id="REPLACE_WITH_INTEGRATION_ID" * playlist-id="REPLACE_WITH_PLAYLIST_ID" * ></glomex-integration> * ``` * * You can find more advanced examples in the {@link GlomexMediaItemElement}, {@link ExternalMediaItemElement} or {@link MediaItemElement} documentation. */ export declare class IntegrationElement extends HTMLElement implements IntegrationProperties { #private; static MarkerType: typeof MarkerType; static KnownMarkerName: typeof KnownMarkerName; static PlaybackMode: typeof PlaybackMode; static Mimetype: typeof Mimetype; static PresentationMode: typeof PresentationMode; static IntegrationEvent: typeof IntegrationEvent; /** * {@inheritDoc IntegrationProperties.integrationId} * @attribute integration-id */ integrationId?: string; /** * {@inheritDoc IntegrationProperties.playlistId} * @attribute playlist-id */ playlistId?: string; /** * {@inheritDoc IntegrationProperties.index} * @attribute index */ index?: number; /** * {@inheritDoc IntegrationProperties.hidden} * @attribute {on|off} hidden */ hidden: boolean; /** * {@inheritDoc IntegrationProperties.topLevelIframe} * @attribute top-level-iframe */ topLevelIframe: boolean; /** * {@inheritDoc IntegrationProperties.placement} * @attribute placement */ placement?: string; variant?: string; /** * Optional callback function invoked when the integration fails to load an advertisement. * The callback receives an object with a `reason` property that explains why no ad was loaded. * It must be defined before the element gets attached to the DOM. */ passback?: (payload: { reason: string; }) => void; /** * Initiates playback of the media content. */ play(): void; /** * Pauses the current media playback. */ pause(): void; /** * Snapshots current video frame. */ getCurrentVideoFrame(): Promise<ImageBitmap>; /** * Returns the current playback time (in seconds) of the media. */ get currentTime(): number; /** * Returns the current session ID. */ get sessionId(): string; /** * Returns the current wall clock time (UNIX timestamp in seconds). Useful for livestreams. */ get wallClockTime(): number; /** * Seeks the media to the specified time, updating the current playback time. * @param time - The time (in seconds) to seek to. */ set currentTime(time: number); /** * Retrieves the total duration (in seconds) of the current media content. */ get duration(): number; /** * Indicates whether the media playback is currently muted. */ get muted(): boolean; /** * Mutes or unmutes the media playback. * @param value - A boolean value indicating whether to mute the media playback. */ set muted(value: boolean); /** * Returns the current volume level of the media playback (0-1). */ get volume(): number; /** * Sets the media playback volume to the specified level. * @param value - The volume level to be set (0-1). */ set volume(value: number); /** * Returns `true` if the media playback is currently paused; otherwise, returns `false`. */ get paused(): boolean; /** * Indicates whether the media playback has ended. */ get ended(): boolean; /** * Indicates whether the media is currently in a seeking state. */ get seeking(): boolean; /** * Indicates whether the media is currently in a buffering state. */ get buffering(): boolean; /** * Retrieves the current presentation mode of the media player. * This mode may affect how the media is displayed. */ get presentationMode(): PresentationMode; /** * Returns whether the ad playback is muted. If no ad is currently active, this value is `undefined`. */ get adMuted(): boolean | undefined; /** * Retrieves the volume level for the ad playback. If no ad is currently active, this value is `undefined`. */ get adVolume(): number | undefined; /** * Returns the current playback time (in seconds) for the ad content. If no ad is currently active, this value is `NaN`. */ get adCurrentTime(): number; /** * Retrieves the total duration (in seconds) of the ad content. If no ad is currently active, this value is `NaN`. */ get adDuration(): number; /** * Indicates whether the ad playback is currently paused. If no ad is currently active, this value is `undefined`. */ get adPaused(): boolean | undefined; /** * Retrieves the currently selected content item. */ get content(): MediaItem | undefined; /** * Retrieves the current playlist content items. */ get playlist(): MediaItem[] | undefined; /** * Provides access to the user's consent information. */ get consent(): Consent | undefined; /** * Retrieves information about the detected page. */ get page(): Page | undefined; /** * Retrieves the playback time (in seconds) of the current content. */ get contentPlaybackTime(): number; /** * Retrieves details about the currently selected ad, if any. */ get currentAd(): Ad | undefined; /** Version of the integration */ get version(): string; /** * Sets the presentation mode of the media player to the specified mode. This mode affects how the integration gets displayed * (e.g. inline, dock, lightbox, fullscreen). * * @param {PresentationMode} mode - The presentation mode to set. * @param {Object} [options] - Optional configuration. * @param {boolean} [options.byUser=false] - Indicates if the change was initiated by a user action. */ setPresentationMode(mode: PresentationMode | PresentationModeString, { byUser }?: { byUser?: boolean | undefined; }): void; /** * Exits the current presentation mode. * * @param {Object} [options] - Optional configuration. * @param {boolean} [options.byUser=false] - Indicates if the change was initiated by a user action. */ exitCurrentPresentationMode({ byUser }?: { byUser?: boolean; }): void; } /** * Map of events that are dispatched by the {@link IntegrationElement}. The {@link IntegrationElement} provides * getters to read {@link IntegrationElement#consent consent}, {@link IntegrationElement#content content}, {@link IntegrationElement#page page}, {@link IntegrationElement#currentTime currentTime}, ... state from. * * @see {@link IntegrationEvent} for all event types as constants * * @example * * ```js * // using strings * integration.addEventListener('ready', () => {}); * // using constants * await window.customElements.whenDefined('glomex-integration'); * const { IntegrationEvent } = integration.constructor; * integration.addEventListener(IntegrationEvent.READY, () => {}); * ``` */ export declare interface IntegrationElementEventMap { /** * @inheritdoc IntegrationEvent.READY * @eventProperty */ [IntegrationEvent.READY]: CustomEvent<void>; /** * @inheritdoc IntegrationEvent.INTEGRATION_ABORT * @eventProperty */ [IntegrationEvent.INTEGRATION_ABORT]: CustomEvent<{ error: Error; }>; /** * @inheritdoc IntegrationEvent.INTEGRATION_AD_AVAILABLE * @eventProperty */ [IntegrationEvent.INTEGRATION_AD_AVAILABLE]: CustomEvent<void>; /** * @inheritdoc IntegrationEvent.INTEGRATION_PASSBACK * @eventProperty */ [IntegrationEvent.INTEGRATION_PASSBACK]: CustomEvent<{ reason: string; }>; /** * @inheritdoc IntegrationEvent.USER_UPDATE_CONSENT * @eventProperty */ [IntegrationEvent.USER_UPDATE_CONSENT]: CustomEvent<void>; /** * @inheritdoc IntegrationEvent.PLAYLIST_UPDATE * @eventProperty */ [IntegrationEvent.PLAYLIST_UPDATE]: CustomEvent<void>; /** * @inheritdoc IntegrationEvent.PLAYER_SET_PRESENTATION_MODE * @eventProperty */ [IntegrationEvent.PLAYER_SET_PRESENTATION_MODE]: CustomEvent<{ mode: PresentationMode; }>; /** * @inheritdoc IntegrationEvent.CONTENT_SELECT * @eventProperty */ [IntegrationEvent.CONTENT_SELECT]: CustomEvent<{ sessionId: string; source: ContentSource; }>; /** * @inheritdoc IntegrationEvent.CONTENT_START * @eventProperty */ [IntegrationEvent.CONTENT_START]: CustomEvent<void>; /** * @inheritdoc IntegrationEvent.CONTENT_IMPRESSION * @eventProperty */ [IntegrationEvent.CONTENT_IMPRESSION]: CustomEvent<void>; /** * @inheritdoc IntegrationEvent.CONTENT_BUFFERING_START * @eventProperty */ [IntegrationEvent.CONTENT_BUFFERING_START]: CustomEvent<void>; /** * @inheritdoc IntegrationEvent.CONTENT_BUFFERING_END * @eventProperty */ [IntegrationEvent.CONTENT_BUFFERING_END]: CustomEvent<void>; /** * @inheritdoc IntegrationEvent.CONTENT_STOP * @eventProperty */ [IntegrationEvent.CONTENT_STOP]: CustomEvent<{ reason: ContentStopReason; }>; /** * @inheritdoc IntegrationEvent.CONTENT_ERROR * @eventProperty */ [IntegrationEvent.CONTENT_ERROR]: CustomEvent<{ error: MediaError_2 | MediaItemError; }>; /** * @inheritdoc IntegrationEvent.CONTENT_MARKER_REACHED * @eventProperty */ [IntegrationEvent.CONTENT_MARKER_REACHED]: CustomEvent<{ markerName: string; markerData: unknown; }>; /** * @inheritdoc IntegrationEvent.CONTENT_TIME_UPDATE * @eventProperty */ [IntegrationEvent.CONTENT_TIME_UPDATE]: CustomEvent<void> | HTMLElementEventMap['timeupdate']; /** * @inheritdoc IntegrationEvent.CONTENT_SEEKING * @eventProperty */ [IntegrationEvent.CONTENT_SEEKING]: CustomEvent<void> | HTMLElementEventMap['seeking']; /** * @inheritdoc IntegrationEvent.CONTENT_SEEKED * @eventProperty */ [IntegrationEvent.CONTENT_SEEKED]: CustomEvent<void> | HTMLElementEventMap['seeked']; /** * @inheritdoc IntegrationEvent.CONTENT_PLAY * @eventProperty */ [IntegrationEvent.CONTENT_PLAY]: CustomEvent<void> | HTMLElementEventMap['play']; /** * @inheritdoc IntegrationEvent.CONTENT_PAUSE * @eventProperty */ [IntegrationEvent.CONTENT_PAUSE]: CustomEvent<void> | HTMLElementEventMap['pause']; /** * @inheritdoc IntegrationEvent.CONTENT_VOLUME_CHANGE * @eventProperty */ [IntegrationEvent.CONTENT_VOLUME_CHANGE]: CustomEvent<void> | HTMLElementEventMap['volumechange']; /** * @inheritdoc IntegrationEvent.CONTENT_ENDED * @eventProperty */ [IntegrationEvent.CONTENT_ENDED]: CustomEvent<void> | HTMLElementEventMap['ended']; /** * @inheritdoc IntegrationEvent.AD_IMPRESSION * @eventProperty */ [IntegrationEvent.AD_IMPRESSION]: CustomEvent<void>; /** * @inheritdoc IntegrationEvent.AD_BUFFERING_START * @eventProperty */ [IntegrationEvent.AD_BUFFERING_START]: CustomEvent<void>; /** * @inheritdoc IntegrationEvent.AD_BUFFERING_END * @eventProperty */ [IntegrationEvent.AD_BUFFERING_END]: CustomEvent<void>; /** * @inheritdoc IntegrationEvent.AD_TIME_UPDATE * @eventProperty */ [IntegrationEvent.AD_TIME_UPDATE]: CustomEvent<void>; /** * @inheritdoc IntegrationEvent.AD_VOLUME_CHANGE * @eventProperty */ [IntegrationEvent.AD_VOLUME_CHANGE]: CustomEvent<void>; /** * @inheritdoc IntegrationEvent.AD_PAUSED * @eventProperty */ [IntegrationEvent.AD_PAUSED]: CustomEvent<void>; /** * @inheritdoc IntegrationEvent.AD_RESUMED * @eventProperty */ [IntegrationEvent.AD_RESUMED]: CustomEvent<void>; /** * @inheritdoc IntegrationEvent.AD_CLICK * @eventProperty */ [IntegrationEvent.AD_CLICK]: CustomEvent<void>; /** * @inheritdoc IntegrationEvent.AD_SKIPPED * @eventProperty */ [IntegrationEvent.AD_SKIPPED]: CustomEvent<void>; /** * @inheritdoc IntegrationEvent.AD_COMPLETE * @eventProperty */ [IntegrationEvent.AD_COMPLETE]: CustomEvent<void>; } /** * Constants for all events dispatched by the {@link IntegrationElement}. * * @see {@link IntegrationElementEventMap} for a full list of event types and their payloads */ export declare enum IntegrationEvent { /** * When the integration got initialized. * @eventProperty */ READY = "ready", /** * When the integration got aborted because of a configuration / authorization error. * It is not triggered when the content errors. * @eventProperty */ INTEGRATION_ABORT = "integrationabort", /** * When an ad is available. * @eventProperty */ INTEGRATION_AD_AVAILABLE = "integrationadavailable", /** * When a passback is triggered because of no content or no ad. Only available when {@link IntegrationElement#passback} is set. * @eventProperty */ INTEGRATION_PASSBACK = "integrationpassback", /** * When the user's consent got updated. * See {@link IntegrationElement#consent} to get the current consent. * @eventProperty */ USER_UPDATE_CONSENT = "userupdateconsent", /** * When the playlist is updated (e.g. new media item got added). See {@link IntegrationElement#playlist} to get the current playlist items. * @eventProperty */ PLAYLIST_UPDATE = "playlistupdate", /** * When the player's presentation mode got changed. * @eventProperty */ PLAYER_SET_PRESENTATION_MODE = "playersetpresentationmode", /** * When content got selected. See {@link IntegrationElement#content} to get the current content. * @eventProperty */ CONTENT_SELECT = "contentselect", /** * When content started initially (e.g. before ad break). * @eventProperty */ CONTENT_START = "contentstart", /** * When the first frame of the content got played back. * @eventProperty */ CONTENT_IMPRESSION = "contentimpression", /** * When content buffering started. * @eventProperty */ CONTENT_BUFFERING_START = "contentbufferingstart", /** * When content buffering ended. * @eventProperty */ CONTENT_BUFFERING_END = "contentbufferingend", /** * When content got stopped (e.g. loading another content or it ended normally). The reason is provided in the payload. * It gets triggered after a potential postroll. * @eventProperty */ CONTENT_STOP = "contentstop", /** * When a content error occurs upon loading or playing the content. * @eventProperty */ CONTENT_ERROR = "contenterror", /** * When a marker is reached. See {@link MediaItem#markers} how to define own markers. * @eventProperty */ CONTENT_MARKER_REACHED = "contentmarkerreached", /** * When the content's time updates. This is equal to {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/timeupdate_event HTMLMediaElement.timeupdate}. * See {@link IntegrationElement#currentTime} to get the current time. * @eventProperty */ CONTENT_TIME_UPDATE = "timeupdate", /** * When the content is seeking. This is equal to {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/seeking_event HTMLMediaElement.seeking}. * See {@link IntegrationElement#seeking} to get the current seeking state. * @eventProperty */ CONTENT_SEEKING = "seeking", /** * When the content has seeked. This is equal to {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/seeked_event HTMLMediaElement.seeked}. * @eventProperty */ CONTENT_SEEKED = "seeked", /** * When the content switches from paused to playing. This is equal to {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play_event HTMLMediaElement.play}. * @eventProperty */ CONTENT_PLAY = "play", /** * When the content switches from playing to paused. This is equal to {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/pause_event HTMLMediaElement.pause}. * @eventProperty */ CONTENT_PAUSE = "pause", /** * When the content's volume changes. This is equal to {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/volumechange_event HTMLMediaElement.volumechange}. * See {@link IntegrationElement#volume} to get the current volume. * @eventProperty */ CONTENT_VOLUME_CHANGE = "volumechange", /** * When the content reached its end. This is equal to {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/ended_event HTMLMediaElement.ended}. * See {@link IntegrationElement#ended} to check if the content ended. * @eventProperty */ CONTENT_ENDED = "ended", /** * When the first frame of the ad got played back. * See {@link IntegrationElement#currentAd} to get the current ad. * @eventProperty */ AD_IMPRESSION = "adimpression", /** * When the ad started buffering. * @eventProperty */ AD_BUFFERING_START = "adbufferingstart", /** * When the ad stopped buffering. * @eventProperty */ AD_BUFFERING_END = "adbufferingend", /** * When the ad's time updates. * @eventProperty */ AD_TIME_UPDATE = "adtimeupdate", /** * When the ad's volume changes. * See {@link IntegrationElement#adVolume} to get the current volume. * @eventProperty */ AD_VOLUME_CHANGE = "advolumechange", /** * When the ad paused. * @eventProperty */ AD_PAUSED = "adpaused", /** * When the ad resumed. * @eventProperty */ AD_RESUMED = "adresumed", /** * When the ad was clicked. * @eventProperty */ AD_CLICK = "adclick", /** * When the ad was skipped. * @eventProperty */ AD_SKIPPED = "adskipped", /** * When the ad completed. * @eventProperty */ AD_COMPLETE = "adcomplete" } /** * Properties that can be set on the integration element. */ export declare interface IntegrationProperties { /** * The identifier for this integration. This value is used to determine the configuration and behavior of the integration. */ integrationId?: string; /** * Defines the playlist / content identifier that should be loaded and managed by the integration. It can be a single content id, a playlist id or `auto`. * It must be empty when the content is provided via the `media-item` web components inside the integration. */ playlistId?: string; /** * Determines the index of the media item within the playlist that should be or is currently selected. */ index?: number; /** * Hides the integration element when set to `true`. */ hidden?: boolean; /** * An optional flag that can mark the integration as if it is running in a top-level window context. Useful when the embedded iframe represents an article, which contains this integration. */ topLevelIframe?: boolean; /** * Allows the publisher to provide an optional placement attribute, which supplies additional contextual information for enhanced analytics tracking. */ placement?: string; /** * Allows the publisher to provide an optional ppid (publisher provided user id) attribute, which supplies additional contextual information for enhanced analytics tracking. */ ppid?: string; env?: 'stage' | 'local'; variant?: string; } export declare enum KnownMarkerName { PREROLL = "preroll", MIDROLL = "midroll", POSTROLL = "postroll", FIRST_QUARTILE = "contentFirstQuartile", MIDPOINT = "contentMidpoint", THIRD_QUARTILE = "contentThirdQuartile", COMPLETE = "contentComplete", STILL_INTERESTING = "stillInteresting", REQUEST_RECOMMENDATIONS = "requestRecommendations" } export declare function loadIntegrationComponent(): void; export declare function loadIntegrationStyles(integrationId: string): void; /** * Known markers that the integration interprets. */ export declare interface Marker { /** Name of the marker */ name: KnownMarkerName; /** Type of the marker */ type: MarkerType; /** * Threshold for the marker: * - {@link MarkerType.TIME_IN_SECONDS}: seconds * - {@link MarkerType.PERCENT}: percent as fraction (0-1) * - {@link MarkerType.TIME_IN_SECONDS_RECURRING}: seconds */ threshold: number; } export declare enum MarkerType { /** Triggers by time in seconds */ TIME_IN_SECONDS = "time", /** Triggers by percentage (only works when media item has a {@link MediaItem#duration duration}) */ PERCENT = "percent", /** Recurringly triggers by time in seconds (e.g. every 60 seconds) */ TIME_IN_SECONDS_RECURRING = "timeRecurring" } /** * Runtime error when the player fails to load or play a media item. */ declare interface MediaError_2 { name: 'MediaError'; /** Error code from the playback engine */ code: string; /** A detailed error message */ message: string; } export { MediaError_2 as MediaError } export declare interface MediaItem { /** * Unique identifier of the media item. */ id: string; /** * Additional ids that identify the media item in other systems */ additionalIds?: { joynId?: string; joynMediaId?: string; externalId?: string; }; /** * Whether the media item is external. This automatically gets set when an external media item is assigned. * @ignore */ isExternal?: boolean; /** * Poster image of the media item. */ poster: string; /** * Sources of the media item. */ sources: MediaSource_2[]; /** * Title of the media item. */ title: string; /** * Duration of the media item in seconds. Not defined when livestream. */ duration?: number; /** * Description of the media item. */ description?: string; /** * Language of the media item. 2-letter ISO language code. * * @defaultValue `de` (German) */ language?: string; /** * IAB categories (as {@link iabCategoryTaxonomy}) of the media item. Used for monetization. */ iabCategories?: string[]; /** * IAB category taxonomy used for {@link iabCategories} ({@link https://github.com/InteractiveAdvertisingBureau/AdCOM/blob/main/AdCOM%20v1.0%20FINAL.md#list_categorytaxonomies see IAB spec for details}) * @defaultValue `9` for IAB Tech Lab Content Taxonomy 3.1 */ iabCategoryTaxonomy?: number; /** * Aspect ratio of the media item. Useful when vertical variants are used. * * @defaultValue `16:9` */ aspectRatio?: string; /** * Minimum age to watch the media item. Shows a minimum age indicator in the UI. * * @defaultValue `0` (no minimum age) */ minimumAge?: number; /** * Release date of the media item. Unix timestamp in milliseconds. * Useful for JSON-LD generation. */ releaseDate?: number; /** * Time when the media item expires. Unix timestamp in milliseconds. * Useful for JSON-LD generation. */ endDate?: number; /** * Whether the media item has product placements. Shows a product placement indicator in the UI. */ hasProductPlacement?: boolean; /** * Channel of the media item. */ channel?: Channel; /** * Markers of the media item. * * @defaultValue `[{ name: KnownMarkerName.PREROLL, type: MarkerType.TIME_IN_SECONDS, threshold: 0 }]` */ markers?: (Marker | CustomMarker)[]; /** * In which country can this media item be played (e.g. `['de', 'at']`)? Useful for * JSON-LD generation. * * @defaultValue `['all']` (worldwide) */ regionsAllowed?: string[]; /** * Will be automatically filled based on {@link minimumAge} and {@link iabCategories}. * @ignore */ ppsj?: string; /** * Mark this media item as a recommendation. */ isRecommendation?: boolean; /** * An internal marker for the used playlist. It is automatically filled. * @ignore */ playlistId?: string; /** * JSON-LD `contentUrl` that allows search engines to crawl the media source. * You should only allow known crawlers ({@link https://developers.google.com/search/docs/crawling-indexing/verifying-googlebot?hl=en how to verify Googlebot & Crawler}) * to access those media sources. */ seoContentUrl?: string; /** * Additional teaser options that improve the loading experience and enable additional * integration variants. */ teaser?: { /** Image of the first frame of the media item. Used for initially showing the first frame of the media item. */ firstFrame?: string; /** {@link https://blurha.sh/ Blurhash} of the first frame of the media item. Used for coloring the background. */ firstFrameBlurHash?: string | null; /** Blurred version of the first frame of the media item. Used to show something early while loading. */ firstFrameBlurred?: string; /** {@link https://blurha.sh/ Blurhash} of the poster of the media item. Used for coloring the background. */ posterBlurHash?: string | null; /** Blurred version of the poster of the media item. Used to show something early while loading. */ posterBlurred?: string; /** Teaser video URL which is used for previewing the media item for some integrations. */ video?: string; }; /** * Additional labels for this media item. */ labels?: { id: string; name: string; }[]; /** Genre of the media item (e.g. `Documentary`) */ genre?: string; /** Content owner id and name of the media item */ contentOwner?: { id?: string; name: string; }; /** * Additional details to show for the age rating (e.g. `['Alcohol']`) next to the minimum age. */ ageRatingDetails?: string[]; /** Keywords of the media item */ keywords?: string[]; /** Show (often referred to as series, format or tv-show) the media item belongs to */ show?: { id?: string; name: string; episodeNumber?: number; seasonNumber?: number; }; /** Competition the media item belongs to */ competition?: { id?: string; name?: string; }; /** Compilation the media item belongs to */ compilation?: { id?: string; name?: string; }; /** Category id and name of the media item */ category?: { id?: string; name: string; }; /** Error information if the media item is not available upfront. */ error?: MediaItemError; /** * Internal definition of experiments. * @ignore */ experiments?: Experiment[]; /** * Advanced additional content branding (e.g. L around the video). * @ignore */ branding?: { backgroundColor?: string; cutInZoomAssetUrl?: string; cutInZoomHideTimeout?: number; logoUrl?: string; logoLinkUrl?: string; }; /** Livestream details */ livestream?: { /** UTC start time of the livestream in milliseconds */ startTime: number; /** UTC end time of the livestream in milliseconds */ endTime?: number; }; /** * Only relevant for glomex-internal use. Mark it to allow teaser experiments. * @ignore */ allowTeaserExperiments?: boolean; /** * URL of the API script that should be executed for this media-item. Script * must export `export function connectIntegration(glomexIntegration) {}` * * @ignore */ apiScriptUrl?: string; } /** * Abstract definition of a media item web component that can be used as a child of the {@link IntegrationElement}. * * @example of a custom media item * * It is possible to create more complex media items that query an own API. * * ```html * <script> * class CustomMediaItemElement extends HTMLElement { * get data() { * return fetch(`https://api.example.com/media/${this.getAttribute('id')}`) * .then(response => response.json()) * .then((body) => ({ * id: this.getAttribute('id'), * sources: body.sources, * duration: body.duration, * poster: body.poster, * title: body.title * })); * } * } * window.customElements.define('custom-media-item', CustomMediaItemElement); * </script> * <glomex-integration * integration-id="REPLACE_WITH_INTEGRATION_ID" * > * <custom-media-item id="API_CONTENT_ID"></custom-media-item> * </glomex-integration> * ``` */ export declare interface MediaItemElement extends HTMLElement { readonly data: MediaItem | MediaItem[] | Promise<MediaItem | MediaItem[]>; } /** * Serializable error with the reason why a media item is not available. * `name` is set to `MediaItemError` internally. */ export declare interface MediaItemError { /** * @protected */ name?: 'MediaItemError'; /** Error code that gets handled by the player */ code: MediaItemErrorCode; /** Optional custom error message or code from the source system */ message?: string; } export declare enum MediaItemErrorCode { NOT_FOUND = "NotFound", NOT_AVAILABLE = "NotAvailable", GEOBLOCKED = "Geoblocked", YOUTH_PROTECTED = "YouthProtected" } declare type MediaSource_2 = MediaSourceBase | MediaSourceDrm | MediaSourceJoyn | MediaSourceDynamicContent; export { MediaSource_2 as MediaSource } declare interface MediaSourceBase { /** * Unique identifier of the media source. * * @defaultValue `V1StGXR8_Z5jdHi6B-myT` a generated identifier */ id?: string; /** * Mimetype of the media source. * * @defaultValue detected from file extension of given {@link src} or `undefined` */ mimetype?: Mimetype; /** * The source URL of this media source. */ src: string; /** * Until the media source is valid. Unix timestamp in milliseconds. */ validUntil?: number; /** * Content mode of the media source. * * @defaultValue `PlaybackMode.VOD` */ playbackMode?: PlaybackMode; } declare interface MediaSourceDrm extends MediaSourceBase { /** * DRM provider header name. Only relevant in combination with tokens. */ drmProviderHeaderName?: string; /** * Fairplay license URI. Or `undefined` when {@link fairplayToken} in combination with {@link drmProviderHeaderName} is provided. */ fairplayLicenseUri?: string; /** * FairPlay certificate URI. */ fairplayCertificateUri?: string; /** * FairPlay token. */ fairplayToken?: string; /** * Widevine license URI. Or `undefined` when {@link widevineToken} in combination with {@link drmProviderHeaderName} is provided. */ widevineLicenseUri?: string; /** * Widevine token. */ widevineToken?: string; /** * PlayReady license URI. Or `undefined` when {@link playreadyToken} in combination with {@link drmProviderHeaderName} is provided. */ playreadyLicenseUri?: string; /** * PlayReady token. */ playreadyToken?: string; } declare interface MediaSourceDynamicContent extends MediaSourceBase { mimetype: Mimetype.DYNAMIC_CONTENT; } declare interface MediaSourceJoyn { /** * Media / asset identifier of joyn. */ id: string; mimetype: Mimetype.JOYN; /** * User token used for authentication. */ token: string; /** {@inheritDoc MediaSourceBase.playbackMode} */ playbackMode?: PlaybackMode; /** * Allowing to enforce stage environment */ environment?: 'stg'; } export declare enum Mimetype { HLS = "application/vnd.apple.mpegurl", HLS_LEGACY = "application/x-mpegURL", DASH = "application/dash+xml", MP4 = "video/mp4", OGG = "video/ogg", WEBM = "video/webm", MP3 = "audio/mp3", AAC = "audio/aac", WAV = "audio/wav", OGG_AUDIO = "audio/ogg", MPEG_AUDIO = "audio/mpeg", DYNAMIC_CONTENT = "application/x-turbo-dynamic-content", JOYN = "application/x-joyn-source" } export declare interface Page { url: string; searchParams: Record<string, string>; apexDomain: string; hostname: string; referrer: string; } export declare enum PlaybackMode { LIVE = "live", VOD = "vod", INTERACTIVE = "interactive", EMBED = "embed" } export declare enum PresentationMode { HIDDEN = "hidden", INLINE = "inline", DOCK = "dock", LIGHTBOX = "lightbox", FULLSCREEN = "fullscreen", AMP_DOCK = "amp-dock" } declare type PresentationModeString = `${PresentationMode}`; export declare enum ScriptType { INTEGRATION_CONFIGS = "application/glomex-integration-configs+json", EXTERNAL_MEDIA_ITEM = "application/glomex-external-media-item+json" } export { } declare global { interface HTMLElementTagNameMap { [ComponentName.INTEGRATION]: IntegrationElement; [ComponentName.GLOMEX_MEDIA_ITEM]: GlomexMediaItemElement; [ComponentName.EXTERNAL_MEDIA_ITEM]: ExternalMediaItemElement; } interface HTMLElementEventMap extends IntegrationElementEventMap {} }