@glomex/integration-web-component 1.1507.0 → 1.1508.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -71,3 +71,48 @@ export const connectIntegration: ConnectIntegration = (integration) => {
71
71
  });
72
72
  };
73
73
  ```
74
+
75
+ ### Shared Context
76
+
77
+ Use `getSharedContext()` to provide global application context and provider-specific user tokens to all `<glomex-integration>` instances on the page.
78
+
79
+ `getSharedContext()` waits for the integration component to be loaded and returns the same singleton instance that the running player uses.
80
+
81
+ ```ts
82
+ import { getSharedContext } from '@glomex/integration-web-component';
83
+
84
+ const sharedContext = await getSharedContext();
85
+
86
+ sharedContext.set({
87
+ // Plain values — used as-is
88
+ appVersion: '2.3.0',
89
+ appName: 'my-app',
90
+ deviceId: { id: '...', name: 'idfa' },
91
+
92
+ // Resolver functions — called each time the player needs the value,
93
+ // so they can return fresh data (e.g. after consent changes)
94
+ userIds: async () => await cmp.getConsentedUserIds(),
95
+
96
+ // Provider-specific context (tokens, subscription state, ...)
97
+ providers: {
98
+ 'my-provider': async () => ({
99
+ token: await myAuth.getToken(),
100
+ subscriptionState: userState
101
+ })
102
+ }
103
+ });
104
+ ```
105
+
106
+ Calling `set()` multiple times merges incrementally — previously set values are preserved unless overwritten:
107
+
108
+ ```ts
109
+ // Initial setup
110
+ sharedContext.set({ appVersion: '2.3.0', appName: 'my-app' });
111
+
112
+ // Later — adds providers without removing appVersion/appName
113
+ sharedContext.set({
114
+ providers: {
115
+ 'my-provider': async () => ({ token: await myAuth.getToken() })
116
+ }
117
+ });
118
+ ```
package/dist/index.d.ts CHANGED
@@ -1,13 +1,14 @@
1
1
 
2
+ import type { SerializedError } from '@reduxjs/toolkit';
2
3
 
3
4
  export declare interface Ad {
4
5
  sessionId: string;
5
6
  id: string;
6
- adFormat: AdFormat;
7
+ adFormat: AdFormat | `${AdFormat}`;
7
8
  duration?: number;
8
9
  positionIndex: number;
9
10
  breakIndex: number;
10
- breakName: AdBreakName;
11
+ breakName: AdBreakName | `${AdBreakName}`;
11
12
  mimetype: string;
12
13
  totalAds: number;
13
14
  adUrl?: string;
@@ -27,8 +28,12 @@ export declare interface Ad {
27
28
  clickThroughUrl?: string;
28
29
  }
29
30
 
30
- /** Name of ad break - when the ad appears, `overlay` is deprecated */
31
- export declare type AdBreakName = 'preroll' | 'midroll' | 'postroll' | 'overlay';
31
+ /** Name of ad break - when the ad appears, `OVERLAY` is deprecated */
32
+ export declare enum AdBreakName {
33
+ PREROLL = "preroll",
34
+ MIDROLL = "midroll",
35
+ POSTROLL = "postroll"
36
+ }
32
37
 
33
38
  export declare class AdError extends Error {
34
39
  code: string;
@@ -37,9 +42,14 @@ export declare class AdError extends Error {
37
42
  }
38
43
 
39
44
  /** Format of the ad - how it is presented */
40
- export declare type AdFormat = 'linear' | 'overlay' | 'cutin' | 'pause';
45
+ export declare enum AdFormat {
46
+ LINEAR = "linear",
47
+ OVERLAY = "overlay",
48
+ CUTIN = "cutin",
49
+ PAUSE = "pause"
50
+ }
41
51
 
42
- export declare const ALLOWED_UI_ACTIONS: readonly ["play", "pause", "openEpg", "startAgeSetup", "forgotPin"];
52
+ declare const ALLOWED_UI_ACTIONS: readonly ["play", "pause", "openEpg", "startAgeSetup", "forgotPin"];
43
53
 
44
54
  /**
45
55
  * An additional API script definition that should be executed for this media-item.
@@ -103,6 +113,12 @@ export declare interface AudioTrackList extends MediaTrackList<AudioTrack> {
103
113
  select(trackOrId: AudioTrack | string): void;
104
114
  }
105
115
 
116
+ declare class BaseMediaError<T extends string = string> extends Error {
117
+ code: T;
118
+ name: string;
119
+ constructor(message: string, code: T);
120
+ }
121
+
106
122
  export declare interface Channel {
107
123
  /** Human-readable channel title shown in the player UI */
108
124
  name?: string;
@@ -118,8 +134,9 @@ export declare interface Channel {
118
134
 
119
135
  export declare enum ComponentName {
120
136
  INTEGRATION = "glomex-integration",
121
- EXTERNAL_MEDIA_ITEM = "glomex-external-media-item",
122
- GLOMEX_MEDIA_ITEM = "glomex-media-item"
137
+ EXTERNAL_MEDIA_ITEM = "external-media-item",
138
+ GLOMEX_MEDIA_ITEM = "glomex-media-item",
139
+ JOYN_MEDIA_ITEM = "joyn-media-item"
123
140
  }
124
141
 
125
142
  /**
@@ -206,7 +223,41 @@ export declare interface CustomMarker extends Omit<Marker, 'name'> {
206
223
  name: string;
207
224
  }
208
225
 
209
- export declare const DEBUG_CONFIG_STORAGE_KEY = "turboDebugPlayerConfig";
226
+ /**
227
+ * Identifier names for device IDs that can be passed via {@link SharedContextData.deviceId}.
228
+ */
229
+ export declare enum DeviceIdName {
230
+ /** Android Advertising ID (Google) */
231
+ AAID = "aaid",
232
+ /** Amazon Fire OS Advertising ID */
233
+ AFAI = "afai",
234
+ /** Android App Set ID — scope: app */
235
+ ASIA = "asia",
236
+ /** Android App Set ID — scope: developer */
237
+ ASID = "asid",
238
+ /** Tizen Identifier for Advertising (Samsung) */
239
+ TIFA = "tifa",
240
+ /** VIDAA Advertising ID (Hisense) */
241
+ VAID = "vaid",
242
+ /** Apple Identifier for Advertisers */
243
+ IDFA = "idfa",
244
+ /** Apple Identifier for Vendors */
245
+ IDFV = "idfv",
246
+ /** LG Unique Device ID */
247
+ LGUDID = "lgudid",
248
+ /** Microsoft Advertising ID */
249
+ MSAI = "msai",
250
+ /** Huawei Open Advertising ID */
251
+ OAID = "oaid",
252
+ /** PlayStation Advertising ID */
253
+ PSNAI = "psnai",
254
+ /** Roku Identifier for Advertising */
255
+ RIDA = "rida",
256
+ /** Vizio Advertising ID */
257
+ VIDA = "vida",
258
+ /** TitanOS Advertising ID (Walmart) */
259
+ WAID = "waid"
260
+ }
210
261
 
211
262
  declare interface Experiment {
212
263
  name: string;
@@ -231,6 +282,7 @@ export declare interface ExtendedVideoPlaybackQuality extends VideoPlaybackQuali
231
282
  height: number;
232
283
  }
233
284
 
285
+ /** @ignore */
234
286
  export declare const EXTERNAL_PLAYER_NAME = "turbo-player";
235
287
 
236
288
  /**
@@ -238,9 +290,9 @@ export declare const EXTERNAL_PLAYER_NAME = "turbo-player";
238
290
  * It can be placed inside the integration element as a child.
239
291
  * For more complex use cases, see {@link MediaItemElement}.
240
292
  *
241
- * @tagname glomex-external-media-item
293
+ * @tagname external-media-item
242
294
  *
243
- * @slot - Slot for inline JSON of type `application/glomex-external-media-item+json`
295
+ * @slot - Slot for inline JSON of type `application/external-media-item+json`
244
296
  *
245
297
  * @example single media item with inline JSON
246
298
  *
@@ -250,8 +302,8 @@ export declare const EXTERNAL_PLAYER_NAME = "turbo-player";
250
302
  * <glomex-integration
251
303
  * integration-id="REPLACE_WITH_INTEGRATION_ID"
252
304
  * >
253
- * <glomex-external-media-item>
254
- * <script type="application/glomex-external-media-item+json">
305
+ * <external-media-item>
306
+ * <script type="application/external-media-item+json">
255
307
  * {
256
308
  * "id": "SOME_ID",
257
309
  * "sources": [
@@ -265,7 +317,7 @@ export declare const EXTERNAL_PLAYER_NAME = "turbo-player";
265
317
  * "title": "VIDEO_TITLE"
266
318
  * }
267
319
  * </script>
268
- * </glomex-external-media-item>
320
+ * </external-media-item>
269
321
  * </glomex-integration>
270
322
  * ```
271
323
  *
@@ -277,8 +329,8 @@ export declare const EXTERNAL_PLAYER_NAME = "turbo-player";
277
329
  * <glomex-integration
278
330
  * integration-id="REPLACE_WITH_INTEGRATION_ID"
279
331
  * >
280
- * <glomex-external-media-item>
281
- * <script type="application/glomex-external-media-item+json">
332
+ * <external-media-item>
333
+ * <script type="application/external-media-item+json">
282
334
  * [
283
335
  * {
284
336
  * "id": "VIDEO_1",
@@ -296,13 +348,11 @@ export declare const EXTERNAL_PLAYER_NAME = "turbo-player";
296
348
  * }
297
349
  * ]
298
350
  * </script>
299
- * </glomex-external-media-item>
351
+ * </external-media-item>
300
352
  * </glomex-integration>
301
353
  * ```
302
354
  */
303
- export declare class ExternalMediaItemElement extends HTMLElement implements MediaItemElement {
304
- #private;
305
- get data(): MediaItem | MediaItem[];
355
+ export declare class ExternalMediaItemElement extends MediaItemElement {
306
356
  }
307
357
 
308
358
  /**
@@ -324,7 +374,11 @@ export declare interface ExtraContext {
324
374
  /**
325
375
  * User ids of the user. User ids are only used when the user has given consent for the assigned vendor.
326
376
  */
327
- userIds?: ExtraContextUserId[];
377
+ userIds?: {
378
+ id: string;
379
+ name: UserIdName | `${UserIdName}`;
380
+ ext?: Record<string, unknown>;
381
+ }[];
328
382
  /**
329
383
  * The bundle id of the app. Only required for iOS apps.
330
384
  */
@@ -340,28 +394,46 @@ export declare interface ExtraContext {
340
394
  */
341
395
  appStoreUrl?: string;
342
396
  b2bContext?: string;
343
- deviceId?: ExtraContextDeviceId;
397
+ deviceId?: {
398
+ id: string;
399
+ name: DeviceIdName | `${DeviceIdName}`;
400
+ };
344
401
  }
345
402
 
346
403
  /**
347
- * Device id of the user. Only required for app environments. When no listed deviceId is available, you can pass a ppid {@link ExtraContextUserId}.
404
+ * Returns the CSS URL for a given integration variant.
405
+ *
406
+ * @example
407
+ * ```ts
408
+ * import { getIntegrationCssUrl } from '@glomex/integration-web-component';
409
+ *
410
+ * const cssUrl = getIntegrationCssUrl('my-integration-id');
411
+ * // => 'https://player.glomex.com/variant/my-integration-id/variant.css'
412
+ * ```
348
413
  */
349
- export declare interface ExtraContextDeviceId {
350
- id: string;
351
- name: 'aaid' | 'afai' | 'asia' | 'asid' | 'tifa' | 'vaid' | 'idfa' | 'idfv' | 'lgudid' | 'msai' | 'oaid' | 'psnai' | 'rida' | 'vida' | 'waid';
352
- }
414
+ export declare function getIntegrationCssUrl(integrationId: string): string;
353
415
 
354
416
  /**
355
- * User id of the user that can be passed additionally to the integration. It improves the monetization. User ids
356
- * can be updated dynamically by assigning a new object to the {@link IntegrationElement#extraContext} property.
417
+ * Returns the {@link SharedContext} singleton from the loaded `integration.js`.
418
+ *
419
+ * Waits for the `<glomex-integration>` custom element to be defined, then
420
+ * reads the singleton from its static property — guaranteeing the same
421
+ * instance that the running player uses.
422
+ *
423
+ * @example
424
+ * ```ts
425
+ * import { getSharedContext } from '@glomex/integration-web-component';
426
+ *
427
+ * const sharedContext = await getSharedContext();
428
+ * sharedContext.set({
429
+ * appVersion: '2.3.0',
430
+ * providers: {
431
+ * 'my-provider': async () => ({ token: await myAuth.getFreshToken() }),
432
+ * }
433
+ * });
434
+ * ```
357
435
  */
358
- export declare interface ExtraContextUserId {
359
- id: string;
360
- name: 'netId' | 'sevenPassId' | 'ppid' | 'utiqId' | 'liverampId' | 'pairId';
361
- ext?: Record<string, unknown>;
362
- }
363
-
364
- export declare function getIntegrationCssUrl(integrationId: string): string;
436
+ export declare function getSharedContext(): Promise<SharedContext>;
365
437
 
366
438
  /**
367
439
  * Web component that allows to override title and poster of a given glomex content id. It can be placed
@@ -369,6 +441,11 @@ export declare function getIntegrationCssUrl(integrationId: string): string;
369
441
  *
370
442
  * @tagname glomex-media-item
371
443
  *
444
+ * @attribute id - The glomex media ID or playlist ID to load.
445
+ * @attribute {stage|prod} environment - The environment to use for the provider request.
446
+ * @attribute poster - URL to override the poster image of the media item.
447
+ * @attribute title - Override the title of the media item.
448
+ *
372
449
  * @example with 2 glomex-media-items
373
450
  *
374
451
  * This only works when no `playlist-id` is assigned to `glomex-integration`
@@ -399,26 +476,26 @@ export declare function getIntegrationCssUrl(integrationId: string): string;
399
476
  * ></glomex-media-item>
400
477
  * </glomex-integration>
401
478
  * ```
479
+ *
480
+ * @example glomex-media-item targeting the stage environment
481
+ *
482
+ * ```html
483
+ * <glomex-integration
484
+ * integration-id="REPLACE_WITH_INTEGRATION_ID"
485
+ * >
486
+ * <glomex-media-item
487
+ * id="REPLACE_WITH_MEDIA_OR_PLAYLIST_ID"
488
+ * environment="stage"
489
+ * ></glomex-media-item>
490
+ * </glomex-integration>
491
+ * ```
402
492
  */
403
- export declare class GlomexMediaItemElement extends HTMLElement {
404
- #private;
405
- /**
406
- * {@inheritDoc MediaItem#id}
407
- */
408
- id: string;
493
+ export declare class GlomexMediaItemElement extends MediaItemElement {
409
494
  /**
410
495
  * Overridden poster of the media item.
496
+ * @attribute poster
411
497
  */
412
498
  poster: string;
413
- /**
414
- * Overridden title of the media item.
415
- */
416
- title: string;
417
- }
418
-
419
- export declare interface GlomexMediaItemWithOverrides {
420
- id: string;
421
- overrides: Partial<Omit<MediaItem, 'id' | 'sources'>>;
422
499
  }
423
500
 
424
501
  /**
@@ -426,7 +503,7 @@ export declare interface GlomexMediaItemWithOverrides {
426
503
  *
427
504
  * @see {@link IntegrationElementEventMap} for a full list of event types and their payloads
428
505
  * @tagname glomex-integration
429
- * @slot - (optional) Slot for custom media items ({@link GlomexMediaItemElement}, {@link ExternalMediaItemElement} or {@link MediaItemElement})
506
+ * @slot - (optional) Slot for custom media items ({@link GlomexMediaItemElement}, {@link JoynMediaItemElement}, {@link ExternalMediaItemElement} or {@link MediaItemElement})
430
507
  *
431
508
  * @example with a playlist-id
432
509
  *
@@ -437,7 +514,7 @@ export declare interface GlomexMediaItemWithOverrides {
437
514
  * ></glomex-integration>
438
515
  * ```
439
516
  *
440
- * You can find more advanced examples in the {@link GlomexMediaItemElement}, {@link ExternalMediaItemElement} or {@link MediaItemElement} documentation.
517
+ * You can find more advanced examples in the {@link GlomexMediaItemElement}, {@link JoynMediaItemElement}, {@link ExternalMediaItemElement} or {@link MediaItemElement} documentation.
441
518
  */
442
519
  export declare class IntegrationElement extends HTMLElement implements IntegrationProperties {
443
520
  #private;
@@ -447,6 +524,7 @@ export declare class IntegrationElement extends HTMLElement implements Integrati
447
524
  static Mimetype: typeof Mimetype;
448
525
  static PresentationMode: typeof PresentationMode;
449
526
  static IntegrationEvent: typeof IntegrationEvent;
527
+ static sharedContext: SharedContext;
450
528
  /**
451
529
  * {@inheritDoc IntegrationProperties.integrationId}
452
530
  * @attribute integration-id
@@ -633,7 +711,7 @@ export declare class IntegrationElement extends HTMLElement implements Integrati
633
711
  /**
634
712
  * Retrieves the currently selected content item.
635
713
  */
636
- get content(): MediaItem | undefined;
714
+ get content(): MediaItemResolved | undefined;
637
715
  /**
638
716
  * Retrieves the currently selected source.
639
717
  */
@@ -641,7 +719,7 @@ export declare class IntegrationElement extends HTMLElement implements Integrati
641
719
  /**
642
720
  * Retrieves the current playlist.
643
721
  */
644
- get playlist(): MediaItem[] | undefined;
722
+ get playlist(): MediaItemResolved[] | undefined;
645
723
  /**
646
724
  * Provides access to the user's consent information.
647
725
  */
@@ -668,7 +746,7 @@ export declare class IntegrationElement extends HTMLElement implements Integrati
668
746
  * @param {Object} [options] - Optional configuration.
669
747
  * @param {boolean} [options.byUser=false] - Indicates if the change was initiated by a user action.
670
748
  */
671
- setPresentationMode(mode: PresentationMode | PresentationModeString, { byUser }?: {
749
+ setPresentationMode(mode: PresentationMode | `${PresentationMode}`, { byUser }?: {
672
750
  byUser?: boolean | undefined;
673
751
  }): Promise<void>;
674
752
  /**
@@ -769,7 +847,7 @@ export declare interface IntegrationElementEventMap {
769
847
  * @eventProperty
770
848
  */
771
849
  [IntegrationEvent.INTEGRATION_ABORT]: CustomEvent<{
772
- error: Error;
850
+ error: SerializedError;
773
851
  }>;
774
852
  /**
775
853
  * @inheritdoc IntegrationEvent.INTEGRATION_AD_AVAILABLE
@@ -843,7 +921,7 @@ export declare interface IntegrationElementEventMap {
843
921
  * @eventProperty
844
922
  */
845
923
  [IntegrationEvent.CONTENT_ERROR]: CustomEvent<{
846
- error: MediaError_2 | MediaItemError | MediaNetworkError;
924
+ error: SerializedError;
847
925
  }>;
848
926
  /**
849
927
  * @inheritdoc IntegrationEvent.CONTENT_MARKER_REACHED
@@ -1248,7 +1326,59 @@ export declare interface IntegrationProperties {
1248
1326
  extraContext?: ExtraContext;
1249
1327
  }
1250
1328
 
1251
- export declare const INTERNAL_PREFIX = "turbo";
1329
+ /**
1330
+ * Web component that allows to register Joyn media items. It can be placed
1331
+ * inside the integration element as a child.
1332
+ *
1333
+ * @tagname joyn-media-item
1334
+ *
1335
+ * @attribute id - The Joyn media ID to load.
1336
+ * @attribute {stage|prod} environment - The environment to use for the provider request.
1337
+ *
1338
+ * @example with a joyn-media-item
1339
+ *
1340
+ * This only works when no `playlist-id` is assigned to `glomex-integration`
1341
+ *
1342
+ * ```html
1343
+ * <glomex-integration
1344
+ * integration-id="REPLACE_WITH_INTEGRATION_ID"
1345
+ * >
1346
+ * <joyn-media-item
1347
+ * id="REPLACE_WITH_JOYN_MEDIA_ID"
1348
+ * ></joyn-media-item>
1349
+ * </glomex-integration>
1350
+ * ```
1351
+ *
1352
+ * @example with 2 joyn-media-items
1353
+ *
1354
+ * ```html
1355
+ * <glomex-integration
1356
+ * integration-id="REPLACE_WITH_INTEGRATION_ID"
1357
+ * >
1358
+ * <joyn-media-item
1359
+ * id="REPLACE_WITH_JOYN_MEDIA_ID"
1360
+ * ></joyn-media-item>
1361
+ * <joyn-media-item
1362
+ * id="ANOTHER_JOYN_MEDIA_ID"
1363
+ * ></joyn-media-item>
1364
+ * </glomex-integration>
1365
+ * ```
1366
+ *
1367
+ * @example joyn-media-item targeting the stage environment
1368
+ *
1369
+ * ```html
1370
+ * <glomex-integration
1371
+ * integration-id="REPLACE_WITH_INTEGRATION_ID"
1372
+ * >
1373
+ * <joyn-media-item
1374
+ * id="REPLACE_WITH_JOYN_MEDIA_ID"
1375
+ * environment="stage"
1376
+ * ></joyn-media-item>
1377
+ * </glomex-integration>
1378
+ * ```
1379
+ */
1380
+ export declare class JoynMediaItemElement extends MediaItemElement {
1381
+ }
1252
1382
 
1253
1383
  export declare enum KnownMarkerName {
1254
1384
  PREROLL = "preroll",
@@ -1262,8 +1392,32 @@ export declare enum KnownMarkerName {
1262
1392
  REQUEST_RECOMMENDATIONS = "requestRecommendations"
1263
1393
  }
1264
1394
 
1395
+ /**
1396
+ * Loads the `<glomex-integration>` custom element by injecting the
1397
+ * `integration.js` script into the document. Does nothing if the element
1398
+ * is already defined.
1399
+ *
1400
+ * @example
1401
+ * ```ts
1402
+ * import { loadIntegrationComponent } from '@glomex/integration-web-component';
1403
+ *
1404
+ * loadIntegrationComponent();
1405
+ * ```
1406
+ */
1265
1407
  export declare function loadIntegrationComponent(): void;
1266
1408
 
1409
+ /**
1410
+ * Loads the variant CSS for the given integration ID by injecting a
1411
+ * `<link>` element into the document head. Does nothing if the stylesheet
1412
+ * is already loaded.
1413
+ *
1414
+ * @example
1415
+ * ```ts
1416
+ * import { loadIntegrationStyles } from '@glomex/integration-web-component';
1417
+ *
1418
+ * loadIntegrationStyles('my-integration-id');
1419
+ * ```
1420
+ */
1267
1421
  export declare function loadIntegrationStyles(integrationId: string): void;
1268
1422
 
1269
1423
  /**
@@ -1295,50 +1449,41 @@ export declare enum MarkerType {
1295
1449
  }
1296
1450
 
1297
1451
  /**
1298
- * Runtime error when the player fails to load or play a media item.
1299
- */
1300
- declare interface MediaError_2 {
1301
- name: 'MediaError';
1302
- /** Error code from the playback engine */
1303
- code: string;
1304
- /** A detailed error message */
1305
- message: string;
1306
- }
1307
- export { MediaError_2 as MediaError }
1308
-
1309
- /**
1310
- * Represents a media asset within the player.
1311
- *
1312
- * A minimal MediaItem requires only:
1313
- * - an `id`
1314
- * - a poster image
1315
- * - a title
1316
- * - a source
1452
+ * Represents the input description of a media asset for the player.
1317
1453
  *
1454
+ * A minimal playable `MediaItem` requires only a source — every other field is optional.
1318
1455
  * Additional fields can be supplied to support analytics, monetization, UI enhancements, and other use cases.
1319
- * In general, the richer the metadata, the more likely the MediaItem can satisfy all integration requirements.
1456
+ * In general, the richer the metadata, the more likely the `MediaItem` can satisfy all integration requirements.
1457
+ *
1458
+ * Alternatively, a {@link MediaItemReference} can be passed to the player instead of a
1459
+ * full `MediaItem`. A reference carries only an `id` and a `provider`, letting the player
1460
+ * resolve the complete media item from that provider by ID.
1461
+ *
1462
+ * When the player processes a `MediaItem` (or a resolved {@link MediaItemReference}) it
1463
+ * produces a {@link MediaItemResolved} — an expanded version where missing fields are
1464
+ * filled with defaults (e.g. `id`, `language`, `aspectRatio`) and additional data is
1465
+ * derived automatically.
1320
1466
  */
1321
1467
  export declare interface MediaItem {
1322
1468
  /**
1323
1469
  * Unique identifier of the media item.
1324
1470
  */
1325
- id: string;
1471
+ id?: string;
1326
1472
  /**
1327
1473
  * Additional ids that identify the media item in other systems
1328
1474
  */
1329
1475
  additionalIds?: {
1330
1476
  originId?: string;
1331
- originSourceId?: string;
1332
1477
  externalId?: string;
1333
1478
  };
1334
1479
  /**
1335
1480
  * Poster image of the media item.
1336
1481
  */
1337
- poster: string;
1482
+ poster?: string;
1338
1483
  /**
1339
1484
  * Sources of the media item.
1340
1485
  */
1341
- sources: MediaSource_2[];
1486
+ sources?: MediaSource_2[];
1342
1487
  /**
1343
1488
  * Array of text tracks for subtitles, captions, etc.
1344
1489
  * These tracks apply to the whole media item, not to individual sources.
@@ -1350,7 +1495,7 @@ export declare interface MediaItem {
1350
1495
  /**
1351
1496
  * Title of the media item.
1352
1497
  */
1353
- title: string;
1498
+ title?: string;
1354
1499
  /**
1355
1500
  * Duration of the media item in seconds. Not defined when livestream.
1356
1501
  */
@@ -1462,19 +1607,10 @@ export declare interface MediaItem {
1462
1607
  * @defaultValue `['all']` (worldwide)
1463
1608
  */
1464
1609
  regionsAllowed?: string[];
1465
- /**
1466
- * Will be automatically filled based on {@link minimumAge} and {@link iabCategories}.
1467
- * @ignore */
1468
- ppsj?: string;
1469
1610
  /**
1470
1611
  * Mark this media item as a recommendation.
1471
1612
  */
1472
1613
  isRecommendation?: boolean;
1473
- /**
1474
- * An internal marker for the used playlist. It is automatically filled.
1475
- * @ignore
1476
- */
1477
- playlistId?: string;
1478
1614
  /**
1479
1615
  * JSON-LD `contentUrl` that allows search engines to crawl the media source.
1480
1616
  * You should only allow known crawlers ({@link https://developers.google.com/search/docs/crawling-indexing/verifying-googlebot?hl=en how to verify Googlebot & Crawler})
@@ -1594,11 +1730,6 @@ export declare interface MediaItem {
1594
1730
  poster?: string;
1595
1731
  }[];
1596
1732
  };
1597
- /**
1598
- * Only relevant for glomex-internal use. Mark it to allow teaser experiments.
1599
- * @ignore
1600
- */
1601
- allowTeaserExperiments?: boolean;
1602
1733
  /**
1603
1734
  * An additional API script definition that should be executed for this media-item.
1604
1735
  * @ignore
@@ -1608,10 +1739,6 @@ export declare interface MediaItem {
1608
1739
  * Indicates the source from which additional metadata was derived (e.g., "joyn").
1609
1740
  */
1610
1741
  metadataSource?: string;
1611
- /**
1612
- * Indicates the provider of the media item
1613
- */
1614
- provider?: MediaItemProvider;
1615
1742
  /**
1616
1743
  * Name of actors appearing in the given media item
1617
1744
  *
@@ -1639,14 +1766,18 @@ export declare interface MediaItem {
1639
1766
  * <script>
1640
1767
  * class CustomMediaItemElement extends HTMLElement {
1641
1768
  * get data() {
1642
- * return fetch(`https://api.example.com/media/${this.getAttribute('id')}`)
1769
+ * return fetch(`https://api.example.com/media/${this.id}`)
1643
1770
  * .then(response => response.json())
1644
1771
  * .then((body) => ({
1645
- * id: this.getAttribute('id'),
1646
- * sources: body.sources,
1647
- * duration: body.duration,
1648
- * poster: body.poster,
1649
- * title: body.title
1772
+ * id: this.id,
1773
+ * provider: 'external',
1774
+ * item: {
1775
+ * id: this.id,
1776
+ * sources: body.sources,
1777
+ * duration: body.duration,
1778
+ * poster: body.poster,
1779
+ * title: body.title
1780
+ * }
1650
1781
  * }));
1651
1782
  * }
1652
1783
  * }
@@ -1658,24 +1789,62 @@ export declare interface MediaItem {
1658
1789
  * <custom-media-item id="API_CONTENT_ID"></custom-media-item>
1659
1790
  * </glomex-integration>
1660
1791
  * ```
1792
+ *
1793
+ * @example of a custom media item that returns multiple items
1794
+ *
1795
+ * The `data` getter can also return an array of {@link MediaItemReference} objects
1796
+ * to define a playlist from a single element.
1797
+ *
1798
+ * ```html
1799
+ * <script>
1800
+ * class CustomPlaylistElement extends HTMLElement {
1801
+ * get data() {
1802
+ * return fetch(`https://api.example.com/playlist/${this.id}`)
1803
+ * .then(response => response.json())
1804
+ * .then((body) => body.items.map((item) => ({
1805
+ * id: item.id,
1806
+ * provider: 'external',
1807
+ * item: {
1808
+ * id: item.id,
1809
+ * sources: item.sources,
1810
+ * duration: item.duration,
1811
+ * poster: item.poster,
1812
+ * title: item.title
1813
+ * }
1814
+ * })));
1815
+ * }
1816
+ * }
1817
+ * window.customElements.define('custom-playlist', CustomPlaylistElement);
1818
+ * </script>
1819
+ * <glomex-integration
1820
+ * integration-id="REPLACE_WITH_INTEGRATION_ID"
1821
+ * >
1822
+ * <custom-playlist id="API_PLAYLIST_ID"></custom-playlist>
1823
+ * </glomex-integration>
1824
+ * ```
1661
1825
  */
1662
- export declare interface MediaItemElement extends HTMLElement {
1663
- readonly data: MediaItem | MediaItem[] | Promise<MediaItem | MediaItem[]>;
1826
+ export declare abstract class MediaItemElement extends HTMLElement {
1827
+ /**
1828
+ * The content ID used by the provider to look up the media item.
1829
+ * For glomex, this can be a media ID or a playlist ID.
1830
+ * For Joyn, this is a Joyn media ID.
1831
+ * @attribute id
1832
+ */
1833
+ id: string;
1834
+ /**
1835
+ * The environment to use for the provider.
1836
+ * @attribute {stage|prod} environment
1837
+ * @defaultValue 'prod'
1838
+ */
1839
+ environment?: 'stage' | 'prod';
1840
+ abstract get data(): MediaItemReference | MediaItemReference[] | Promise<MediaItemReference | MediaItemReference[]>;
1664
1841
  }
1665
1842
 
1666
1843
  /**
1667
- * Serializable error with the reason why a media item is not available.
1668
- * `name` is set to `MediaItemError` internally.
1844
+ * Error known before the media item gets loaded.
1669
1845
  */
1670
- export declare interface MediaItemError {
1671
- /**
1672
- * @protected
1673
- */
1674
- name?: 'MediaItemError';
1675
- /** Error code that gets handled by the player */
1676
- code: MediaItemErrorCode;
1677
- /** Optional custom error message or code from the source system */
1678
- message?: string;
1846
+ export declare class MediaItemError extends BaseMediaError<MediaItemErrorCode> {
1847
+ name: string;
1679
1848
  }
1680
1849
 
1681
1850
  export declare enum MediaItemErrorCode {
@@ -1684,6 +1853,7 @@ export declare enum MediaItemErrorCode {
1684
1853
  GEOBLOCKED = "Geoblocked",
1685
1854
  YOUTH_PROTECTED = "YouthProtected",
1686
1855
  TERMINATED = "Terminated",
1856
+ EXPIRED = "Expired",
1687
1857
  LOGIN_REQUIRED = "LoginRequired",
1688
1858
  HIGHER_TIER_ACCOUNT_REQUIRED = "HigherTierAccountRequired",
1689
1859
  VPN_DETECTED = "VpnDetected",
@@ -1702,6 +1872,79 @@ export declare enum MediaItemProvider {
1702
1872
  EXTERNAL = "external"
1703
1873
  }
1704
1874
 
1875
+ /**
1876
+ * Describes how to fetch a media item from a given provider.
1877
+ *
1878
+ * The provider resolves the media item by its {@link id}. When an {@link item}
1879
+ * is supplied, its properties are merged on top of the fetched result, allowing
1880
+ * callers to override individual fields such as `title` or `poster`.
1881
+ */
1882
+ export declare interface MediaItemReference {
1883
+ /** Media item ID used by the provider to look up the content. */
1884
+ id: string;
1885
+ /** Provider that is responsible for resolving this media item. */
1886
+ provider: MediaItemProvider | `${MediaItemProvider}`;
1887
+ /**
1888
+ * Target environment for the provider request.
1889
+ * @defaultValue 'prod'
1890
+ */
1891
+ environment?: 'stage' | 'prod';
1892
+ /**
1893
+ * Optional partial media item whose properties are merged on top of the
1894
+ * data returned by the provider, allowing individual fields to be overridden.
1895
+ *
1896
+ * **Required** when the provider is `external`, since there is no remote
1897
+ * source to fetch the media item from.
1898
+ */
1899
+ item?: MediaItem;
1900
+ }
1901
+
1902
+ /**
1903
+ * Represents a {@link MediaItem} after it has been resolved by the player.
1904
+ *
1905
+ * When a {@link MediaItem} is passed to the player, it is expanded into a
1906
+ * `MediaItemResolved`: fields that were omitted receive sensible defaults
1907
+ * (e.g. `id`, `language`, `aspectRatio`), and additional fields such as
1908
+ * `originalId`, `provider`, and `ppsj` are derived automatically.
1909
+ *
1910
+ * As a result, several properties that are optional on {@link MediaItem}
1911
+ * become required here.
1912
+ */
1913
+ export declare interface MediaItemResolved extends Omit<MediaItem, 'id' | 'sources' | 'title' | 'regionsAllowed' | 'aspectRatio' | 'minimumAge' | 'iabCategoryTaxonomy' | 'language'> {
1914
+ id: NonNullable<MediaItem['id']>;
1915
+ sources: NonNullable<MediaItem['sources']>;
1916
+ title: NonNullable<MediaItem['title']>;
1917
+ regionsAllowed: NonNullable<MediaItem['regionsAllowed']>;
1918
+ /**
1919
+ * An internal marker for the used playlist. It is automatically filled.
1920
+ * @ignore
1921
+ */
1922
+ playlistId: string;
1923
+ aspectRatio: NonNullable<MediaItem['aspectRatio']>;
1924
+ minimumAge: NonNullable<MediaItem['minimumAge']>;
1925
+ iabCategoryTaxonomy: NonNullable<MediaItem['iabCategoryTaxonomy']>;
1926
+ language: NonNullable<MediaItem['language']>;
1927
+ /**
1928
+ * Mark this media item to allow teaser experiments.
1929
+ * @ignore
1930
+ */
1931
+ allowTeaserExperiments: boolean;
1932
+ /**
1933
+ * Will be automatically filled based on {@link MediaItem#minimumAge} and {@link MediaItem#iabCategories}.
1934
+ * @ignore
1935
+ */
1936
+ ppsj?: string;
1937
+ /**
1938
+ * The original ID of the media item before any transformations.
1939
+ * It gets automatically generated if not provided.
1940
+ */
1941
+ originalId: string;
1942
+ /**
1943
+ * Indicates the provider of the media item.
1944
+ */
1945
+ provider: MediaItemProvider | `${MediaItemProvider}`;
1946
+ }
1947
+
1705
1948
  /**
1706
1949
  * Text track definition for a media item.
1707
1950
  * Based on {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLTrackElement | HTMLTrackElement}.
@@ -1738,12 +1981,44 @@ export declare interface MediaItemTextTrack {
1738
1981
  * Shaka Player network errors have codes in the 1000-1999 range
1739
1982
  * while HTMLMediaElement errors with 2 and 4 are considered network errors.
1740
1983
  */
1741
- export declare interface MediaNetworkError {
1742
- name: 'MediaNetworkError';
1743
- /** Shaka error code (1000-1999 range) or HTMLMediaElement error code (2, 4) */
1744
- code: string;
1745
- /** A detailed error message */
1746
- message: string;
1984
+ export declare class MediaNetworkError extends BaseMediaError {
1985
+ name: string;
1986
+ }
1987
+
1988
+ /**
1989
+ * Error after loading the media item.
1990
+ */
1991
+ export declare class MediaPlaybackError extends BaseMediaError {
1992
+ name: string;
1993
+ }
1994
+
1995
+ /**
1996
+ * Context object returned by a media-provider resolver registered via
1997
+ * {@link SharedContextData.providers}.
1998
+ *
1999
+ * Only {@link token} is required. Additional provider-specific fields
2000
+ * (e.g. subscription state, user ID) can be added freely.
2001
+ */
2002
+ export declare interface MediaProviderContext {
2003
+ /** Authentication token (should be fresh / handle refresh internally). */
2004
+ token: string;
2005
+ /** Any additional provider-specific fields. */
2006
+ [key: string]: unknown;
2007
+ }
2008
+
2009
+ /**
2010
+ * Error while fetching metadata of the media item.
2011
+ */
2012
+ export declare class MediaProviderError extends BaseMediaError<MediaProviderErrorCode> {
2013
+ name: string;
2014
+ }
2015
+
2016
+ export declare enum MediaProviderErrorCode {
2017
+ NOT_FOUND = "NotFound",
2018
+ FORBIDDEN = "Forbidden",
2019
+ HIDDEN = "Hidden",
2020
+ NO_CONTENT = "NoContent",
2021
+ GENERIC = "Generic"
1747
2022
  }
1748
2023
 
1749
2024
  declare type MediaSource_2 = MediaSourceBase | MediaSourceDrm | MediaSourceJoyn | MediaSourceDynamicContent;
@@ -1845,6 +2120,10 @@ export declare interface MediaSourceJoyn {
1845
2120
  * Shall the source be observed independent of business model?
1846
2121
  */
1847
2122
  forceObserveTermination?: boolean;
2123
+ /**
2124
+ * @ignore
2125
+ */
2126
+ validUntil?: number;
1848
2127
  }
1849
2128
 
1850
2129
  /**
@@ -1902,14 +2181,17 @@ export declare enum Mimetype {
1902
2181
  JOYN = "application/x-joyn-source"
1903
2182
  }
1904
2183
 
1905
- export declare enum Origin {
1906
- DEFAULT = "turbo-integration",
1907
- SCRIPT = "turbo-script",
1908
- IFRAME = "turbo-iframe",
1909
- FULLPAGE = "turbo-fullpage",
1910
- AMP_VIDEO_IFRAME = "turbo-amp-video-iframe",
1911
- AMP_IFRAME = "turbo-amp-iframe"
1912
- }
2184
+ /**
2185
+ * Normalizes a {@link MediaItem} or {@link MediaItemReference} into a
2186
+ * {@link MediaItemReference}.
2187
+ *
2188
+ * @ignore
2189
+ *
2190
+ * If the input already has a `provider` it is returned as-is.
2191
+ * Otherwise the provider is detected from the media item's sources
2192
+ * (Joyn when a source with {@link Mimetype.JOYN} is present, external otherwise).
2193
+ */
2194
+ export declare function normalizeMediaItem(input: MediaItemReference | MediaItem): MediaItemReference;
1913
2195
 
1914
2196
  export declare interface Page {
1915
2197
  url: string;
@@ -1943,13 +2225,13 @@ export declare enum PresentationMode {
1943
2225
  AMP_DOCK = "amp-dock"
1944
2226
  }
1945
2227
 
1946
- export declare type PresentationModeString = `${PresentationMode}`;
1947
-
1948
- export declare const PUBLIC_PREFIX = "glomex";
1949
-
1950
2228
  export declare enum ScriptType {
1951
- INTEGRATION_CONFIGS = "application/glomex-integration-configs+json",
1952
- EXTERNAL_MEDIA_ITEM = "application/glomex-external-media-item+json"
2229
+ INTEGRATION_CONFIGS = "application/integration-configs+json",
2230
+ /** @deprecated Use {@link ScriptType.INTEGRATION_CONFIGS} instead. */
2231
+ INTEGRATION_CONFIGS_LEGACY = "application/glomex-integration-configs+json",
2232
+ EXTERNAL_MEDIA_ITEM = "application/external-media-item+json",
2233
+ /** @deprecated Use {@link ScriptType.EXTERNAL_MEDIA_ITEM} instead. */
2234
+ EXTERNAL_MEDIA_ITEM_LEGACY = "application/glomex-external-media-item+json"
1953
2235
  }
1954
2236
 
1955
2237
  /**
@@ -1964,6 +2246,195 @@ export declare interface SeekRange {
1964
2246
  end?: number;
1965
2247
  }
1966
2248
 
2249
+ /**
2250
+ * A global context singleton shared by every `<glomex-integration>` instance
2251
+ * on the page.
2252
+ *
2253
+ * @example JavaScript (dynamic import)
2254
+ * ```ts
2255
+ * const { sharedContext } = await import('https://player.glomex.com/integration/1/integration.js');
2256
+ *
2257
+ * sharedContext.set({
2258
+ * appVersion: '2.3.0',
2259
+ * appName: 'my-app',
2260
+ * deviceId: { id: '...', name: 'idfa' },
2261
+ * userIds: async () => await cmp.getConsentedUserIds(),
2262
+ * providers: {
2263
+ * 'my-provider': async () => ({
2264
+ * token: await myAuth.getFreshToken(),
2265
+ * }),
2266
+ * },
2267
+ * });
2268
+ * ```
2269
+ *
2270
+ * @example React
2271
+ * ```tsx
2272
+ * import { getSharedContext } from '@glomex/integration-react';
2273
+ * import { useEffect } from 'react';
2274
+ *
2275
+ * function App() {
2276
+ * useEffect(() => {
2277
+ * async function setup() {
2278
+ * const sharedContext = await getSharedContext();
2279
+ * sharedContext.set({
2280
+ * appVersion: '2.3.0',
2281
+ * appName: 'my-app',
2282
+ * deviceId: { id: '...', name: 'idfa' },
2283
+ * userIds: async () => await cmp.getConsentedUserIds(),
2284
+ * providers: {
2285
+ * 'my-provider': async () => ({
2286
+ * token: await myAuth.getFreshToken(),
2287
+ * }),
2288
+ * },
2289
+ * });
2290
+ * }
2291
+ * setup();
2292
+ * }, []);
2293
+ * }
2294
+ * ```
2295
+ */
2296
+ export declare interface SharedContext {
2297
+ /**
2298
+ * Merge context data into the shared context.
2299
+ *
2300
+ * - Provider resolvers under `providers` are merged individually —
2301
+ * only the specified providers are replaced, others are kept.
2302
+ * - Calling `set()` multiple times merges incrementally.
2303
+ */
2304
+ set(data: SharedContextData): void;
2305
+ }
2306
+
2307
+ /**
2308
+ * Module-level singleton shared by every `<glomex-integration>` instance on
2309
+ * the page.
2310
+ *
2311
+ * Publishers obtain it via dynamic import of `integration.js` to ensure they
2312
+ * get the same singleton instance as the running player:
2313
+ *
2314
+ * ```ts
2315
+ * const { sharedContext } = await import('https://player.glomex.com/integration/1/integration.js');
2316
+ * ```
2317
+ *
2318
+ * When using the React wrapper, use {@link https://www.npmjs.com/package/@glomex/integration-react @glomex/integration-react} instead:
2319
+ *
2320
+ * ```ts
2321
+ * import { getSharedContext } from '@glomex/integration-react';
2322
+ *
2323
+ * const sharedContext = await getSharedContext();
2324
+ * ```
2325
+ */
2326
+ export declare const sharedContext: SharedContext;
2327
+
2328
+ /**
2329
+ * The data object accepted by {@link SharedContext.set}.
2330
+ *
2331
+ * Every field is optional and merged on top of previously set values.
2332
+ * Calling `set()` multiple times merges incrementally — previously set
2333
+ * values are preserved unless explicitly overwritten.
2334
+ */
2335
+ export declare interface SharedContextData {
2336
+ /**
2337
+ * The presentational context of the integration.
2338
+ * Do not define it when it is not part of those contexts.
2339
+ */
2340
+ presentationalContext?: 'curated-list' | 'discovery-page';
2341
+ /**
2342
+ * The version of the app.
2343
+ * When it is a website, fill in the deployed version of the website.
2344
+ */
2345
+ appVersion?: string;
2346
+ /**
2347
+ * The name of the app.
2348
+ * When it is a website, fill in the name of the project.
2349
+ */
2350
+ appName?: string;
2351
+ /**
2352
+ * The bundle id of the app. Only required for iOS apps.
2353
+ */
2354
+ appBundleId?: string;
2355
+ /**
2356
+ * The store id of the app. Only required for apps.
2357
+ * Depending on the app store, the id is formatted differently.
2358
+ *
2359
+ * {@link https://iabtechlab.com/wp-content/uploads/2020/08/IAB-Tech-Lab-OTT-store-assigned-App-Identification-Guidelines-2020.pdf IAB Tech Lab App Identification Guidelines}
2360
+ */
2361
+ appStoreId?: string;
2362
+ /**
2363
+ * The store URL of the app. Only required for apps.
2364
+ *
2365
+ * {@link https://iabtechlab.com/wp-content/uploads/2020/08/IAB-Tech-Lab-OTT-store-assigned-App-Identification-Guidelines-2020.pdf IAB Tech Lab App Identification Guidelines}
2366
+ */
2367
+ appStoreUrl?: string;
2368
+ /** Business-to-business context identifier. */
2369
+ b2bContext?: string;
2370
+ /**
2371
+ * Device id of the user. Only required for app environments.
2372
+ * When no listed deviceId is available, you can pass a ppid as a user id instead.
2373
+ */
2374
+ deviceId?: {
2375
+ id: string;
2376
+ name: DeviceIdName | `${DeviceIdName}`;
2377
+ };
2378
+ /**
2379
+ * Identifiers for the current user (e.g. netID, LiveRamp, PAIR).
2380
+ *
2381
+ * You can pass either a **static array** or a **resolver function**.
2382
+ * A resolver is re-invoked every time the player needs user IDs
2383
+ * (for example before each ad request), so it can return a different
2384
+ * set of IDs when the user's consent state has changed.
2385
+ * The resolver may be asynchronous.
2386
+ *
2387
+ * @example Static array
2388
+ * ```ts
2389
+ * sharedContext.set({
2390
+ * userIds: [{ id: '...', name: 'netId' }],
2391
+ * });
2392
+ * ```
2393
+ *
2394
+ * @example Async resolver (re-evaluated on every ad request)
2395
+ * ```ts
2396
+ * sharedContext.set({
2397
+ * userIds: async () => await cmp.getConsentedUserIds(),
2398
+ * });
2399
+ * ```
2400
+ */
2401
+ userIds?: {
2402
+ id: string;
2403
+ name: UserIdName | `${UserIdName}`;
2404
+ ext?: Record<string, unknown>;
2405
+ }[] | (() => {
2406
+ id: string;
2407
+ name: UserIdName | `${UserIdName}`;
2408
+ ext?: Record<string, unknown>;
2409
+ }[] | Promise<{
2410
+ id: string;
2411
+ name: UserIdName | `${UserIdName}`;
2412
+ ext?: Record<string, unknown>;
2413
+ }[]>);
2414
+ /**
2415
+ * Media-provider-specific context resolvers keyed by provider name.
2416
+ *
2417
+ * Each resolver is called every time the player needs fresh context for
2418
+ * the given provider (e.g. to obtain a fresh auth token).
2419
+ *
2420
+ * @example
2421
+ * ```ts
2422
+ * sharedContext.set({
2423
+ * providers: {
2424
+ * 'my-provider': async () => ({
2425
+ * token: await myAuth.getFreshToken(),
2426
+ * }),
2427
+ * },
2428
+ * });
2429
+ * ```
2430
+ */
2431
+ providers?: {
2432
+ [providerName: string]: (context?: {
2433
+ environment?: string;
2434
+ }) => MediaProviderContext | Promise<MediaProviderContext>;
2435
+ };
2436
+ }
2437
+
1967
2438
  export declare enum StartMethod {
1968
2439
  /** Autoplay occured for above the fold content */
1969
2440
  PRE_CLICK = "pre-click-to-play",
@@ -2021,7 +2492,25 @@ declare interface TextTrackList_2 extends MediaTrackList<TextTrack_2> {
2021
2492
  }
2022
2493
  export { TextTrackList_2 as TextTrackList }
2023
2494
 
2024
- export declare type UiAction = (typeof ALLOWED_UI_ACTIONS)[number];
2495
+ declare type UiAction = (typeof ALLOWED_UI_ACTIONS)[number];
2496
+
2497
+ /**
2498
+ * Identifier names for user IDs that can be passed via {@link SharedContextData.userIds}.
2499
+ */
2500
+ export declare enum UserIdName {
2501
+ /** {@link https://netid.de netID} — European login alliance ID */
2502
+ NET_ID = "netId",
2503
+ /** {@link https://7pass.de 7Pass} — ProSiebenSat.1 login ID */
2504
+ SEVEN_PASS_ID = "sevenPassId",
2505
+ /** Publisher Provided ID */
2506
+ PPID = "ppid",
2507
+ /** {@link https://utiq.com Utiq} — telco-based advertising ID */
2508
+ UTIQ_ID = "utiqId",
2509
+ /** {@link https://liveramp.com LiveRamp} — identity resolution ID */
2510
+ LIVERAMP_ID = "liverampId",
2511
+ /** {@link https://developers.google.com/interactive-media-ads/docs/sdks/html5/client-side/pair Google PAIR} — Publisher Advertiser Identity Reconciliation ID */
2512
+ PAIR_ID = "pairId"
2513
+ }
2025
2514
 
2026
2515
  /**
2027
2516
  * Represents a video track (quality variant).
@@ -2089,6 +2578,7 @@ declare global {
2089
2578
  interface HTMLElementTagNameMap {
2090
2579
  [ComponentName.INTEGRATION]: IntegrationElement;
2091
2580
  [ComponentName.GLOMEX_MEDIA_ITEM]: GlomexMediaItemElement;
2581
+ [ComponentName.JOYN_MEDIA_ITEM]: JoynMediaItemElement;
2092
2582
  [ComponentName.EXTERNAL_MEDIA_ITEM]: ExternalMediaItemElement;
2093
2583
  }
2094
2584
  interface HTMLElementEventMap extends IntegrationElementEventMap {}
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- (_=m||(m={})).DEFAULT="turbo-integration",_.SCRIPT="turbo-script",_.IFRAME="turbo-iframe",_.FULLPAGE="turbo-fullpage",_.AMP_VIDEO_IFRAME="turbo-amp-video-iframe",_.AMP_IFRAME="turbo-amp-iframe",(N=D||(D={})).INTEGRATION="glomex-integration",N.EXTERNAL_MEDIA_ITEM="glomex-external-media-item",N.GLOMEX_MEDIA_ITEM="glomex-media-item",(I=u||(u={})).INTEGRATION_CONFIGS="application/glomex-integration-configs+json",I.EXTERNAL_MEDIA_ITEM="application/glomex-external-media-item+json";let e="turbo",t=`${e}-player`,E=`${e}DebugPlayerConfig`;(A=P||(P={})).HIDDEN="hidden",A.INLINE="inline",A.DOCK="dock",A.LIGHTBOX="lightbox",A.LIGHTBOX_EXTERNAL="lightbox-external",A.FULLSCREEN="fullscreen",A.AMP_DOCK="amp-dock",(l=S||(S={})).READY="ready",l.INTEGRATION_ABORT="integrationabort",l.INTEGRATION_AD_AVAILABLE="integrationadavailable",l.INTEGRATION_PASSBACK="integrationpassback",l.USER_UPDATE_CONSENT="userupdateconsent",l.PLAYLIST_UPDATE="playlistupdate",l.PLAYER_SET_PRESENTATION_MODE="playersetpresentationmode",l.CONTENT_SELECT="contentselect",l.CONTENT_START="contentstart",l.CONTENT_IMPRESSION="contentimpression",l.CONTENT_BUFFERING_START="contentbufferingstart",l.CONTENT_BUFFERING_END="contentbufferingend",l.CONTENT_STOP="contentstop",l.CONTENT_ERROR="contenterror",l.CONTENT_MARKER_REACHED="contentmarkerreached",l.CONTENT_TIME_UPDATE="timeupdate",l.CONTENT_SEEKING="seeking",l.CONTENT_SEEKED="seeked",l.CONTENT_PLAY="play",l.CONTENT_PAUSE="pause",l.CONTENT_VOLUME_CHANGE="volumechange",l.CONTENT_RATECHANGE="ratechange",l.CONTENT_ENDED="ended",l.AD_BREAK_REQUEST="adbreakrequest",l.AD_BREAK_REQUEST_ERROR="adbreakrequesterror",l.AD_LOADED="adloaded",l.AD_IMPRESSION="adimpression",l.AD_BUFFERING_START="adbufferingstart",l.AD_BUFFERING_END="adbufferingend",l.AD_TIME_UPDATE="adtimeupdate",l.AD_VOLUME_CHANGE="advolumechange",l.AD_PAUSED="adpaused",l.AD_RESUMED="adresumed",l.AD_CLICK="adclick",l.AD_SKIPPED="adskipped",l.AD_COMPLETE="adcomplete",l.AD_ERROR="aderror",l.UI_INTERACTION="uiinteraction",(R=M||(M={})).TIME_IN_SECONDS="time",R.PERCENT="percent",R.TIME_IN_SECONDS_RECURRING="timeRecurring",(s=g||(g={})).PREROLL="preroll",s.MIDROLL="midroll",s.POSTROLL="postroll",s.FIRST_QUARTILE="contentFirstQuartile",s.MIDPOINT="contentMidpoint",s.THIRD_QUARTILE="contentThirdQuartile",s.COMPLETE="contentComplete",s.STILL_INTERESTING="stillInteresting",s.REQUEST_RECOMMENDATIONS="requestRecommendations",(d=U||(U={})).NOT_FOUND="NotFound",d.NOT_AVAILABLE="NotAvailable",d.GEOBLOCKED="Geoblocked",d.YOUTH_PROTECTED="YouthProtected",d.TERMINATED="Terminated",d.LOGIN_REQUIRED="LoginRequired",d.HIGHER_TIER_ACCOUNT_REQUIRED="HigherTierAccountRequired",d.VPN_DETECTED="VpnDetected",d.AGE_VERIFICATION_REQUIRED="AgeVerificationRequired",d.PIN_REQUIRED="PinRequired",d.INVALID_PIN="InvalidPin",d.GENERIC="Generic",(c=G||(G={})).GLOMEX="glomex",c.JOYN="joyn",c.EXTERNAL="external",(p=y||(y={})).HLS="application/vnd.apple.mpegurl",p.HLS_LEGACY="application/x-mpegURL",p.DASH="application/dash+xml",p.MP4="video/mp4",p.OGG="video/ogg",p.WEBM="video/webm",p.MP3="audio/mp3",p.AAC="audio/aac",p.WAV="audio/wav",p.OGG_AUDIO="audio/ogg",p.MPEG_AUDIO="audio/mpeg",p.DYNAMIC_CONTENT="application/x-turbo-dynamic-content",p.JOYN="application/x-joyn-source",(O=b||(b={})).LIVE="live",O.VOD="vod",O.INTERACTIVE="interactive",O.EMBED="embed",(C=F||(F={})).PRE_CLICK="pre-click-to-play",C.CLICK="click-to-play",C.AUTOPLAY_SCROLL="autoplay-scroll",C.AUTOPLAY_SCROLL_OUT="autoplay-scroll-out",C.CLICK_NEXT="click-to-play-next",C.CLICK_REPLAY="click-to-play-replay",C.AUTOPLAY_NEXT="autoplay-next",(L=f||(f={})).CLEAR_PLAYLIST="clearPlaylist",L.SELECT_PLAYLIST_ITEM="selectPlaylistItem",L.ENDED="ended",L.CONTENT_ERROR="contentError",L.API_STOP="apiStop",L.LIVESTREAM_STOP="livestreamStop",L.PAGE_HIDE="pageHide",L.BEFORE_UNLOAD="beforeUnload";let n=["play","pause","openEpg","startAgeSetup","forgotPin"],a="player.glomex.com",o=`https://${a}/integration/1/integration.js`;function i(e){return`https://${a}/variant/${e}/variant.css`}function r(){if(window.customElements.get(D.INTEGRATION))return;let e=document.createElement("script");e.innerText=`import('${o}');`,e.type="module",(document.head||document.body).appendChild(e)}function T(e){if(document.querySelector(`link[href="${i(e)}"]`))return;let t=document.createElement("link");t.rel="stylesheet",t.href=i(e),(document.head||document.body).appendChild(t)}var _,N,I,A,l,R,s,d,c,p,O,C,L,m,D,u,P,S,M,g,U,G,y,b,F,f,k="turbo",x="glomex";export{n as ALLOWED_UI_ACTIONS,D as ComponentName,f as ContentStopReason,E as DEBUG_CONFIG_STORAGE_KEY,t as EXTERNAL_PLAYER_NAME,S as IntegrationEvent,g as KnownMarkerName,M as MarkerType,U as MediaItemErrorCode,G as MediaItemProvider,y as Mimetype,m as Origin,b as PlaybackMode,P as PresentationMode,u as ScriptType,F as StartMethod,i as getIntegrationCssUrl,r as loadIntegrationComponent,T as loadIntegrationStyles,k as INTERNAL_PREFIX,x as PUBLIC_PREFIX};
1
+ function e(e){if("provider"in e)return e;let t=e.sources?.some(e=>e.mimetype===k.JOYN);return{id:e.id||"",provider:t?h.JOYN:h.EXTERNAL,item:e}}(I=S||(S={})).DEFAULT="turbo-integration",I.SCRIPT="turbo-script",I.IFRAME="turbo-iframe",I.FULLPAGE="turbo-fullpage",I.AMP_VIDEO_IFRAME="turbo-amp-video-iframe",I.AMP_IFRAME="turbo-amp-iframe",(T=M||(M={})).INTEGRATION="glomex-integration",T.EXTERNAL_MEDIA_ITEM="external-media-item",T.GLOMEX_MEDIA_ITEM="glomex-media-item",T.JOYN_MEDIA_ITEM="joyn-media-item",(d=g||(g={})).INTEGRATION_CONFIGS="application/integration-configs+json",d.INTEGRATION_CONFIGS_LEGACY="application/glomex-integration-configs+json",d.EXTERNAL_MEDIA_ITEM="application/external-media-item+json",d.EXTERNAL_MEDIA_ITEM_LEGACY="application/glomex-external-media-item+json";let t="turbo-player";(_=U||(U={})).NET_ID="netId",_.SEVEN_PASS_ID="sevenPassId",_.PPID="ppid",_.UTIQ_ID="utiqId",_.LIVERAMP_ID="liverampId",_.PAIR_ID="pairId",(N=G||(G={})).AAID="aaid",N.AFAI="afai",N.ASIA="asia",N.ASID="asid",N.TIFA="tifa",N.VAID="vaid",N.IDFA="idfa",N.IDFV="idfv",N.LGUDID="lgudid",N.MSAI="msai",N.OAID="oaid",N.PSNAI="psnai",N.RIDA="rida",N.VIDA="vida",N.WAID="waid",(A=y||(y={})).HIDDEN="hidden",A.INLINE="inline",A.DOCK="dock",A.LIGHTBOX="lightbox",A.LIGHTBOX_EXTERNAL="lightbox-external",A.FULLSCREEN="fullscreen",A.AMP_DOCK="amp-dock",(s=v||(v={})).READY="ready",s.INTEGRATION_ABORT="integrationabort",s.INTEGRATION_AD_AVAILABLE="integrationadavailable",s.INTEGRATION_PASSBACK="integrationpassback",s.USER_UPDATE_CONSENT="userupdateconsent",s.PLAYLIST_UPDATE="playlistupdate",s.PLAYER_SET_PRESENTATION_MODE="playersetpresentationmode",s.CONTENT_SELECT="contentselect",s.CONTENT_START="contentstart",s.CONTENT_IMPRESSION="contentimpression",s.CONTENT_BUFFERING_START="contentbufferingstart",s.CONTENT_BUFFERING_END="contentbufferingend",s.CONTENT_STOP="contentstop",s.CONTENT_ERROR="contenterror",s.CONTENT_MARKER_REACHED="contentmarkerreached",s.CONTENT_TIME_UPDATE="timeupdate",s.CONTENT_SEEKING="seeking",s.CONTENT_SEEKED="seeked",s.CONTENT_PLAY="play",s.CONTENT_PAUSE="pause",s.CONTENT_VOLUME_CHANGE="volumechange",s.CONTENT_RATECHANGE="ratechange",s.CONTENT_ENDED="ended",s.AD_BREAK_REQUEST="adbreakrequest",s.AD_BREAK_REQUEST_ERROR="adbreakrequesterror",s.AD_LOADED="adloaded",s.AD_IMPRESSION="adimpression",s.AD_BUFFERING_START="adbufferingstart",s.AD_BUFFERING_END="adbufferingend",s.AD_TIME_UPDATE="adtimeupdate",s.AD_VOLUME_CHANGE="advolumechange",s.AD_PAUSED="adpaused",s.AD_RESUMED="adresumed",s.AD_CLICK="adclick",s.AD_SKIPPED="adskipped",s.AD_COMPLETE="adcomplete",s.AD_ERROR="aderror",s.UI_INTERACTION="uiinteraction",(l=F||(F={})).TIME_IN_SECONDS="time",l.PERCENT="percent",l.TIME_IN_SECONDS_RECURRING="timeRecurring",(R=b||(b={})).PREROLL="preroll",R.MIDROLL="midroll",R.POSTROLL="postroll",R.FIRST_QUARTILE="contentFirstQuartile",R.MIDPOINT="contentMidpoint",R.THIRD_QUARTILE="contentThirdQuartile",R.COMPLETE="contentComplete",R.STILL_INTERESTING="stillInteresting",R.REQUEST_RECOMMENDATIONS="requestRecommendations",(c=f||(f={})).NOT_FOUND="NotFound",c.FORBIDDEN="Forbidden",c.HIDDEN="Hidden",c.NO_CONTENT="NoContent",c.GENERIC="Generic",(p=x||(x={})).NOT_FOUND="NotFound",p.NOT_AVAILABLE="NotAvailable",p.GEOBLOCKED="Geoblocked",p.YOUTH_PROTECTED="YouthProtected",p.TERMINATED="Terminated",p.EXPIRED="Expired",p.LOGIN_REQUIRED="LoginRequired",p.HIGHER_TIER_ACCOUNT_REQUIRED="HigherTierAccountRequired",p.VPN_DETECTED="VpnDetected",p.AGE_VERIFICATION_REQUIRED="AgeVerificationRequired",p.PIN_REQUIRED="PinRequired",p.INVALID_PIN="InvalidPin",p.GENERIC="Generic",(O=h||(h={})).GLOMEX="glomex",O.JOYN="joyn",O.EXTERNAL="external",(m=k||(k={})).HLS="application/vnd.apple.mpegurl",m.HLS_LEGACY="application/x-mpegURL",m.DASH="application/dash+xml",m.MP4="video/mp4",m.OGG="video/ogg",m.WEBM="video/webm",m.MP3="audio/mp3",m.AAC="audio/aac",m.WAV="audio/wav",m.OGG_AUDIO="audio/ogg",m.MPEG_AUDIO="audio/mpeg",m.DYNAMIC_CONTENT="application/x-turbo-dynamic-content",m.JOYN="application/x-joyn-source",(D=Y||(Y={})).LIVE="live",D.VOD="vod",D.INTERACTIVE="interactive",D.EMBED="embed",(C=V||(V={})).PREROLL="preroll",C.MIDROLL="midroll",C.POSTROLL="postroll",C.OVERLAY="overlay",(L=B||(B={})).LINEAR="linear",L.OVERLAY="overlay",L.CUTIN="cutin",L.PAUSE="pause",(u=H||(H={})).PRE_CLICK="pre-click-to-play",u.CLICK="click-to-play",u.AUTOPLAY_SCROLL="autoplay-scroll",u.AUTOPLAY_SCROLL_OUT="autoplay-scroll-out",u.CLICK_NEXT="click-to-play-next",u.CLICK_REPLAY="click-to-play-replay",u.AUTOPLAY_NEXT="autoplay-next",(P=X||(X={})).CLEAR_PLAYLIST="clearPlaylist",P.SELECT_PLAYLIST_ITEM="selectPlaylistItem",P.ENDED="ended",P.CONTENT_ERROR="contentError",P.API_STOP="apiStop",P.LIVESTREAM_STOP="livestreamStop",P.PAGE_HIDE="pageHide",P.BEFORE_UNLOAD="beforeUnload";let a="player.glomex.com",n=`https://${a}/integration/1/integration.js`;function o(e){return`https://${a}/variant/${e}/variant.css`}function E(){if(window.customElements.get(M.INTEGRATION))return;let e=document.createElement("script");e.innerText=`import('${n}');`,e.type="module",(document.head||document.body).appendChild(e)}function i(e){if(document.querySelector(`link[href="${o(e)}"]`))return;let t=document.createElement("link");t.rel="stylesheet",t.href=o(e),(document.head||document.body).appendChild(t)}async function r(){await customElements.whenDefined(M.INTEGRATION);let e=customElements.get(M.INTEGRATION);if(!e?.sharedContext)throw Error("sharedContext not available on glomex-integration element");return e.sharedContext}var I,T,d,_,N,A,s,l,R,c,p,O,m,D,C,L,u,P,S,M,g,U,G,y,v,F,b,f,x,h,k,Y,V,B,H,X,K="turbo",w="glomex";export{V as AdBreakName,B as AdFormat,M as ComponentName,X as ContentStopReason,G as DeviceIdName,t as EXTERNAL_PLAYER_NAME,v as IntegrationEvent,b as KnownMarkerName,F as MarkerType,x as MediaItemErrorCode,h as MediaItemProvider,f as MediaProviderErrorCode,k as Mimetype,S as Origin,Y as PlaybackMode,y as PresentationMode,g as ScriptType,H as StartMethod,U as UserIdName,o as getIntegrationCssUrl,r as getSharedContext,E as loadIntegrationComponent,i as loadIntegrationStyles,e as normalizeMediaItem,K as INTERNAL_PREFIX,w as PUBLIC_PREFIX};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glomex/integration-web-component",
3
- "version": "1.1507.0",
3
+ "version": "1.1508.0",
4
4
  "description": "Web component and types to integrate the glomex player",
5
5
  "documentation": "https://docs.glomex.com",
6
6
  "homepage": "https://glomex.com",
@@ -32,7 +32,7 @@
32
32
  },
33
33
  "devDependencies": {
34
34
  "@biomejs/biome": "catalog:",
35
- "@glomex/integration": "1.1507.0",
35
+ "@glomex/integration": "1.1508.0",
36
36
  "@microsoft/api-extractor": "catalog:",
37
37
  "@rslib/core": "catalog:",
38
38
  "npm-run-all": "catalog:",
@@ -42,5 +42,5 @@
42
42
  "access": "public"
43
43
  },
44
44
  "license": "MIT",
45
- "gitHead": "a9b8ddf344bc3ae3777700af84e3f573aefb03e8"
45
+ "gitHead": "9d30ff98e3aad157ef49a62c3db150a9195eb7f8"
46
46
  }