@dolby-optiview/ads-sdk-core 1.5.1 → 1.6.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.
Files changed (115) hide show
  1. package/dist/OptiViewAds.d.ts +5 -0
  2. package/dist/OptiViewAds.js +1 -1
  3. package/dist/diagnostics/dispatchDiagnostic.d.ts +4 -0
  4. package/dist/diagnostics/dispatchDiagnostic.js +1 -0
  5. package/dist/generated/diagnosticCodes.d.ts +104 -4
  6. package/dist/generated/diagnosticCodes.js +1 -1
  7. package/dist/generated/version.d.ts +1 -1
  8. package/dist/generated/version.js +1 -1
  9. package/dist/index.d.ts +11 -4
  10. package/dist/index.js +1 -1
  11. package/dist/interfaces/PlayerAdapter.d.ts +27 -0
  12. package/dist/server/index.d.ts +2 -2
  13. package/dist/server/index.js +1 -1
  14. package/dist/services/AdBreakSequencer.d.ts +67 -3
  15. package/dist/services/AdBreakSequencer.js +1 -1
  16. package/dist/services/AdPlayerController.d.ts +9 -4
  17. package/dist/services/AdPlayerController.js +1 -1
  18. package/dist/services/BookmarkStart.d.ts +12 -0
  19. package/dist/services/BookmarkStart.js +1 -0
  20. package/dist/services/BreakScheduler.d.ts +8 -35
  21. package/dist/services/BreakScheduler.js +1 -1
  22. package/dist/services/BreakSchedulerTypes.d.ts +7 -1
  23. package/dist/services/BreakWarningTracker.d.ts +6 -0
  24. package/dist/services/BreakWarningTracker.js +1 -0
  25. package/dist/services/ContentEndTracker.d.ts +17 -0
  26. package/dist/services/ContentEndTracker.js +1 -0
  27. package/dist/services/ExternalPlaybackGate.d.ts +2 -2
  28. package/dist/services/ManifestService.d.ts +1 -1
  29. package/dist/services/ManifestService.js +1 -1
  30. package/dist/services/PauseAdController.d.ts +9 -5
  31. package/dist/services/PauseAdController.js +1 -1
  32. package/dist/services/PlaybackCrossing.d.ts +4 -0
  33. package/dist/services/PlaybackCrossing.js +1 -0
  34. package/dist/services/RewindRearm.js +1 -1
  35. package/dist/services/SchedulerSnapback.d.ts +1 -0
  36. package/dist/services/SchedulerSnapback.js +1 -1
  37. package/dist/services/SlateClock.d.ts +22 -0
  38. package/dist/services/SlateClock.js +1 -0
  39. package/dist/services/SnapbackGuard.d.ts +36 -2
  40. package/dist/services/SnapbackGuard.js +1 -1
  41. package/dist/services/VastAdManager.d.ts +2 -0
  42. package/dist/services/VastAdManager.js +1 -1
  43. package/dist/services/adPlayer/AdPlayerCallbacks.d.ts +9 -1
  44. package/dist/services/adPlayer/AdPlayerEvents.d.ts +21 -1
  45. package/dist/services/adPlayer/AdPlayerEvents.js +1 -1
  46. package/dist/services/adPlayer/AdPlayerState.d.ts +13 -0
  47. package/dist/services/adPlayer/AdPlayerState.js +1 -1
  48. package/dist/services/adPlayer/AdPreloader.d.ts +8 -1
  49. package/dist/services/adPlayer/AdPreloader.js +1 -1
  50. package/dist/services/adPlayer/AdStage.js +1 -1
  51. package/dist/services/adPlayer/AssetPlayback.d.ts +1 -0
  52. package/dist/services/adPlayer/AssetPlayback.js +1 -1
  53. package/dist/services/adPlayer/BreakSequenceDriver.d.ts +7 -1
  54. package/dist/services/adPlayer/BreakSequenceDriver.js +1 -1
  55. package/dist/services/adPlayer/ContentResumeCoordinator.d.ts +6 -0
  56. package/dist/services/adPlayer/ContentResumeCoordinator.js +1 -1
  57. package/dist/services/adPlayer/PauseAdPresenter.d.ts +10 -9
  58. package/dist/services/adPlayer/PauseAdPresenter.js +1 -1
  59. package/dist/services/adPlayer/PauseAdTracking.d.ts +13 -0
  60. package/dist/services/adPlayer/PauseAdTracking.js +1 -0
  61. package/dist/services/adPlayer/SharedElementBreakPlayer.d.ts +31 -2
  62. package/dist/services/adPlayer/SharedElementBreakPlayer.js +1 -1
  63. package/dist/services/adPlayer/SlateCoordinator.d.ts +58 -0
  64. package/dist/services/adPlayer/SlateCoordinator.js +1 -0
  65. package/dist/services/adPlayer/SlatePlayback.d.ts +89 -0
  66. package/dist/services/adPlayer/SlatePlayback.js +1 -0
  67. package/dist/services/adPlayer/VariantSelector.d.ts +10 -1
  68. package/dist/services/adPlayer/VariantSelector.js +1 -1
  69. package/dist/services/adPlayer/connectPauseAd.js +1 -1
  70. package/dist/services/adPlayer/presentation/PresentationLayout.d.ts +5 -2
  71. package/dist/services/adPlayer/presentation/PresentationLayout.js +1 -1
  72. package/dist/services/breakTiming.d.ts +1 -0
  73. package/dist/services/breakTiming.js +1 -1
  74. package/dist/services/parseBreakManifest.d.ts +2 -1
  75. package/dist/services/parseBreakManifest.js +1 -1
  76. package/dist/services/parseVastPause.d.ts +18 -0
  77. package/dist/services/parseVastPause.js +1 -0
  78. package/dist/services/resolveLshapeAnchor.d.ts +25 -0
  79. package/dist/services/resolveLshapeAnchor.js +1 -0
  80. package/dist/services/resolveSlate.d.ts +25 -0
  81. package/dist/services/resolveSlate.js +1 -0
  82. package/dist/services/resolveSlateFill.d.ts +39 -0
  83. package/dist/services/resolveSlateFill.js +1 -0
  84. package/dist/services/ssbSwitchSignals.d.ts +3 -0
  85. package/dist/services/ssbSwitchSignals.js +1 -1
  86. package/dist/session/AdBreakStatusTracker.d.ts +22 -2
  87. package/dist/session/AdBreakStatusTracker.js +1 -1
  88. package/dist/session/BreakLifecycle.js +1 -1
  89. package/dist/session/ContentPlaybackStart.d.ts +23 -0
  90. package/dist/session/ContentPlaybackStart.js +1 -0
  91. package/dist/session/DiscoveredManifestUrl.d.ts +44 -0
  92. package/dist/session/DiscoveredManifestUrl.js +1 -0
  93. package/dist/session/ScheduledBreaksTracker.d.ts +22 -0
  94. package/dist/session/ScheduledBreaksTracker.js +1 -0
  95. package/dist/session/SessionStarter.d.ts +3 -9
  96. package/dist/session/SessionStarter.js +1 -1
  97. package/dist/session/SessionStarterDeps.d.ts +3 -0
  98. package/dist/session/SessionStarterHelpers.d.ts +22 -1
  99. package/dist/session/SessionStarterHelpers.js +1 -1
  100. package/dist/session/SessionState.d.ts +16 -0
  101. package/dist/session/SessionState.js +1 -1
  102. package/dist/session/SsbSwitch.js +1 -1
  103. package/dist/session/buildScheduledBreaks.d.ts +9 -0
  104. package/dist/session/buildScheduledBreaks.js +1 -0
  105. package/dist/session/contentSnapback.d.ts +2 -2
  106. package/dist/session/contentSnapback.js +1 -1
  107. package/dist/session/scheduledBreaksSession.d.ts +6 -0
  108. package/dist/session/scheduledBreaksSession.js +1 -0
  109. package/dist/types/BreakManifest.d.ts +39 -1
  110. package/dist/types/BreakManifest.js +1 -1
  111. package/dist/types/Events.d.ts +13 -4
  112. package/dist/types/OptiViewAdsConfig.d.ts +15 -2
  113. package/dist/types/ScheduledBreak.d.ts +17 -0
  114. package/dist/types/ScheduledBreak.js +1 -0
  115. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ import{BreakEvent as t,Timebase as e,getBreakEvent as i}from"../types/BreakManifest";import{breakPlanEmptyReason as s}from"../services/AdBreakSequencer";export function buildScheduledBreaks(r,n={}){if(!r)return[];const o=[];for(const a of r.breaks){const d=i(a);if(null!==d&&d!==t.START&&d!==t.END)continue;const p=n.canPlay??(t=>null===s(t,"overlay"));if(n.excluded?.has(a.id)||!p(a))continue;const l=d===t.START?"pre":d===t.END?"post":"mid";let u="pre"===l?0:null,c=null;if("mid"===l)if(r.timebase===e.WALLCLOCK&&"string"==typeof a.start){const t=new Date(a.start);Number.isFinite(t.getTime())&&(c=t.toISOString())}else"number"==typeof a.start&&(u=r.timebase===e.MEDIATIME?a.start:n.mapPts?.(a.start)??null);o.push({id:a.id,position:l,startSec:u,startDate:c,durationSec:a.duration,played:n.played?.has(a.id)??!1})}const a={pre:0,mid:1,post:2},d=t=>t.startSec??(Date.parse(t.startDate??"")||0);return o.sort((t,e)=>a[t.position]-a[e.position]||("mid"===t.position?d(t)-d(e):0)||(t.id<e.id?-1:t.id>e.id?1:0))}
@@ -1,9 +1,9 @@
1
1
  import type { PlayerAdapter } from '../interfaces/PlayerAdapter';
2
- import { type Break } from '../types/BreakManifest';
2
+ import { type Break, type BreakFormat } from '../types/BreakManifest';
3
3
  import type { SessionState } from './SessionState';
4
4
  import type { BreakScheduler } from '../services/BreakScheduler';
5
5
  /** VOD snapback is unavailable on TV browsers, including React Native web TV shells. */
6
- export declare function configureVodSnapback(scheduler: BreakScheduler, player: PlayerAdapter, canPlay: (brk: Break) => boolean): void;
6
+ export declare function configureVodSnapback(scheduler: BreakScheduler, player: PlayerAdapter, canPlay: (brk: Break) => boolean, selectFormat?: (brk: Break) => BreakFormat | undefined): void;
7
7
  export interface SnapbackDeps {
8
8
  player: PlayerAdapter;
9
9
  state: Pick<SessionState, 'snapbackSeekInFlight'>;
@@ -1 +1 @@
1
- import{DeviceType as e}from"../types/BreakManifest";import{detectDeviceProfile as t}from"../services/detectDeviceType";export function configureVodSnapback(a,n,r){a.setSnapbackOnSeek(t().deviceType!==e.TV,r),a.setOnSnapback(e=>n.seek(e.target))}export function createSnapbackHandler(e){return()=>{if(e.state.snapbackSeekInFlight)return void(e.state.snapbackSeekInFlight=!1);e.onViewerSeek(),e.onSeeked?.();const t=e.activeBreak();if(!t?.controls?.snapback)return;const a="number"==typeof t.start?t.start:e.player.currentTime;Math.abs(e.player.currentTime-a)<=.5||(e.log("Snapback: seek detected during locked break, snapping back to break start"),e.state.snapbackSeekInFlight=!0,e.player.seek(a))}}
1
+ import{DeviceType as e}from"../types/BreakManifest";import{detectDeviceProfile as t}from"../services/detectDeviceType";export function configureVodSnapback(a,n,r,c){a.setSnapbackOnSeek(t().deviceType!==e.TV,r,c),a.setOnSnapback(e=>n.seek(e.target))}export function createSnapbackHandler(e){return()=>{if(e.state.snapbackSeekInFlight)return void(e.state.snapbackSeekInFlight=!1);e.onViewerSeek(),e.onSeeked?.();const t=e.activeBreak();if(!t?.controls?.snapback)return;const a="number"==typeof t.start?t.start:e.player.currentTime;Math.abs(e.player.currentTime-a)<=.5||(e.log("Snapback: seek detected during locked break, snapping back to break start"),e.state.snapbackSeekInFlight=!0,e.player.seek(a))}}
@@ -0,0 +1,6 @@
1
+ import type { AdPlayerController } from '../services/AdPlayerController';
2
+ import type { MetadataCueTracker } from '../services/MetadataCueTracker';
3
+ import type { OptiViewAdsEventMap, OptiViewAdsEventType } from '../types/Events';
4
+ import { ScheduledBreaksTracker } from './ScheduledBreaksTracker';
5
+ export declare function createScheduledBreaksTracker(controller: () => AdPlayerController | undefined, cues: () => MetadataCueTracker | null, emit: (event: 'scheduledbreakschange', data: OptiViewAdsEventMap['scheduledbreakschange']) => void): ScheduledBreaksTracker;
6
+ export declare function noteScheduledBreakEvent(tracker: ScheduledBreaksTracker, event: OptiViewAdsEventMap[OptiViewAdsEventType]): void;
@@ -0,0 +1 @@
1
+ import{ScheduledBreaksTracker as e}from"./ScheduledBreaksTracker";export function createScheduledBreaksTracker(a,r,d){return new e(e=>d("scheduledbreakschange",{type:"scheduledbreakschange",timestamp:Date.now(),breaks:e}),{canPlay:e=>null===a()?.breakNothingToPlayReason(e),mapPts:e=>r()?.mediaTimeForPts(e)??null})}export function noteScheduledBreakEvent(e,a){"adbreakbegin"===a.type&&e.markPlayed(a.break.id),"adbreakskipped"===a.type&&"overlap"===a.reason&&e.exclude(a.break.id)}
@@ -1,4 +1,4 @@
1
- /** Break Manifest types, per https://github.com/Dolby-OptiView/optiview-ads-manifest-spec/blob/v1.9.0/spec.md. */
1
+ /** Break Manifest types, per https://github.com/Dolby-OptiView/optiview-ads-manifest-spec/blob/v1.12.0/spec.md. */
2
2
  /** Which 'time' reference break start times use. @category Break Manifests & Ad Formats */
3
3
  export declare enum Timebase {
4
4
  /** An absolute ISO-8601 timestamp */
@@ -111,9 +111,26 @@ export interface BreakManifest {
111
111
  vendorConfiguration?: VendorConfiguration[];
112
112
  /** Event-specific configuration windows on a wallclock live stream. */
113
113
  events?: ChannelEvent[];
114
+ /** Media shown during the part of a break no ad covers (spec 1.12.0); absent when the channel has no slate. */
115
+ slate?: Slate;
114
116
  /** The available breaks */
115
117
  breaks: Break[];
116
118
  }
119
+ /**
120
+ * Media that replaces the ad during the part of a break no ad covers, until the break ends
121
+ * (manifest spec 1.12.0). Video loops from its start; an image stays visible.
122
+ * @category Break Manifests & Ad Formats
123
+ */
124
+ export interface Slate {
125
+ /**
126
+ * Seconds (>= 0) of the break that must remain for the slate to start; `0` starts it for any
127
+ * remaining time.
128
+ * @default 5
129
+ */
130
+ minDuration?: number;
131
+ /** Static assets without `duration`; the SDK plays the first, also when it cannot play it. */
132
+ assets: StaticAsset[];
133
+ }
117
134
  /**
118
135
  * An event window on a wallclock live stream and the session configuration in effect while it
119
136
  * runs. Crossing its start or end emits `adchannelchange` with reason `event-boundary`.
@@ -297,15 +314,36 @@ export interface DoubleBreakVariant extends BaseBreakVariant {
297
314
  /** Paired ad + companion assets. */
298
315
  assets: AssetWithCompanion[];
299
316
  }
317
+ /**
318
+ * The corner of the picture area the L-shape video box is anchored to (manifest spec 1.11.0).
319
+ * The box is 65% of the picture, inset 5% from the two edges of its corner.
320
+ * @category Break Manifests & Ad Formats
321
+ */
322
+ export declare enum LshapeAnchor {
323
+ TOP_LEFT = "top_left",
324
+ TOP_RIGHT = "top_right",
325
+ BOTTOM_LEFT = "bottom_left",
326
+ BOTTOM_RIGHT = "bottom_right"
327
+ }
300
328
  /** L-shape (ad) variant — content shrinks to pip, ad fills main area, companion fills the backdrop. Content pauses. @category Break Manifests & Ad Formats */
301
329
  export interface LshapeAdBreakVariant extends BaseBreakVariant {
302
330
  format: BreakFormat.LSHAPE_AD;
331
+ /**
332
+ * The corner the video box is anchored to. An unrecognised value renders `top_left`.
333
+ * @default LshapeAnchor.TOP_LEFT
334
+ */
335
+ anchor?: LshapeAnchor;
303
336
  /** Paired ad + companion assets. */
304
337
  assets: AssetWithCompanion[];
305
338
  }
306
339
  /** L-shape (content) variant — content shrinks to pip and keeps playing, ad fills the main area. @category Break Manifests & Ad Formats */
307
340
  export interface LshapeContentBreakVariant extends BaseBreakVariant {
308
341
  format: BreakFormat.LSHAPE_CONTENT;
342
+ /**
343
+ * The corner the video box is anchored to. An unrecognised value renders `top_left`.
344
+ * @default LshapeAnchor.TOP_LEFT
345
+ */
346
+ anchor?: LshapeAnchor;
309
347
  /** Ad assets (no companion). */
310
348
  assets: Asset[];
311
349
  }
@@ -1 +1 @@
1
- export var Timebase;!function(e){e.WALLCLOCK="wallclock",e.PTS="pts",e.MEDIATIME="mediatime"}(Timebase||(Timebase={}));export function isGamVendorConfiguration(e){return"gam"===e.type}export var DeliveryMode;!function(e){e.SGAI="sgai",e.SSAI="ssai"}(DeliveryMode||(DeliveryMode={}));export var BreakEvent;!function(e){e.START="start",e.PAUSE="pause",e.END="end"}(BreakEvent||(BreakEvent={}));export var BreakFormat;!function(e){e.SINGLE="single",e.DOUBLE="double",e.LSHAPE_AD="lshape_ad",e.LSHAPE_CONTENT="lshape_content",e.OVERLAY="overlay"}(BreakFormat||(BreakFormat={}));export var DeviceType;!function(e){e.CONSOLE="console",e.DESKTOP="desktop",e.MOBILE="mobile",e.TABLET="tablet",e.TV="tv"}(DeviceType||(DeviceType={}));export var Platform;!function(e){e.WEB="web",e.ANDROID="android",e.IOS="ios",e.TVOS="tvos",e.ROKU="roku"}(Platform||(Platform={}));export var Os;!function(e){e.ANDROID="android",e.CHROMEOS="chromeos",e.IOS="ios",e.IPADOS="ipados",e.LINUX="linux",e.MACOS="macos",e.ROKUOS="rokuos",e.TIZEN="tizen",e.TVOS="tvos",e.VIZIO="vizio",e.WEBOS="webos",e.WINDOWS="windows",e.XBOX="xbox"}(Os||(Os={}));export var AssetType;!function(e){e.STATIC="static",e.VAST="vast",e.VENDOR="vendor"}(AssetType||(AssetType={}));export var MediaType;!function(e){e.VIDEO="video",e.IMAGE="image"}(MediaType||(MediaType={}));export var Vendor;!function(e){e.GAM="gam"}(Vendor||(Vendor={}));export function isEventTrigger(e){return"object"==typeof e&&null!==e&&"event"===e.type}export function getBreakEvent(e){return"pre"===e.position?BreakEvent.START:isEventTrigger(e.start)?e.start.event:null}export function isPauseBreak(e){return getBreakEvent(e)===BreakEvent.PAUSE}export function getPreRollDelay(e){return getBreakEvent(e)!==BreakEvent.START?null:"pre"===e.position?e.delay??0:isEventTrigger(e.start)?e.start.delay??0:0}export function isPostRollBreak(e){return getBreakEvent(e)===BreakEvent.END}export function getPostRollDelay(e){return isEventTrigger(e.start)&&e.start.event===BreakEvent.END?e.start.delay??0:null}export function isStaticAsset(e){return e.type===AssetType.STATIC}export function isVastAsset(e){return e.type===AssetType.VAST}export function isVendorAsset(e){return e.type===AssetType.VENDOR}
1
+ export var Timebase;!function(e){e.WALLCLOCK="wallclock",e.PTS="pts",e.MEDIATIME="mediatime"}(Timebase||(Timebase={}));export function isGamVendorConfiguration(e){return"gam"===e.type}export var DeliveryMode;!function(e){e.SGAI="sgai",e.SSAI="ssai"}(DeliveryMode||(DeliveryMode={}));export var BreakEvent;!function(e){e.START="start",e.PAUSE="pause",e.END="end"}(BreakEvent||(BreakEvent={}));export var BreakFormat;!function(e){e.SINGLE="single",e.DOUBLE="double",e.LSHAPE_AD="lshape_ad",e.LSHAPE_CONTENT="lshape_content",e.OVERLAY="overlay"}(BreakFormat||(BreakFormat={}));export var DeviceType;!function(e){e.CONSOLE="console",e.DESKTOP="desktop",e.MOBILE="mobile",e.TABLET="tablet",e.TV="tv"}(DeviceType||(DeviceType={}));export var Platform;!function(e){e.WEB="web",e.ANDROID="android",e.IOS="ios",e.TVOS="tvos",e.ROKU="roku"}(Platform||(Platform={}));export var Os;!function(e){e.ANDROID="android",e.CHROMEOS="chromeos",e.IOS="ios",e.IPADOS="ipados",e.LINUX="linux",e.MACOS="macos",e.ROKUOS="rokuos",e.TIZEN="tizen",e.TVOS="tvos",e.VIZIO="vizio",e.WEBOS="webos",e.WINDOWS="windows",e.XBOX="xbox"}(Os||(Os={}));export var LshapeAnchor;!function(e){e.TOP_LEFT="top_left",e.TOP_RIGHT="top_right",e.BOTTOM_LEFT="bottom_left",e.BOTTOM_RIGHT="bottom_right"}(LshapeAnchor||(LshapeAnchor={}));export var AssetType;!function(e){e.STATIC="static",e.VAST="vast",e.VENDOR="vendor"}(AssetType||(AssetType={}));export var MediaType;!function(e){e.VIDEO="video",e.IMAGE="image"}(MediaType||(MediaType={}));export var Vendor;!function(e){e.GAM="gam"}(Vendor||(Vendor={}));export function isEventTrigger(e){return"object"==typeof e&&null!==e&&"event"===e.type}export function getBreakEvent(e){return"pre"===e.position?BreakEvent.START:isEventTrigger(e.start)?e.start.event:null}export function isPauseBreak(e){return getBreakEvent(e)===BreakEvent.PAUSE}export function getPreRollDelay(e){return getBreakEvent(e)!==BreakEvent.START?null:"pre"===e.position?e.delay??0:isEventTrigger(e.start)?e.start.delay??0:0}export function isPostRollBreak(e){return getBreakEvent(e)===BreakEvent.END}export function getPostRollDelay(e){return isEventTrigger(e.start)&&e.start.event===BreakEvent.END?e.start.delay??0:null}export function isStaticAsset(e){return e.type===AssetType.STATIC}export function isVastAsset(e){return e.type===AssetType.VAST}export function isVendorAsset(e){return e.type===AssetType.VENDOR}
@@ -1,10 +1,18 @@
1
1
  import { Break, Asset, BreakFormat } from './BreakManifest';
2
2
  import type { SessionDeliveryMode } from './OptiViewAdsConfig';
3
+ import type { ScheduledBreak } from './ScheduledBreak';
4
+ /** Viewer-specific schedule changed by value. @category Events */
5
+ export interface ScheduledBreaksChangeEvent extends OptiViewAdsEvent {
6
+ type: 'scheduledbreakschange';
7
+ /** Independent snapshot of the current session schedule. */
8
+ breaks: ScheduledBreak[];
9
+ }
3
10
  /**
4
11
  * Lifecycle phase reported by {@link AdBreakStatus}.
5
12
  * - `idle`: no break is upcoming or active.
6
13
  * - `upcoming`: a break is scheduled in the future (including pre-break warnings).
7
14
  * - `active`: a break is currently playing.
15
+ * - `complete`: an active break ended, including cuts/errors; emitted once before `idle` and `adbreakend`.
8
16
  * @category Events */
9
17
  export type AdBreakPhase = 'idle' | 'upcoming' | 'active' | 'complete';
10
18
  /** Why a scheduled ad break was refused before it began (`adbreakskipped` event). @category Events */
@@ -17,7 +25,7 @@ export interface AdBreakSkippedEvent extends OptiViewAdsEvent {
17
25
  }
18
26
  /** Playback-gated snapshot of an ad break for UI countdowns (`adbreakstatus` event, `sdk.getAdBreakStatus()`). @category Events */
19
27
  export interface AdBreakStatus {
20
- /** Current lifecycle phase of the ad break. */
28
+ /** Current lifecycle phase. `complete` is transient; polling after cleanup returns `idle`. */
21
29
  phase: AdBreakPhase;
22
30
  /** The break this status describes; `null` when `phase` is `idle`. */
23
31
  break: Break | null;
@@ -25,13 +33,13 @@ export interface AdBreakStatus {
25
33
  format?: BreakFormat | undefined;
26
34
  /** Seconds until the break starts; for a pre-break warning, the countdown value when it fired. */
27
35
  secondsUntilBreak?: number | undefined;
28
- /** Estimated seconds left in the active break; `undefined` when not yet derivable (e.g. a backdrop break with no per-ad `timeupdate`). */
36
+ /** Estimated seconds left in the active break; zero on `complete`, not a measure of ads watched. `undefined` when not yet derivable (e.g. a backdrop break with no per-ad `timeupdate`). */
29
37
  breakRemainingSec?: number | undefined;
30
38
  /** 0-based index of the ad currently playing within the break. */
31
39
  adIndex?: number | undefined;
32
40
  /** Total number of ads in the break, when known. */
33
41
  totalAds?: number | undefined;
34
- /** Number of ads remaining including the currently playing one; after an ad ends, the ads still to come. */
42
+ /** Number of ads remaining including the currently playing one; after an ad ends, the ads still to come. Zero on `complete`, including cuts/errors. */
35
43
  adsRemaining?: number | undefined;
36
44
  /** Whether the countdown is advancing (ad rendered, playback progressing). `false` while buffering or before a held pre-roll's first frame. */
37
45
  ticking: boolean;
@@ -47,7 +55,7 @@ export interface AdBreakStatus {
47
55
  deliveryMode?: SessionDeliveryMode | undefined;
48
56
  }
49
57
  /** Event types emitted by the OptiViewAds SDK. @category Events */
50
- export type OptiViewAdsEventType = 'adbreakbegin' | 'adbreakend' | 'adbreakskipped' | 'adbegin' | 'adend' | 'aderror' | 'adfirstquartile' | 'admidpoint' | 'adthirdquartile' | 'adtimeupdate' | 'adbreakstatus' | 'adclick' | 'waiting' | 'playing' | 'volumechange' | 'adchannelchange' | 'externalvendorconfigurationchange';
58
+ export type OptiViewAdsEventType = 'scheduledbreakschange' | 'adbreakbegin' | 'adbreakend' | 'adbreakskipped' | 'adbegin' | 'adend' | 'aderror' | 'adfirstquartile' | 'admidpoint' | 'adthirdquartile' | 'adtimeupdate' | 'adbreakstatus' | 'adclick' | 'waiting' | 'playing' | 'volumechange' | 'adchannelchange' | 'externalvendorconfigurationchange';
51
59
  /** Which player a playback event originated from. @category Events */
52
60
  export type PlaybackSource = 'ad' | 'content';
53
61
  /** Base event interface. @category Events */
@@ -249,6 +257,7 @@ export interface ExternalVendorConfigurationChangeEvent extends OptiViewAdsEvent
249
257
  }
250
258
  /** Union type of all SDK events. @category Events */
251
259
  export type OptiViewAdsEventMap = {
260
+ scheduledbreakschange: ScheduledBreaksChangeEvent;
252
261
  adbreakbegin: AdBreakBeginEvent;
253
262
  adbreakend: AdBreakEndEvent;
254
263
  adbreakskipped: AdBreakSkippedEvent;
@@ -357,6 +357,13 @@ export interface OptiViewAdsConfig {
357
357
  * @default false
358
358
  */
359
359
  continueContentDuringBreak?: boolean;
360
+ /**
361
+ * Let `startSession()` run without `manifestUrl` by using the ads manifest URL the content
362
+ * player discovers (THEOplayer with a THEOlive source on web and Android). Off by default:
363
+ * `startSession()` then requires `manifestUrl`, and adapters do not observe discovery.
364
+ * @default false
365
+ */
366
+ manifestUrlDiscovery?: boolean;
360
367
  /**
361
368
  * AirPlay (external playback) guard, active only when the manifest carries a server-side
362
369
  * beaconing (`ssb`) stream and the content adapter can gate external playback.
@@ -408,8 +415,14 @@ export interface SsaiConfig {
408
415
  }
409
416
  /** Per-session configuration passed to startSession(); changes per piece of content. @category SDK & Sessions */
410
417
  export interface SessionConfig {
411
- /** Full break-manifest URL. The SDK fetches exactly this URL and never rewrites it (proxied, signed or opaque endpoints all work). */
412
- manifestUrl: string;
418
+ /**
419
+ * Full break-manifest URL. The SDK fetches exactly this URL and never rewrites it (proxied,
420
+ * signed or opaque endpoints all work). When omitted, the SDK uses the ads manifest URL the
421
+ * content player discovered (see `PlayerAdapter.discoveredAdsManifestUrl`); the session then
422
+ * also auto-restarts when the player reports a different discovered URL, and ends when the
423
+ * player reports there is none.
424
+ */
425
+ manifestUrl?: string;
413
426
  /**
414
427
  * Ad insertion type for this content — how breaks relate to the content
415
428
  * timeline (DAR vs DAI). `replacement` replaces a content window; `insertion`
@@ -0,0 +1,17 @@
1
+ /** Placement of a scheduled break on the content timeline. @category Playback & UI */
2
+ export type ScheduledBreakPosition = 'pre' | 'mid' | 'post';
3
+ /** Viewer-specific opportunity for scrubber markers. @category Playback & UI */
4
+ export interface ScheduledBreak {
5
+ /** Manifest break identifier. */
6
+ id: string;
7
+ /** Placement relative to content playback. */
8
+ position: ScheduledBreakPosition;
9
+ /** Content seconds; zero for pre-roll, null for post-roll, live or unresolved PTS. */
10
+ startSec: number | null;
11
+ /** ISO 8601 start for wallclock timeline breaks; otherwise null. */
12
+ startDate: string | null;
13
+ /** Manifest break duration in seconds, not the remaining playback duration. */
14
+ durationSec: number;
15
+ /** True once this session emitted adbreakbegin for this identifier. */
16
+ played: boolean;
17
+ }
@@ -0,0 +1 @@
1
+ export{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dolby-optiview/ads-sdk-core",
3
- "version": "1.5.1",
3
+ "version": "1.6.0",
4
4
  "description": "OptiView Ads SDK Core - Player-agnostic ad insertion",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",