Source: lib/ads/server_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.ServerSideAd');
  7. /**
  8. * @implements {shaka.extern.IAd}
  9. * @export
  10. */
  11. shaka.ads.ServerSideAd = class {
  12. /**
  13. * @param {google.ima.dai.api.Ad} imaAd
  14. * @param {HTMLMediaElement} video
  15. */
  16. constructor(imaAd, video) {
  17. /** @private {google.ima.dai.api.Ad} */
  18. this.ad_ = imaAd;
  19. /** @private {?google.ima.dai.api.AdProgressData} */
  20. this.adProgressData_ = null;
  21. /** @private {HTMLMediaElement} */
  22. this.video_ = video;
  23. }
  24. /**
  25. * @param {google.ima.dai.api.AdProgressData} data
  26. */
  27. setProgressData(data) {
  28. this.adProgressData_ = data;
  29. }
  30. /**
  31. * @override
  32. * @export
  33. */
  34. needsSkipUI() {
  35. return true;
  36. }
  37. /**
  38. * @override
  39. * @export
  40. */
  41. getDuration() {
  42. if (!this.adProgressData_) {
  43. // Unknown yet
  44. return -1;
  45. }
  46. return this.adProgressData_.duration;
  47. }
  48. /**
  49. * @override
  50. * @export
  51. */
  52. getMinSuggestedDuration() {
  53. return this.getDuration();
  54. }
  55. /**
  56. * @override
  57. * @export
  58. */
  59. getRemainingTime() {
  60. if (!this.adProgressData_) {
  61. // Unknown yet
  62. return -1;
  63. }
  64. return this.adProgressData_.duration - this.adProgressData_.currentTime;
  65. }
  66. /**
  67. * @override
  68. * @export
  69. */
  70. isPaused() {
  71. return this.video_.paused;
  72. }
  73. /**
  74. * @override
  75. * @export
  76. */
  77. isSkippable() {
  78. return this.ad_.isSkippable();
  79. }
  80. /**
  81. * @override
  82. * @export
  83. */
  84. getTimeUntilSkippable() {
  85. const skipOffset = this.ad_.getSkipTimeOffset();
  86. const canSkipIn = this.getRemainingTime() - skipOffset;
  87. return Math.max(canSkipIn, 0);
  88. }
  89. /**
  90. * @override
  91. * @export
  92. */
  93. canSkipNow() {
  94. return this.getTimeUntilSkippable() == 0;
  95. }
  96. /**
  97. * @override
  98. * @export
  99. */
  100. skip() {
  101. this.video_.currentTime += this.getRemainingTime();
  102. }
  103. /**
  104. * @override
  105. * @export
  106. */
  107. pause() {
  108. return this.video_.pause();
  109. }
  110. /**
  111. * @override
  112. * @export
  113. */
  114. play() {
  115. return this.video_.play();
  116. }
  117. /**
  118. * @override
  119. * @export
  120. */
  121. getVolume() {
  122. return this.video_.volume;
  123. }
  124. /**
  125. * @override
  126. * @export
  127. */
  128. setVolume(volume) {
  129. this.video_.volume = volume;
  130. }
  131. /**
  132. * @override
  133. * @export
  134. */
  135. isMuted() {
  136. return this.video_.muted;
  137. }
  138. /**
  139. * @override
  140. * @export
  141. */
  142. isLinear() {
  143. return true;
  144. }
  145. /**
  146. * @override
  147. * @export
  148. */
  149. resize(width, height) {
  150. // Nothing
  151. }
  152. /**
  153. * @override
  154. * @export
  155. */
  156. setMuted(muted) {
  157. this.video_.muted = muted;
  158. }
  159. /**
  160. * @override
  161. * @export
  162. */
  163. getSequenceLength() {
  164. const podInfo = this.ad_.getAdPodInfo();
  165. if (podInfo == null) {
  166. // No pod, just one ad.
  167. return 1;
  168. }
  169. return podInfo.getTotalAds();
  170. }
  171. /**
  172. * @override
  173. * @export
  174. */
  175. getPositionInSequence() {
  176. const podInfo = this.ad_.getAdPodInfo();
  177. if (podInfo == null) {
  178. // No pod, just one ad.
  179. return 1;
  180. }
  181. return podInfo.getAdPosition();
  182. }
  183. /**
  184. * @override
  185. * @export
  186. */
  187. getTitle() {
  188. return this.ad_.getTitle();
  189. }
  190. /**
  191. * @override
  192. * @export
  193. */
  194. getDescription() {
  195. return this.ad_.getDescription();
  196. }
  197. /**
  198. * @override
  199. * @export
  200. */
  201. getVastMediaBitrate() {
  202. return 0;
  203. }
  204. /**
  205. * @override
  206. * @export
  207. */
  208. getVastMediaHeight() {
  209. return this.ad_.getVastMediaHeight();
  210. }
  211. /**
  212. * @override
  213. * @export
  214. */
  215. getVastMediaWidth() {
  216. return this.ad_.getVastMediaWidth();
  217. }
  218. /**
  219. * @override
  220. * @export
  221. */
  222. getAdId() {
  223. return this.ad_.getAdId();
  224. }
  225. /**
  226. * @override
  227. * @export
  228. */
  229. getCreativeAdId() {
  230. return this.ad_.getCreativeAdId();
  231. }
  232. /**
  233. * @override
  234. * @export
  235. */
  236. getAdvertiserName() {
  237. return this.ad_.getAdvertiserName();
  238. }
  239. /**
  240. * @override
  241. * @export
  242. */
  243. getMediaUrl() {
  244. return null;
  245. }
  246. /**
  247. * @override
  248. * @export
  249. */
  250. getTimeOffset() {
  251. const podInfo = this.ad_.getAdPodInfo();
  252. if (podInfo == null) {
  253. // Defaults to 0 if this ad is not part of a pod, or the pod is not part
  254. // of an ad playlist.
  255. return 0;
  256. }
  257. return podInfo.getTimeOffset();
  258. }
  259. /**
  260. * @override
  261. * @export
  262. */
  263. getPodIndex() {
  264. const podInfo = this.ad_.getAdPodInfo();
  265. if (podInfo == null) {
  266. // Defaults to 0 if this ad is not part of a pod, or the pod is not part
  267. // of an ad playlist.
  268. return 0;
  269. }
  270. return podInfo.getPodIndex();
  271. }
  272. /**
  273. * @override
  274. * @export
  275. */
  276. release() {
  277. this.ad_ = null;
  278. this.adProgressData_ = null;
  279. this.video_ = null;
  280. }
  281. };