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