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