Source: lib/ads/ad_manager.js

  1. /*! @license
  2. * Shaka Player
  3. * Copyright 2016 Google LLC
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. goog.provide('shaka.ads.AdManager');
  7. goog.require('goog.asserts');
  8. goog.require('shaka.Deprecate');
  9. goog.require('shaka.Player');
  10. goog.require('shaka.ads.AdsStats');
  11. goog.require('shaka.ads.ClientSideAdManager');
  12. goog.require('shaka.ads.MediaTailorAdManager');
  13. goog.require('shaka.ads.ServerSideAdManager');
  14. goog.require('shaka.log');
  15. goog.require('shaka.util.Error');
  16. goog.require('shaka.util.FakeEvent');
  17. goog.require('shaka.util.FakeEventTarget');
  18. goog.require('shaka.util.IReleasable');
  19. /**
  20. * @event shaka.ads.AdManager.AdsLoadedEvent
  21. * @description Fired when a sequence of ads has been loaded.
  22. * @property {string} type
  23. * 'ads-loaded'
  24. * @property {number} loadTime
  25. * The time it takes to load ads.
  26. * @exportDoc
  27. */
  28. /**
  29. * @event shaka.ads.AdManager.AdStartedEvent
  30. * @description Fired when an ad has started playing.
  31. * @property {string} type
  32. * 'ad-started'
  33. * @property {!shaka.extern.IAd} ad
  34. * The ad that has started playing.
  35. * @property {Object} sdkAdObject
  36. * The ad object in the SDK format, if there is one.
  37. * @property {Object} originalEvent
  38. * The native SDK event, if available.
  39. * @exportDoc
  40. */
  41. /**
  42. * @event shaka.ads.AdManager.AdCompleteEvent
  43. * @description Fired when an ad has played through.
  44. * @property {string} type
  45. * 'ad-complete'
  46. * @property {Object} originalEvent
  47. * The native SDK event, if available.
  48. * @exportDoc
  49. */
  50. /**
  51. * @event shaka.ads.AdManager.AdSkippedEvent
  52. * @description Fired when an ad has been skipped.
  53. * @property {string} type
  54. * 'ad-skipped'
  55. * @property {Object} originalEvent
  56. * The native SDK event, if available.
  57. * @exportDoc
  58. */
  59. /**
  60. * @event shaka.ads.AdManager.AdFirstQuartileEvent
  61. * @description Fired when an ad has played through the first 1/4.
  62. * @property {string} type
  63. * 'ad-first-quartile'
  64. * @property {Object} originalEvent
  65. * The native SDK event, if available.
  66. * @exportDoc
  67. */
  68. /**
  69. * @event shaka.ads.AdManager.AdMidpointEvent
  70. * @description Fired when an ad has played through its midpoint.
  71. * @property {string} type
  72. * 'ad-midpoint'
  73. * @property {Object} originalEvent
  74. * The native SDK event, if available.
  75. * @exportDoc
  76. */
  77. /**
  78. * @event shaka.ads.AdManager.AdThirdQuartileEvent
  79. * @description Fired when an ad has played through the third quartile.
  80. * @property {string} type
  81. * 'ad-third-quartile'
  82. * @property {Object} originalEvent
  83. * The native SDK event, if available.
  84. * @exportDoc
  85. */
  86. /**
  87. * @event shaka.ads.AdManager.AdStoppedEvent
  88. * @description Fired when an ad has stopped playing, was skipped,
  89. * or was unable to proceed due to an error.
  90. * @property {string} type
  91. * 'ad-stopped'
  92. * @property {Object} originalEvent
  93. * The native SDK event, if available.
  94. * @exportDoc
  95. */
  96. /**
  97. * @event shaka.ads.AdManager.AdVolumeChangedEvent
  98. * @description Fired when an ad's volume changed.
  99. * @property {string} type
  100. * 'ad-volume-changed'
  101. * @property {Object} originalEvent
  102. * The native SDK event, if available.
  103. * @exportDoc
  104. */
  105. /**
  106. * @event shaka.ads.AdManager.AdMutedEvent
  107. * @description Fired when an ad was muted.
  108. * @property {string} type
  109. * 'ad-muted'
  110. * @property {Object} originalEvent
  111. * The native SDK event, if available.
  112. * @exportDoc
  113. */
  114. /**
  115. * @event shaka.ads.AdManager.AdPausedEvent
  116. * @description Fired when an ad was paused.
  117. * @property {string} type
  118. * 'ad-paused'
  119. * @property {Object} originalEvent
  120. * The native SDK event, if available.
  121. * @exportDoc
  122. */
  123. /**
  124. * @event shaka.ads.AdManager.AdResumedEvent
  125. * @description Fired when an ad was resumed after a pause.
  126. * @property {string} type
  127. * 'ad-resumed'
  128. * @property {Object} originalEvent
  129. * The native SDK event, if available.
  130. * @exportDoc
  131. */
  132. /**
  133. * @event shaka.ads.AdManager.AdSkipStateChangedEvent
  134. * @description Fired when an ad's skip state changes (for example, when
  135. * it becomes possible to skip the ad).
  136. * @property {string} type
  137. * 'ad-skip-state-changed'
  138. * @property {Object} originalEvent
  139. * The native SDK event, if available.
  140. * @exportDoc
  141. */
  142. /**
  143. * @event shaka.ads.AdManager.AdResumedEvent
  144. * @description Fired when the ad cue points change, signalling ad breaks
  145. * change.
  146. * @property {string} type
  147. * 'ad-cue-points-changed'
  148. * @property {Object} originalEvent
  149. * The native SDK event, if available.
  150. * @exportDoc
  151. */
  152. /**
  153. * @event shaka.ads.AdManager.AdProgressEvent
  154. * @description Fired when there is an update to the current ad's progress.
  155. * @property {string} type
  156. * 'ad-progress'
  157. * @property {Object} originalEvent
  158. * The native SDK event, if available.
  159. * @exportDoc
  160. */
  161. /**
  162. * @event shaka.ads.AdManager.AdBufferingEvent
  163. * @description Fired when the ad has stalled playback to buffer.
  164. * @property {string} type
  165. * 'ad-buffering'
  166. * @property {Object} originalEvent
  167. * The native SDK event, if available.
  168. * @exportDoc
  169. */
  170. /**
  171. * @event shaka.ads.AdManager.AdImpressionEvent
  172. * @description Fired when the impression URL has been pinged.
  173. * @property {string} type
  174. * 'ad-impression'
  175. * @property {Object} originalEvent
  176. * The native SDK event, if available.
  177. * @exportDoc
  178. */
  179. /**
  180. * @event shaka.ads.AdManager.AdClickEvent
  181. * @description Fired when the ad was clicked.
  182. * @property {string} type
  183. * 'ad-clicked'
  184. * @property {Object} originalEvent
  185. * The native SDK event, if available.
  186. * @exportDoc
  187. */
  188. /**
  189. * @event shaka.ads.AdManager.AdDurationChangedEvent
  190. * @description Fired when the ad's duration changes.
  191. * @property {string} type
  192. * 'ad-duration-changed'
  193. * @property {Object} originalEvent
  194. * The native SDK event, if available.
  195. * @exportDoc
  196. */
  197. /**
  198. * @event shaka.ads.AdManager.AdClosedEvent
  199. * @description Fired when the ad was closed by the user.
  200. * @property {string} type
  201. * 'ad-closed'
  202. * @property {Object} originalEvent
  203. * The native SDK event, if available.
  204. * @exportDoc
  205. */
  206. /**
  207. * @event shaka.ads.AdManager.AdLoadedEvent
  208. * @description Fired when the ad data becomes available.
  209. * @property {string} type
  210. * 'ad-loaded'
  211. * @property {Object} originalEvent
  212. * The native SDK event, if available.
  213. * @exportDoc
  214. */
  215. /**
  216. * @event shaka.ads.AdManager.AllAdsCompletedEvent
  217. * @description Fired when the ads manager is done playing all the ads.
  218. * @property {string} type
  219. * 'all-ads-completed'
  220. * @property {Object} originalEvent
  221. * The native SDK event, if available.
  222. * @exportDoc
  223. */
  224. /**
  225. * @event shaka.ads.AdManager.AdLinearChangedEvent
  226. * @description Fired when the displayed ad changes from
  227. * linear to nonlinear, or vice versa.
  228. * @property {string} type
  229. * 'ad-linear-changed'
  230. * @property {Object} originalEvent
  231. * The native SDK event, if available.
  232. * @exportDoc
  233. */
  234. /**
  235. * @event shaka.ads.AdManager.AdMetadataEvent
  236. * @description Fired when the ad's metadata becomes available.
  237. * @property {string} type
  238. * 'ad-metadata'
  239. * @property {Object} originalEvent
  240. * The native SDK event, if available.
  241. * @exportDoc
  242. */
  243. /**
  244. * @event shaka.ads.AdManager#AdBreakReadyEvent
  245. * @description Fired when the client-side SDK is ready to play a
  246. * VPAID ad or an ad rule.
  247. * @property {string} type
  248. * 'ad-break-ready'
  249. * @property {Object} originalEvent
  250. * The native SDK event, if available.
  251. * @exportDoc
  252. */
  253. /**
  254. * @event shaka.ads.AdManager.AdRecoverableErrorEvent
  255. * @description Fired when the a non-fatal error was encountered.
  256. * The presentation will continue with the same or next ad playback
  257. * depending on the error situation.
  258. * @property {string} type
  259. * 'ad-recoverable-error'
  260. * @property {Object} originalEvent
  261. * The native SDK event, if available.
  262. * @exportDoc
  263. */
  264. /**
  265. * @event shaka.ads.AdManager.AD_ERROR
  266. * @description Fired when a fatal error is encountered.
  267. * @property {string} type
  268. * 'ad-error'
  269. * @property {Object} originalEvent
  270. * The native SDK event, if available.
  271. * @exportDoc
  272. */
  273. /**
  274. * @event shaka.ads.AdManager.AdInteractionEvent
  275. * @description Fired when an ad triggers the interaction callback.
  276. * @property {string} type
  277. * 'ad-interaction'
  278. * @property {Object} originalEvent
  279. * The native SDK event, if available.
  280. * @exportDoc
  281. */
  282. /**
  283. * @event shaka.ads.AdManager#ImaAdManagerLoadedEvent
  284. * @description Fired when the native IMA ad manager becomes available.
  285. * @property {string} type
  286. * 'ima-ad-manager-loaded'
  287. * @property {!Object} imaAdManager
  288. * The native IMA ad manager.
  289. * @exportDoc
  290. */
  291. /**
  292. * @event shaka.ads.AdManager#ImaStreamManagerLoadedEvent
  293. * @description Fired when the native IMA stream manager becomes available.
  294. * @property {string} type
  295. * 'ima-stream-manager-loaded'
  296. * @property {!Object} imaStreamManager
  297. * The native IMA stream manager.
  298. * @exportDoc
  299. */
  300. /**
  301. * @event shaka.ads.AdManager.AdClickedEvent
  302. * @description Fired when the ad was clicked.
  303. * @property {string} type
  304. * 'ad-clicked'
  305. * @exportDoc
  306. */
  307. /**
  308. * A class responsible for ad-related interactions.
  309. * @implements {shaka.extern.IAdManager}
  310. * @implements {shaka.util.IReleasable}
  311. * @export
  312. */
  313. shaka.ads.AdManager = class extends shaka.util.FakeEventTarget {
  314. /** */
  315. constructor() {
  316. super();
  317. /** @private {shaka.ads.ClientSideAdManager} */
  318. this.csAdManager_ = null;
  319. /** @private {shaka.ads.MediaTailorAdManager} */
  320. this.mtAdManager_ = null;
  321. /** @private {shaka.ads.ServerSideAdManager} */
  322. this.ssAdManager_ = null;
  323. /** @private {shaka.ads.AdsStats} */
  324. this.stats_ = new shaka.ads.AdsStats();
  325. /** @private {string} locale */
  326. this.locale_ = navigator.language;
  327. /** @private {?shaka.extern.AdsConfiguration} */
  328. this.config_ = null;
  329. }
  330. /**
  331. * @override
  332. * @export
  333. */
  334. setLocale(locale) {
  335. this.locale_ = locale;
  336. }
  337. /**
  338. * @override
  339. * @export
  340. */
  341. configure(config) {
  342. this.config_ = config;
  343. if (this.csAdManager_) {
  344. this.csAdManager_.configure(this.config_);
  345. }
  346. if (this.ssAdManager_) {
  347. this.ssAdManager_.configure(this.config_);
  348. }
  349. }
  350. /**
  351. * @override
  352. * @export
  353. */
  354. initClientSide(adContainer, video, adsRenderingSettings) {
  355. // Check that Client Side IMA SDK has been included
  356. // NOTE: (window['google'] && google.ima) check for any
  357. // IMA SDK, including SDK for Server Side ads.
  358. // The 3rd check insures we have the right SDK:
  359. // {google.ima.AdsLoader} is an object that's part of CS IMA SDK
  360. // but not SS SDK.
  361. if (!window['google'] || !google.ima || !google.ima.AdsLoader) {
  362. throw new shaka.util.Error(
  363. shaka.util.Error.Severity.CRITICAL,
  364. shaka.util.Error.Category.ADS,
  365. shaka.util.Error.Code.CS_IMA_SDK_MISSING);
  366. }
  367. if (this.csAdManager_) {
  368. this.csAdManager_.release();
  369. }
  370. this.csAdManager_ = new shaka.ads.ClientSideAdManager(
  371. adContainer, video, this.locale_, adsRenderingSettings,
  372. (e) => this.processAndDispatchEvent_(e));
  373. goog.asserts.assert(this.config_, 'Config must not be null!');
  374. this.csAdManager_.configure(this.config_);
  375. }
  376. /**
  377. * @override
  378. * @export
  379. */
  380. release() {
  381. if (this.csAdManager_) {
  382. this.csAdManager_.release();
  383. this.csAdManager_ = null;
  384. }
  385. if (this.mtAdManager_) {
  386. this.mtAdManager_.release();
  387. this.mtAdManager_ = null;
  388. }
  389. if (this.ssAdManager_) {
  390. this.ssAdManager_.release();
  391. this.ssAdManager_ = null;
  392. }
  393. super.release();
  394. }
  395. /**
  396. * @override
  397. * @export
  398. */
  399. onAssetUnload() {
  400. if (this.csAdManager_) {
  401. this.csAdManager_.stop();
  402. }
  403. if (this.mtAdManager_) {
  404. this.mtAdManager_.stop();
  405. }
  406. if (this.ssAdManager_) {
  407. this.ssAdManager_.stop();
  408. }
  409. this.dispatchEvent(
  410. new shaka.util.FakeEvent(shaka.ads.AdManager.AD_STOPPED));
  411. this.stats_ = new shaka.ads.AdsStats();
  412. }
  413. /**
  414. * @override
  415. * @export
  416. */
  417. requestClientSideAds(imaRequest) {
  418. if (!this.csAdManager_) {
  419. throw new shaka.util.Error(
  420. shaka.util.Error.Severity.RECOVERABLE,
  421. shaka.util.Error.Category.ADS,
  422. shaka.util.Error.Code.CS_AD_MANAGER_NOT_INITIALIZED);
  423. }
  424. this.csAdManager_.requestAds(imaRequest);
  425. }
  426. /**
  427. * @override
  428. * @export
  429. */
  430. updateClientSideAdsRenderingSettings(adsRenderingSettings) {
  431. if (!this.csAdManager_) {
  432. throw new shaka.util.Error(
  433. shaka.util.Error.Severity.RECOVERABLE,
  434. shaka.util.Error.Category.ADS,
  435. shaka.util.Error.Code.CS_AD_MANAGER_NOT_INITIALIZED);
  436. }
  437. this.csAdManager_.updateAdsRenderingSettings(adsRenderingSettings);
  438. }
  439. /**
  440. * @override
  441. * @export
  442. */
  443. initMediaTailor(adContainer, networkingEngine, video) {
  444. if (this.mtAdManager_) {
  445. this.mtAdManager_.release();
  446. }
  447. this.mtAdManager_ = new shaka.ads.MediaTailorAdManager(
  448. adContainer, networkingEngine, video,
  449. (e) => this.processAndDispatchEvent_(e));
  450. }
  451. /**
  452. * @param {string} url
  453. * @param {Object} adsParams
  454. * @param {string=} backupUrl
  455. * @return {!Promise.<string>}
  456. * @override
  457. * @export
  458. */
  459. requestMediaTailorStream(url, adsParams, backupUrl = '') {
  460. if (!this.mtAdManager_) {
  461. throw new shaka.util.Error(
  462. shaka.util.Error.Severity.RECOVERABLE,
  463. shaka.util.Error.Category.ADS,
  464. shaka.util.Error.Code.MT_AD_MANAGER_NOT_INITIALIZED);
  465. }
  466. return this.mtAdManager_.streamRequest(url, adsParams, backupUrl);
  467. }
  468. /**
  469. * @param {string} url
  470. * @override
  471. * @export
  472. */
  473. addMediaTailorTrackingUrl(url) {
  474. if (!this.mtAdManager_) {
  475. throw new shaka.util.Error(
  476. shaka.util.Error.Severity.RECOVERABLE,
  477. shaka.util.Error.Category.ADS,
  478. shaka.util.Error.Code.MT_AD_MANAGER_NOT_INITIALIZED);
  479. }
  480. this.mtAdManager_.addTrackingUrl(url);
  481. }
  482. /**
  483. * @override
  484. * @export
  485. */
  486. initServerSide(adContainer, video) {
  487. // Check that Client Side IMA SDK has been included
  488. // NOTE: (window['google'] && google.ima) check for any
  489. // IMA SDK, including SDK for Server Side ads.
  490. // The 3rd check insures we have the right SDK:
  491. // {google.ima.dai} is an object that's part of DAI IMA SDK
  492. // but not SS SDK.
  493. if (!window['google'] || !google.ima || !google.ima.dai) {
  494. throw new shaka.util.Error(
  495. shaka.util.Error.Severity.CRITICAL,
  496. shaka.util.Error.Category.ADS,
  497. shaka.util.Error.Code.SS_IMA_SDK_MISSING);
  498. }
  499. if (this.ssAdManager_) {
  500. this.ssAdManager_.release();
  501. }
  502. this.ssAdManager_ = new shaka.ads.ServerSideAdManager(
  503. adContainer, video, this.locale_,
  504. (e) => this.processAndDispatchEvent_(e));
  505. goog.asserts.assert(this.config_, 'Config must not be null!');
  506. this.ssAdManager_.configure(this.config_);
  507. }
  508. /**
  509. * @param {!google.ima.dai.api.StreamRequest} imaRequest
  510. * @param {string=} backupUrl
  511. * @return {!Promise.<string>}
  512. * @override
  513. * @export
  514. */
  515. requestServerSideStream(imaRequest, backupUrl = '') {
  516. if (!this.ssAdManager_) {
  517. throw new shaka.util.Error(
  518. shaka.util.Error.Severity.RECOVERABLE,
  519. shaka.util.Error.Category.ADS,
  520. shaka.util.Error.Code.SS_AD_MANAGER_NOT_INITIALIZED);
  521. }
  522. if (!imaRequest.adTagParameters) {
  523. imaRequest.adTagParameters = {};
  524. }
  525. const adTagParams = imaRequest.adTagParameters;
  526. if (adTagParams['mpt'] || adTagParams['mpv']) {
  527. shaka.log.alwaysWarn('You have attempted to set "mpt" and/or "mpv" ' +
  528. 'parameters of the ad tag. Please note that those parameters are ' +
  529. 'used for Shaka adoption tracking and will be overriden.');
  530. }
  531. // Set player and version parameters for tracking
  532. imaRequest.adTagParameters['mpt'] = 'shaka-player';
  533. imaRequest.adTagParameters['mpv'] = shaka.Player.version;
  534. return this.ssAdManager_.streamRequest(imaRequest, backupUrl);
  535. }
  536. /**
  537. * @override
  538. * @export
  539. */
  540. replaceServerSideAdTagParameters(adTagParameters) {
  541. if (!this.ssAdManager_) {
  542. throw new shaka.util.Error(
  543. shaka.util.Error.Severity.RECOVERABLE,
  544. shaka.util.Error.Category.ADS,
  545. shaka.util.Error.Code.SS_AD_MANAGER_NOT_INITIALIZED);
  546. }
  547. if (adTagParameters['mpt'] || adTagParameters['mpv']) {
  548. shaka.log.alwaysWarn('You have attempted to set "mpt" and/or "mpv" ' +
  549. 'parameters of the ad tag. Please note that those parameters are ' +
  550. 'used for Shaka adoption tracking and will be overriden.');
  551. }
  552. adTagParameters['mpt'] = 'Shaka Player';
  553. adTagParameters['mpv'] = shaka.Player.version;
  554. this.ssAdManager_.replaceAdTagParameters(adTagParameters);
  555. }
  556. /**
  557. * @return {!Array.<!shaka.extern.AdCuePoint>}
  558. * @override
  559. * @export
  560. */
  561. getServerSideCuePoints() {
  562. shaka.Deprecate.deprecateFeature(5,
  563. 'AdManager.getServerSideCuePoints',
  564. 'Please use getCuePoints function.');
  565. return this.getCuePoints();
  566. }
  567. /**
  568. * @return {!Array.<!shaka.extern.AdCuePoint>}
  569. * @override
  570. * @export
  571. */
  572. getCuePoints() {
  573. let cuepoints = [];
  574. if (this.ssAdManager_) {
  575. cuepoints = cuepoints.concat(this.ssAdManager_.getCuePoints());
  576. }
  577. if (this.mtAdManager_) {
  578. cuepoints = cuepoints.concat(this.mtAdManager_.getCuePoints());
  579. }
  580. return cuepoints;
  581. }
  582. /**
  583. * @return {shaka.extern.AdsStats}
  584. * @override
  585. * @export
  586. */
  587. getStats() {
  588. return this.stats_.getBlob();
  589. }
  590. /**
  591. * @override
  592. * @export
  593. */
  594. onManifestUpdated(isLive) {
  595. if (this.mtAdManager_) {
  596. this.mtAdManager_.onManifestUpdated(isLive);
  597. }
  598. }
  599. /**
  600. * @override
  601. * @export
  602. */
  603. onDashTimedMetadata(region) {
  604. if (this.ssAdManager_ && region.schemeIdUri == 'urn:google:dai:2018') {
  605. const type = region.schemeIdUri;
  606. const data = region.eventNode ?
  607. region.eventNode.attributes['messageData'] : null;
  608. const timestamp = region.startTime;
  609. this.ssAdManager_.onTimedMetadata(type, data, timestamp);
  610. }
  611. }
  612. /**
  613. * @override
  614. * @export
  615. */
  616. onHlsTimedMetadata(metadata, timestamp) {
  617. if (this.ssAdManager_) {
  618. this.ssAdManager_.onTimedMetadata('ID3', metadata['data'], timestamp);
  619. }
  620. }
  621. /**
  622. * @override
  623. * @export
  624. */
  625. onCueMetadataChange(value) {
  626. if (this.ssAdManager_) {
  627. this.ssAdManager_.onCueMetadataChange(value);
  628. }
  629. }
  630. /**
  631. * @param {!shaka.util.FakeEvent} event
  632. * @private
  633. */
  634. processAndDispatchEvent_(event) {
  635. if (event && event.type) {
  636. switch (event.type) {
  637. case shaka.ads.AdManager.ADS_LOADED: {
  638. const loadTime = (/** @type {!Object} */ (event))['loadTime'];
  639. this.stats_.addLoadTime(loadTime);
  640. break;
  641. }
  642. case shaka.ads.AdManager.AD_STARTED:
  643. this.stats_.incrementStarted();
  644. break;
  645. case shaka.ads.AdManager.AD_COMPLETE:
  646. this.stats_.incrementPlayedCompletely();
  647. break;
  648. case shaka.ads.AdManager.AD_SKIPPED:
  649. this.stats_.incrementSkipped();
  650. break;
  651. }
  652. }
  653. this.dispatchEvent(event);
  654. }
  655. };
  656. /**
  657. * The event name for when a sequence of ads has been loaded.
  658. *
  659. * @const {string}
  660. * @export
  661. */
  662. shaka.ads.AdManager.ADS_LOADED = 'ads-loaded';
  663. /**
  664. * The event name for when an ad has started playing.
  665. *
  666. * @const {string}
  667. * @export
  668. */
  669. shaka.ads.AdManager.AD_STARTED = 'ad-started';
  670. /**
  671. * The event name for when an ad playhead crosses first quartile.
  672. *
  673. * @const {string}
  674. * @export
  675. */
  676. shaka.ads.AdManager.AD_FIRST_QUARTILE = 'ad-first-quartile';
  677. /**
  678. * The event name for when an ad playhead crosses midpoint.
  679. *
  680. * @const {string}
  681. * @export
  682. */
  683. shaka.ads.AdManager.AD_MIDPOINT = 'ad-midpoint';
  684. /**
  685. * The event name for when an ad playhead crosses third quartile.
  686. *
  687. * @const {string}
  688. * @export
  689. */
  690. shaka.ads.AdManager.AD_THIRD_QUARTILE = 'ad-third-quartile';
  691. /**
  692. * The event name for when an ad has completed playing.
  693. *
  694. * @const {string}
  695. * @export
  696. */
  697. shaka.ads.AdManager.AD_COMPLETE = 'ad-complete';
  698. /**
  699. * The event name for when an ad has finished playing
  700. * (played all the way through, was skipped, or was unable to proceed
  701. * due to an error).
  702. *
  703. * @const {string}
  704. * @export
  705. */
  706. shaka.ads.AdManager.AD_STOPPED = 'ad-stopped';
  707. /**
  708. * The event name for when an ad is skipped by the user..
  709. *
  710. * @const {string}
  711. * @export
  712. */
  713. shaka.ads.AdManager.AD_SKIPPED = 'ad-skipped';
  714. /**
  715. * The event name for when the ad volume has changed.
  716. *
  717. * @const {string}
  718. * @export
  719. */
  720. shaka.ads.AdManager.AD_VOLUME_CHANGED = 'ad-volume-changed';
  721. /**
  722. * The event name for when the ad was muted.
  723. *
  724. * @const {string}
  725. * @export
  726. */
  727. shaka.ads.AdManager.AD_MUTED = 'ad-muted';
  728. /**
  729. * The event name for when the ad was paused.
  730. *
  731. * @const {string}
  732. * @export
  733. */
  734. shaka.ads.AdManager.AD_PAUSED = 'ad-paused';
  735. /**
  736. * The event name for when the ad was resumed after a pause.
  737. *
  738. * @const {string}
  739. * @export
  740. */
  741. shaka.ads.AdManager.AD_RESUMED = 'ad-resumed';
  742. /**
  743. * The event name for when the ad's skip status changes
  744. * (usually it becomes skippable when it wasn't before).
  745. *
  746. * @const {string}
  747. * @export
  748. */
  749. shaka.ads.AdManager.AD_SKIP_STATE_CHANGED = 'ad-skip-state-changed';
  750. /**
  751. * The event name for when the ad's cue points (start/end markers)
  752. * have changed.
  753. *
  754. * @const {string}
  755. * @export
  756. */
  757. shaka.ads.AdManager.CUEPOINTS_CHANGED = 'ad-cue-points-changed';
  758. /**
  759. * The event name for when the native IMA ad manager object has
  760. * loaded and become available.
  761. *
  762. * @const {string}
  763. * @export
  764. */
  765. shaka.ads.AdManager.IMA_AD_MANAGER_LOADED = 'ima-ad-manager-loaded';
  766. /**
  767. * The event name for when the native IMA stream manager object has
  768. * loaded and become available.
  769. *
  770. * @const {string}
  771. * @export
  772. */
  773. shaka.ads.AdManager.IMA_STREAM_MANAGER_LOADED = 'ima-stream-manager-loaded';
  774. /**
  775. * The event name for when the ad was clicked.
  776. *
  777. * @const {string}
  778. * @export
  779. */
  780. shaka.ads.AdManager.AD_CLICKED = 'ad-clicked';
  781. /**
  782. * The event name for when there is an update to the current ad's progress.
  783. *
  784. * @const {string}
  785. * @export
  786. */
  787. shaka.ads.AdManager.AD_PROGRESS = 'ad-progress';
  788. /**
  789. * The event name for when the ad is buffering.
  790. *
  791. * @const {string}
  792. * @export
  793. */
  794. shaka.ads.AdManager.AD_BUFFERING = 'ad-buffering';
  795. /**
  796. * The event name for when the ad's URL was hit.
  797. *
  798. * @const {string}
  799. * @export
  800. */
  801. shaka.ads.AdManager.AD_IMPRESSION = 'ad-impression';
  802. /**
  803. * The event name for when the ad's duration changed.
  804. *
  805. * @const {string}
  806. * @export
  807. */
  808. shaka.ads.AdManager.AD_DURATION_CHANGED = 'ad-duration-changed';
  809. /**
  810. * The event name for when the ad was closed by the user.
  811. *
  812. * @const {string}
  813. * @export
  814. */
  815. shaka.ads.AdManager.AD_CLOSED = 'ad-closed';
  816. /**
  817. * The event name for when the ad data becomes available.
  818. *
  819. * @const {string}
  820. * @export
  821. */
  822. shaka.ads.AdManager.AD_LOADED = 'ad-loaded';
  823. /**
  824. * The event name for when all the ads were completed.
  825. *
  826. * @const {string}
  827. * @export
  828. */
  829. shaka.ads.AdManager.ALL_ADS_COMPLETED = 'all-ads-completed';
  830. /**
  831. * The event name for when the ad changes from or to linear.
  832. *
  833. * @const {string}
  834. * @export
  835. */
  836. shaka.ads.AdManager.AD_LINEAR_CHANGED = 'ad-linear-changed';
  837. /**
  838. * The event name for when the ad's metadata becomes available.
  839. *
  840. * @const {string}
  841. * @export
  842. */
  843. shaka.ads.AdManager.AD_METADATA = 'ad-metadata';
  844. /**
  845. * The event name for when the ad display encountered a recoverable
  846. * error.
  847. *
  848. * @const {string}
  849. * @export
  850. */
  851. shaka.ads.AdManager.AD_RECOVERABLE_ERROR = 'ad-recoverable-error';
  852. /**
  853. * The event name for when the ad manager dispatch errors.
  854. *
  855. * @const {string}
  856. * @export
  857. */
  858. shaka.ads.AdManager.AD_ERROR = 'ad-error';
  859. /**
  860. * The event name for when the client side SDK signalled its readiness
  861. * to play a VPAID ad or an ad rule.
  862. *
  863. * @const {string}
  864. * @export
  865. */
  866. shaka.ads.AdManager.AD_BREAK_READY = 'ad-break-ready';
  867. /**
  868. * The event name for when the interaction callback for the ad was
  869. * triggered.
  870. *
  871. * @const {string}
  872. * @export
  873. */
  874. shaka.ads.AdManager.AD_INTERACTION = 'ad-interaction';
  875. /**
  876. * Set this is a default ad manager for the player.
  877. * Apps can also set their own ad manager, if they'd like.
  878. */
  879. shaka.Player.setAdManagerFactory(() => new shaka.ads.AdManager());