Source: lib/ads/client_side_ad.js

  1. /*! @license
  2. * Shaka Player
  3. * Copyright 2016 Google LLC
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. goog.provide('shaka.ads.ClientSideAd');
  7. goog.require('shaka.util.EventManager');
  8. /**
  9. * @implements {shaka.extern.IAd}
  10. * @export
  11. */
  12. shaka.ads.ClientSideAd = class {
  13. /**
  14. * @param {!google.ima.Ad} imaAd
  15. * @param {!google.ima.AdsManager} imaAdManager
  16. */
  17. constructor(imaAd, imaAdManager) {
  18. /** @private {google.ima.Ad} */
  19. this.ad_ = imaAd;
  20. /** @private {google.ima.AdsManager} */
  21. this.manager_ = imaAdManager;
  22. /** @private {boolean} */
  23. this.isPaused_ = false;
  24. /** @private {number} */
  25. this.volume_ = this.manager_.getVolume();
  26. /** @private {shaka.util.EventManager} */
  27. this.eventManager_ = new shaka.util.EventManager();
  28. this.eventManager_.listen(this.manager_,
  29. google.ima.AdEvent.Type.PAUSED, () => {
  30. this.isPaused_ = true;
  31. });
  32. this.eventManager_.listen(this.manager_,
  33. google.ima.AdEvent.Type.RESUMED, () => {
  34. this.isPaused_ = false;
  35. });
  36. }
  37. /**
  38. * @override
  39. * @export
  40. */
  41. getDuration() {
  42. return this.ad_.getDuration();
  43. }
  44. /**
  45. * @override
  46. * @export
  47. */
  48. getMinSuggestedDuration() {
  49. return this.ad_.getMinSuggestedDuration();
  50. }
  51. /**
  52. * @override
  53. * @export
  54. */
  55. getRemainingTime() {
  56. return this.manager_.getRemainingTime();
  57. }
  58. /**
  59. * @override
  60. * @export
  61. */
  62. isPaused() {
  63. return this.isPaused_;
  64. }
  65. /**
  66. * @override
  67. * @export
  68. */
  69. isSkippable() {
  70. // IMA returns -1 for non-skippable ads. Any positive number is a genuine
  71. // skip offset, meaning the ad is skippable.
  72. return this.ad_.getSkipTimeOffset() >= 0;
  73. }
  74. /**
  75. * @override
  76. * @export
  77. */
  78. getTimeUntilSkippable() {
  79. const skipOffset = this.ad_.getSkipTimeOffset();
  80. const canSkipIn = this.getRemainingTime() - skipOffset;
  81. return Math.max(canSkipIn, 0);
  82. }
  83. /**
  84. * @override
  85. * @export
  86. */
  87. canSkipNow() {
  88. return this.manager_.getAdSkippableState();
  89. }
  90. /**
  91. * @override
  92. * @export
  93. */
  94. skip() {
  95. return this.manager_.skip();
  96. }
  97. /**
  98. * @param {boolean} paused
  99. */
  100. setPaused(paused) {
  101. this.isPaused_ = paused;
  102. }
  103. /**
  104. * @override
  105. * @export
  106. */
  107. pause() {
  108. return this.manager_.pause();
  109. }
  110. /**
  111. * @override
  112. * @export
  113. */
  114. play() {
  115. return this.manager_.resume();
  116. }
  117. /**
  118. * @override
  119. * @export
  120. */
  121. getVolume() {
  122. return this.manager_.getVolume();
  123. }
  124. /**
  125. * @override
  126. * @export
  127. */
  128. setVolume(volume) {
  129. return this.manager_.setVolume(volume);
  130. }
  131. /**
  132. * @override
  133. * @export
  134. */
  135. isMuted() {
  136. return this.manager_.getVolume() == 0;
  137. }
  138. /**
  139. * @override
  140. * @export
  141. */
  142. resize(width, height) {
  143. const viewMode = document.fullscreenElement ?
  144. google.ima.ViewMode.FULLSCREEN : google.ima.ViewMode.NORMAL;
  145. this.manager_.resize(width, height, viewMode);
  146. }
  147. /**
  148. * @override
  149. * @export
  150. */
  151. setMuted(muted) {
  152. // Emulate the "mute" functionality, where current, pre-mute
  153. // volume is saved and can be restored on unmute.
  154. if (muted) {
  155. this.volume_ = this.getVolume();
  156. this.setVolume(0);
  157. } else {
  158. this.setVolume(this.volume_);
  159. }
  160. }
  161. /**
  162. * @override
  163. * @export
  164. */
  165. getSequenceLength() {
  166. const podInfo = this.ad_.getAdPodInfo();
  167. if (podInfo == null) {
  168. // No pod, just one ad.
  169. return 1;
  170. }
  171. return podInfo.getTotalAds();
  172. }
  173. /**
  174. * @override
  175. * @export
  176. */
  177. getPositionInSequence() {
  178. const podInfo = this.ad_.getAdPodInfo();
  179. if (podInfo == null) {
  180. // No pod, just one ad.
  181. return 1;
  182. }
  183. return podInfo.getAdPosition();
  184. }
  185. /**
  186. * @override
  187. * @export
  188. */
  189. release() {
  190. this.ad_ = null;
  191. this.manager_ = null;
  192. }
  193. };