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