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