shaka-player 4.4.3 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  2. package/.github/workflows/release-please.yaml +2 -27
  3. package/AUTHORS +2 -0
  4. package/CHANGELOG.md +156 -39
  5. package/CODE_OF_CONDUCT.md +1 -1
  6. package/CONTRIBUTORS +2 -0
  7. package/README.md +54 -42
  8. package/demo/asset_card.js +18 -21
  9. package/demo/cast_receiver/index.html +0 -1
  10. package/demo/close_button.js +0 -3
  11. package/demo/common/asset.js +33 -22
  12. package/demo/common/assets.js +249 -60
  13. package/demo/config.js +219 -253
  14. package/demo/custom.js +88 -133
  15. package/demo/front.js +7 -10
  16. package/demo/index.html +19 -22
  17. package/demo/input.js +6 -11
  18. package/demo/input_container.js +8 -9
  19. package/demo/main.js +62 -126
  20. package/demo/search.js +29 -34
  21. package/demo/service_worker.js +0 -3
  22. package/demo/tooltip.js +3 -5
  23. package/demo/visualizer.js +3 -5
  24. package/demo/visualizer_button.js +1 -20
  25. package/dist/controls.css +1 -1
  26. package/dist/controls.css.map +1 -1
  27. package/dist/demo.compiled.debug.js +211 -228
  28. package/dist/demo.compiled.debug.map +4 -4
  29. package/dist/demo.compiled.js +211 -228
  30. package/dist/demo.compiled.map +4 -4
  31. package/dist/deps.js +42 -37
  32. package/dist/locales.js +34 -30
  33. package/dist/receiver.compiled.debug.js +64 -77
  34. package/dist/receiver.compiled.debug.map +4 -4
  35. package/dist/receiver.compiled.js +64 -77
  36. package/dist/receiver.compiled.map +4 -4
  37. package/dist/shaka-player.compiled.d.ts +343 -151
  38. package/dist/shaka-player.compiled.debug.d.ts +343 -151
  39. package/dist/shaka-player.compiled.debug.externs.js +356 -117
  40. package/dist/shaka-player.compiled.debug.js +952 -811
  41. package/dist/shaka-player.compiled.debug.map +4 -4
  42. package/dist/shaka-player.compiled.externs.js +356 -117
  43. package/dist/shaka-player.compiled.js +1165 -1078
  44. package/dist/shaka-player.compiled.map +4 -4
  45. package/dist/shaka-player.ui.d.ts +359 -153
  46. package/dist/shaka-player.ui.debug.d.ts +359 -153
  47. package/dist/shaka-player.ui.debug.externs.js +382 -117
  48. package/dist/shaka-player.ui.debug.js +1084 -918
  49. package/dist/shaka-player.ui.debug.map +4 -4
  50. package/dist/shaka-player.ui.externs.js +382 -117
  51. package/dist/shaka-player.ui.js +1377 -1274
  52. package/dist/shaka-player.ui.map +4 -4
  53. package/docs/design/lcevc-integration.md +14 -14
  54. package/docs/tutorials/ad_monetization.md +54 -0
  55. package/docs/tutorials/basic-usage.md +2 -1
  56. package/docs/tutorials/errors.md +2 -1
  57. package/docs/tutorials/faq.md +27 -55
  58. package/docs/tutorials/index.json +2 -1
  59. package/docs/tutorials/lcevc.md +118 -0
  60. package/docs/tutorials/offline.md +10 -8
  61. package/docs/tutorials/plugins.md +5 -0
  62. package/docs/tutorials/ui-customization.md +17 -0
  63. package/docs/tutorials/ui.md +2 -1
  64. package/docs/tutorials/upgrade.md +3 -0
  65. package/externs/css_style_declaration.js +19 -0
  66. package/externs/lcevc.js +37 -13
  67. package/externs/managedmediasource.js +24 -0
  68. package/externs/media_remote.js +68 -0
  69. package/externs/mediatailor.js +193 -0
  70. package/externs/pictureinpicture.js +11 -0
  71. package/externs/shaka/abr_manager.js +6 -2
  72. package/externs/shaka/ads.js +27 -0
  73. package/externs/shaka/cea.js +7 -0
  74. package/externs/shaka/codecs.js +5 -3
  75. package/externs/shaka/manifest.js +31 -10
  76. package/externs/shaka/manifest_parser.js +24 -1
  77. package/externs/shaka/net.js +2 -2
  78. package/externs/shaka/offline.js +13 -2
  79. package/externs/shaka/player.js +65 -8
  80. package/externs/shaka/text.js +3 -1
  81. package/externs/shaka/transmuxer.js +1 -1
  82. package/karma.conf.js +7 -3
  83. package/lib/abr/simple_abr_manager.js +66 -9
  84. package/lib/ads/ad_manager.js +104 -50
  85. package/lib/ads/media_tailor_ad.js +297 -0
  86. package/lib/ads/media_tailor_ad_manager.js +839 -0
  87. package/lib/cast/cast_receiver.js +1 -1
  88. package/lib/cea/cea_decoder.js +28 -0
  89. package/lib/cea/dummy_caption_decoder.js +5 -0
  90. package/lib/cea/ts_cea_parser.js +15 -2
  91. package/lib/config/codec_switching_strategy.js +24 -0
  92. package/lib/dash/content_protection.js +120 -2
  93. package/lib/dash/dash_parser.js +322 -93
  94. package/lib/dash/mpd_utils.js +62 -37
  95. package/lib/dash/segment_base.js +17 -10
  96. package/lib/dash/segment_list.js +18 -9
  97. package/lib/dash/segment_template.js +122 -107
  98. package/lib/dependencies/all.js +8 -7
  99. package/lib/hls/hls_classes.js +28 -43
  100. package/lib/hls/hls_parser.js +798 -658
  101. package/lib/hls/hls_utils.js +64 -5
  102. package/lib/hls/manifest_text_parser.js +7 -11
  103. package/lib/lcevc/lcevc_dec.js +220 -0
  104. package/lib/media/adaptation_set.js +32 -14
  105. package/lib/media/adaptation_set_criteria.js +86 -16
  106. package/lib/media/closed_caption_parser.js +13 -0
  107. package/lib/media/content_workarounds.js +6 -0
  108. package/lib/media/drm_engine.js +8 -13
  109. package/lib/media/manifest_parser.js +8 -113
  110. package/lib/media/media_source_capabilities.js +10 -3
  111. package/lib/media/media_source_engine.js +286 -44
  112. package/lib/media/play_rate_controller.js +8 -38
  113. package/lib/media/presentation_timeline.js +7 -1
  114. package/lib/media/quality_observer.js +1 -1
  115. package/lib/media/segment_index.js +6 -6
  116. package/lib/media/segment_prefetch.js +92 -24
  117. package/lib/media/segment_reference.js +73 -7
  118. package/lib/media/segment_utils.js +343 -0
  119. package/lib/media/stall_detector.js +0 -3
  120. package/lib/media/streaming_engine.js +73 -38
  121. package/lib/mss/mss_parser.js +19 -2
  122. package/lib/net/networking_engine.js +67 -12
  123. package/lib/net/networking_utils.js +95 -0
  124. package/lib/offline/indexeddb/v1_storage_cell.js +3 -0
  125. package/lib/offline/indexeddb/v2_storage_cell.js +3 -0
  126. package/lib/offline/manifest_converter.js +3 -0
  127. package/lib/offline/offline_manifest_parser.js +10 -0
  128. package/lib/offline/storage.js +14 -7
  129. package/lib/player.js +1098 -1537
  130. package/lib/polyfill/mediasource.js +22 -1
  131. package/lib/text/cue.js +15 -0
  132. package/lib/text/mp4_ttml_parser.js +2 -2
  133. package/lib/text/srt_text_parser.js +2 -2
  134. package/lib/text/stub_text_displayer.js +51 -0
  135. package/lib/text/text_engine.js +3 -2
  136. package/lib/text/ttml_text_parser.js +45 -5
  137. package/lib/text/ui_text_displayer.js +8 -0
  138. package/lib/text/vtt_text_parser.js +40 -22
  139. package/lib/transmuxer/aac_transmuxer.js +1 -1
  140. package/lib/transmuxer/ac3_transmuxer.js +1 -1
  141. package/lib/transmuxer/ec3_transmuxer.js +1 -1
  142. package/lib/transmuxer/h264.js +5 -4
  143. package/lib/transmuxer/h265.js +863 -0
  144. package/lib/transmuxer/mp3_transmuxer.js +1 -1
  145. package/lib/transmuxer/mpeg_ts_transmuxer.js +4 -3
  146. package/lib/transmuxer/mss_transmuxer.js +1 -1
  147. package/lib/transmuxer/ts_transmuxer.js +187 -22
  148. package/lib/util/buffer_utils.js +26 -4
  149. package/lib/util/content_steering_manager.js +358 -0
  150. package/lib/util/error.js +30 -15
  151. package/lib/util/exp_golomb.js +30 -2
  152. package/lib/util/fairplay_utils.js +1 -1
  153. package/lib/util/fake_event.js +8 -1
  154. package/lib/util/id3_utils.js +50 -1
  155. package/lib/util/manifest_parser_utils.js +12 -8
  156. package/lib/util/mp4_generator.js +6 -8
  157. package/lib/util/mutex.js +59 -0
  158. package/lib/util/object_utils.js +1 -1
  159. package/lib/util/periods.js +156 -179
  160. package/lib/util/platform.js +44 -3
  161. package/lib/util/player_configuration.js +43 -6
  162. package/lib/util/state_history.js +6 -2
  163. package/lib/util/stream_utils.js +206 -283
  164. package/lib/util/ts_parser.js +335 -98
  165. package/lib/util/uint8array_utils.js +5 -1
  166. package/lib/util/xml_utils.js +5 -0
  167. package/maintained-branches.md +3 -2
  168. package/package.json +4 -6
  169. package/roadmap.md +25 -5
  170. package/shaka-player.uncompiled.js +2 -2
  171. package/support.html +0 -1
  172. package/test/abr/simple_abr_manager_unit.js +33 -33
  173. package/test/ads/ad_manager_unit.js +3 -2
  174. package/test/cast/cast_receiver_integration.js +50 -4
  175. package/test/cast/cast_utils_unit.js +2 -0
  176. package/test/cea/cea_decoder_unit.js +7 -0
  177. package/test/codec_switching/codec_switching_integration.js +182 -0
  178. package/test/dash/dash_parser_content_protection_unit.js +2 -0
  179. package/test/dash/dash_parser_integration.js +74 -0
  180. package/test/dash/dash_parser_live_unit.js +2 -19
  181. package/test/dash/dash_parser_manifest_unit.js +536 -2
  182. package/test/dash/dash_parser_segment_base_unit.js +2 -0
  183. package/test/dash/dash_parser_segment_list_unit.js +2 -0
  184. package/test/dash/dash_parser_segment_template_unit.js +2 -0
  185. package/test/dash/mpd_utils_unit.js +61 -30
  186. package/test/demo/demo_unit.js +0 -16
  187. package/test/hls/hls_live_unit.js +14 -3
  188. package/test/hls/hls_parser_unit.js +385 -33
  189. package/test/hls/manifest_text_parser_unit.js +32 -99
  190. package/test/media/adaptation_set_criteria_unit.js +284 -15
  191. package/test/media/adaptation_set_unit.js +2 -0
  192. package/test/media/content_workarounds_unit.js +1 -1
  193. package/test/media/drm_engine_unit.js +3 -3
  194. package/test/media/media_source_engine_unit.js +166 -2
  195. package/test/media/play_rate_controller_unit.js +0 -48
  196. package/test/media/segment_index_unit.js +5 -4
  197. package/test/media/segment_prefetch_unit.js +1 -1
  198. package/test/media/streaming_engine_unit.js +17 -17
  199. package/test/mss/mss_parser_unit.js +2 -0
  200. package/test/mss/mss_player_integration.js +3 -2
  201. package/test/net/networking_engine_unit.js +3 -3
  202. package/test/{media/manifest_parser_unit.js → net/networking_utils_unit.js} +2 -2
  203. package/test/offline/manifest_convert_unit.js +14 -0
  204. package/test/offline/offline_integration.js +2 -1
  205. package/test/offline/storage_integration.js +22 -13
  206. package/test/player_external.js +4 -2
  207. package/test/player_integration.js +15 -4
  208. package/test/player_load_graph_integration.js +47 -151
  209. package/test/player_src_equals_external.js +1 -0
  210. package/test/player_src_equals_integration.js +71 -4
  211. package/test/player_unit.js +182 -158
  212. package/test/test/assets/dash-aes-128/Fragments(video=0,format=mpd-time-csf) +0 -0
  213. package/test/test/assets/dash-aes-128/Fragments(video=20000000,format=mpd-time-csf) +0 -0
  214. package/test/test/assets/dash-aes-128/Fragments(video=40000000,format=mpd-time-csf) +0 -0
  215. package/test/test/assets/dash-aes-128/Fragments(video=60000000,format=mpd-time-csf) +0 -0
  216. package/test/test/assets/dash-aes-128/Fragments(video=i,format=mpd-time-csf) +0 -0
  217. package/test/test/assets/dash-aes-128/dash.mpd +18 -0
  218. package/test/test/assets/dash-aes-128/license +1 -0
  219. package/test/test/assets/dash-multi-codec/audio_en_2c_128k_aac.mp4 +0 -0
  220. package/test/test/assets/dash-multi-codec/audio_es_2c_64k_opus.webm +0 -0
  221. package/test/test/assets/dash-multi-codec/dash.mpd +32 -0
  222. package/test/test/assets/dash-multi-codec/video_144p_108k_h264.mp4 +0 -0
  223. package/test/test/assets/hls-ts-h265/0.ts +0 -0
  224. package/test/test/assets/hls-ts-h265/hevc.m3u8 +6 -0
  225. package/test/test/assets/hls-ts-h265/index.m3u8 +7 -0
  226. package/test/test/assets/hls-ts-muxed-aac-h265/0.ts +0 -0
  227. package/test/test/assets/hls-ts-muxed-aac-h265/1.ts +0 -0
  228. package/test/test/assets/hls-ts-muxed-aac-h265/media.m3u8 +9 -0
  229. package/test/test/assets/hls-ts-muxed-ac3-h264/media.m3u8 +24 -0
  230. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00000.ts +0 -0
  231. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00001.ts +0 -0
  232. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00002.ts +0 -0
  233. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00003.ts +0 -0
  234. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00004.ts +0 -0
  235. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00005.ts +0 -0
  236. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0000.ts +0 -0
  237. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0001.ts +0 -0
  238. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0002.ts +0 -0
  239. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0003.ts +0 -0
  240. package/test/test/assets/hls-ts-muxed-ec3-h264/prog_index.m3u8 +14 -0
  241. package/test/test/assets/hls-ts-muxed-mp3-h264/index.m3u8 +23 -0
  242. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-1-v1-a1.ts +0 -0
  243. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-2-v1-a1.ts +0 -0
  244. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-3-v1-a1.ts +0 -0
  245. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-4-v1-a1.ts +0 -0
  246. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-5-v1-a1.ts +0 -0
  247. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-6-v1-a1.ts +0 -0
  248. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-7-v1-a1.ts +0 -0
  249. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-8-v1-a1.ts +0 -0
  250. package/test/test/util/dash_parser_util.js +4 -0
  251. package/test/test/util/fake_ad_manager.js +20 -0
  252. package/test/test/util/fake_media_source_engine.js +13 -2
  253. package/test/test/util/fake_networking_engine.js +9 -1
  254. package/test/test/util/fake_segment_prefetch.js +3 -0
  255. package/test/test/util/manifest_generator.js +11 -3
  256. package/test/test/util/manifest_parser_util.js +14 -2
  257. package/test/test/util/mss_parser_util.js +4 -0
  258. package/test/test/util/offline_utils.js +2 -0
  259. package/test/test/util/simple_fakes.js +2 -2
  260. package/test/test/util/streaming_engine_util.js +10 -4
  261. package/test/test/util/test_scheme.js +6 -0
  262. package/test/test/util/ui_utils.js +4 -3
  263. package/test/text/mp4_ttml_parser_unit.js +4 -4
  264. package/test/text/srt_text_parser_unit.js +1 -1
  265. package/test/text/text_displayer_layout_unit.js +1 -1
  266. package/test/text/text_engine_unit.js +6 -0
  267. package/test/text/ttml_text_parser_unit.js +85 -2
  268. package/test/text/vtt_text_parser_unit.js +103 -31
  269. package/test/transmuxer/transmuxer_engine_integration.js +9 -0
  270. package/test/transmuxer/transmuxer_integration.js +150 -3
  271. package/test/ui/ad_ui_unit.js +2 -2
  272. package/test/ui/ui_customization_unit.js +17 -16
  273. package/test/ui/ui_integration.js +30 -20
  274. package/test/ui/ui_unit.js +28 -29
  275. package/test/util/buffer_utils_unit.js +1 -1
  276. package/test/util/content_steering_manager_unit.js +427 -0
  277. package/test/util/id3_utils_unit.js +52 -0
  278. package/test/util/stream_utils_unit.js +207 -169
  279. package/test/util/ts_parser_unit.js +3 -3
  280. package/third_party/closure-uri/uri.js +13 -1
  281. package/ui/audio_language_selection.js +9 -2
  282. package/ui/controls.js +125 -0
  283. package/ui/externs/ui.js +24 -2
  284. package/ui/language_utils.js +43 -8
  285. package/ui/less/range_elements.less +33 -0
  286. package/ui/locales/en.json +1 -0
  287. package/ui/locales/es-419.json +1 -0
  288. package/ui/locales/es.json +1 -0
  289. package/ui/locales/source.json +4 -0
  290. package/ui/localization.js +10 -0
  291. package/ui/pip_button.js +22 -120
  292. package/ui/remote_button.js +203 -0
  293. package/ui/resolution_selection.js +47 -10
  294. package/ui/seek_bar.js +296 -3
  295. package/ui/text_selection.js +2 -1
  296. package/ui/ui.js +11 -4
  297. package/demo/common/message_ids.js +0 -309
  298. package/demo/locales/en.json +0 -288
  299. package/demo/locales/source.json +0 -1146
  300. package/externs/mux.js +0 -69
  301. package/lib/lcevc/lcevc_dil.js +0 -152
  302. package/lib/routing/node.js +0 -23
  303. package/lib/routing/payload.js +0 -43
  304. package/lib/routing/walker.js +0 -587
  305. package/lib/transmuxer/muxjs_transmuxer.js +0 -242
  306. package/test/routing/walker_unit.js +0 -504
  307. package/test/transmuxer/muxjs_transmuxer_integration.js +0 -177
@@ -0,0 +1,839 @@
1
+ /*! @license
2
+ * Shaka Player
3
+ * Copyright 2016 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ /**
8
+ * @fileoverview
9
+ * @suppress {missingRequire} TODO(b/152540451): this shouldn't be needed
10
+ */
11
+
12
+ goog.provide('shaka.ads.MediaTailorAdManager');
13
+
14
+ goog.require('goog.asserts');
15
+ goog.require('shaka.ads.MediaTailorAd');
16
+ goog.require('shaka.log');
17
+ goog.require('shaka.net.NetworkingEngine');
18
+ goog.require('shaka.util.IReleasable');
19
+ goog.require('shaka.util.StringUtils');
20
+
21
+
22
+ /**
23
+ * A class responsible for MediaTailor ad interactions.
24
+ *
25
+ * @implements {shaka.util.IReleasable}
26
+ */
27
+ shaka.ads.MediaTailorAdManager = class {
28
+ /**
29
+ * @param {HTMLElement} adContainer
30
+ * @param {shaka.net.NetworkingEngine} networkingEngine
31
+ * @param {HTMLMediaElement} video
32
+ * @param {function(!shaka.util.FakeEvent)} onEvent
33
+ */
34
+ constructor(adContainer, networkingEngine, video, onEvent) {
35
+ /** @private {HTMLElement} */
36
+ this.adContainer_ = adContainer;
37
+
38
+ /** @private {shaka.net.NetworkingEngine} */
39
+ this.networkingEngine_ = networkingEngine;
40
+
41
+ /** @private {HTMLMediaElement} */
42
+ this.video_ = video;
43
+
44
+ /** @private {?shaka.util.PublicPromise.<string>} */
45
+ this.streamPromise_ = null;
46
+
47
+ /** @private {number} */
48
+ this.streamRequestStartTime_ = NaN;
49
+
50
+ /** @private {function(!shaka.util.FakeEvent)} */
51
+ this.onEvent_ = onEvent;
52
+
53
+ /** @private {boolean} */
54
+ this.isLive_ = false;
55
+
56
+ /**
57
+ * Time to seek to after an ad if that ad was played as the result of
58
+ * snapback.
59
+ * @private {?number}
60
+ */
61
+ this.snapForwardTime_ = null;
62
+
63
+ /** @private {!Array.<!mediaTailor.AdBreak>} */
64
+ this.adBreaks_ = [];
65
+
66
+ /** @private {!Array.<string>} */
67
+ this.playedAds_ = [];
68
+
69
+ /** @private {?shaka.ads.MediaTailorAd} */
70
+ this.ad_ = null;
71
+
72
+ /** @private {?mediaTailor.Ad} */
73
+ this.mediaTailorAd_ = null;
74
+
75
+ /** @private {?mediaTailor.AdBreak} */
76
+ this.mediaTailorAdBreak_ = null;
77
+
78
+ /** @private {!Map.<string,!Array.<mediaTailorExternalResource.App>>} */
79
+ this.staticResources_ = new Map();
80
+
81
+ /** @private {!Array.<{target: EventTarget, type: string,
82
+ * listener: shaka.util.EventManager.ListenerType}>}
83
+ */
84
+ this.adListeners_ = [];
85
+
86
+ /** @private {!Array.<string>} */
87
+ this.eventsSent = [];
88
+
89
+ /** @private {string} */
90
+ this.trackingUrl_ = '';
91
+
92
+ /** @private {boolean} */
93
+ this.firstTrackingRequest_ = true;
94
+
95
+ /** @private {string} */
96
+ this.backupUrl_ = '';
97
+
98
+ /** @private {!Array.<!shaka.extern.AdCuePoint>} */
99
+ this.currentCuePoints_ = [];
100
+
101
+ /** @private {shaka.util.EventManager} */
102
+ this.eventManager_ = new shaka.util.EventManager();
103
+ }
104
+
105
+ /**
106
+ * @param {string} url
107
+ * @param {Object} adsParams
108
+ * @param {string} backupUrl
109
+ * @return {!Promise.<string>}
110
+ */
111
+ streamRequest(url, adsParams, backupUrl) {
112
+ if (this.streamPromise_) {
113
+ return Promise.reject(new shaka.util.Error(
114
+ shaka.util.Error.Severity.RECOVERABLE,
115
+ shaka.util.Error.Category.ADS,
116
+ shaka.util.Error.Code.CURRENT_DAI_REQUEST_NOT_FINISHED));
117
+ }
118
+
119
+ this.streamPromise_ = new shaka.util.PublicPromise();
120
+ this.requestSessionInfo_(url, adsParams);
121
+ this.backupUrl_ = backupUrl || '';
122
+
123
+ this.streamRequestStartTime_ = Date.now() / 1000;
124
+
125
+ return this.streamPromise_;
126
+ }
127
+
128
+ /**
129
+ * Resets the MediaTailor manager and removes any continuous polling.
130
+ */
131
+ stop() {
132
+ for (const listener of this.adListeners_) {
133
+ this.eventManager_.unlisten(
134
+ listener.target, listener.type, listener.listener);
135
+ }
136
+ this.onEnded_();
137
+ this.adListeners_ = [];
138
+ this.eventsSent = [];
139
+ this.trackingUrl_ = '';
140
+ this.firstTrackingRequest_ = true;
141
+ this.backupUrl_ = '';
142
+ this.snapForwardTime_ = null;
143
+ this.adBreaks_ = [];
144
+ this.playedAds_ = [];
145
+ this.staticResources_.clear();
146
+ }
147
+
148
+ /** @override */
149
+ release() {
150
+ this.stop();
151
+ if (this.eventManager_) {
152
+ this.eventManager_.release();
153
+ }
154
+ }
155
+
156
+ /**
157
+ * Fired when the manifest is updated
158
+ *
159
+ * @param {boolean} isLive
160
+ */
161
+ onManifestUpdated(isLive) {
162
+ this.isLive_ = isLive;
163
+ if (this.trackingUrl_ != '') {
164
+ this.requestTrackingInfo_(
165
+ this.trackingUrl_, this.firstTrackingRequest_);
166
+ this.firstTrackingRequest_ = false;
167
+ }
168
+ }
169
+
170
+ /**
171
+ * @return {!Array.<!shaka.extern.AdCuePoint>}
172
+ */
173
+ getCuePoints() {
174
+ const cuePoints = [];
175
+ for (const adbreak of this.adBreaks_) {
176
+ for (const ad of adbreak.ads) {
177
+ /** @type {!shaka.extern.AdCuePoint} */
178
+ const cuePoint = {
179
+ start: ad.startTimeInSeconds,
180
+ end: ad.startTimeInSeconds + ad.durationInSeconds,
181
+ };
182
+ cuePoints.push(cuePoint);
183
+ }
184
+ }
185
+ return cuePoints;
186
+ }
187
+
188
+ /**
189
+ * @param {string} url
190
+ * @param {Object} adsParams
191
+ * @private
192
+ */
193
+ async requestSessionInfo_(url, adsParams) {
194
+ const type = shaka.net.NetworkingEngine.RequestType.ADS;
195
+ const request = shaka.net.NetworkingEngine.makeRequest(
196
+ [url],
197
+ shaka.net.NetworkingEngine.defaultRetryParameters());
198
+ request.method = 'POST';
199
+ if (adsParams) {
200
+ const body = JSON.stringify(adsParams);
201
+ request.body = shaka.util.StringUtils.toUTF8(body);
202
+ }
203
+
204
+ const op = this.networkingEngine_.request(type, request);
205
+ try {
206
+ const response = await op.promise;
207
+ const data = shaka.util.StringUtils.fromUTF8(response.data);
208
+ const dataAsJson =
209
+ /** @type {!mediaTailor.SessionResponse} */ (JSON.parse(data));
210
+ if (dataAsJson.manifestUrl && dataAsJson.trackingUrl) {
211
+ const baseUri = new goog.Uri(url);
212
+ const relativeTrackingUri = new goog.Uri(dataAsJson.trackingUrl);
213
+ this.trackingUrl_ = baseUri.resolve(relativeTrackingUri).toString();
214
+ const now = Date.now() / 1000;
215
+ const loadTime = now - this.streamRequestStartTime_;
216
+ this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.ADS_LOADED,
217
+ (new Map()).set('loadTime', loadTime)));
218
+ const relativeManifestUri = new goog.Uri(dataAsJson.manifestUrl);
219
+ this.streamPromise_.resolve(
220
+ baseUri.resolve(relativeManifestUri).toString());
221
+ this.streamPromise_ = null;
222
+ } else {
223
+ throw new Error('Insufficient data from MediaTailor.');
224
+ }
225
+ } catch (e) {
226
+ if (!this.backupUrl_.length) {
227
+ this.streamPromise_.reject('MediaTailor request returned an error ' +
228
+ 'and there was no backup asset uri provided.');
229
+ this.streamPromise_ = null;
230
+ return;
231
+ }
232
+
233
+ shaka.log.warning('MediaTailor request returned an error. ' +
234
+ 'Falling back to the backup asset uri.');
235
+ this.streamPromise_.resolve(this.backupUrl_);
236
+ this.streamPromise_ = null;
237
+ }
238
+ }
239
+
240
+ /**
241
+ * @param {string} trackingUrl
242
+ * @param {boolean} firstRequest
243
+ * @private
244
+ */
245
+ async requestTrackingInfo_(trackingUrl, firstRequest) {
246
+ const type = shaka.net.NetworkingEngine.RequestType.ADS;
247
+ const request = shaka.net.NetworkingEngine.makeRequest(
248
+ [trackingUrl],
249
+ shaka.net.NetworkingEngine.defaultRetryParameters());
250
+
251
+ const op = this.networkingEngine_.request(type, request);
252
+ try {
253
+ const response = await op.promise;
254
+ let cuepoints = [];
255
+ const data = shaka.util.StringUtils.fromUTF8(response.data);
256
+ const dataAsJson =
257
+ /** @type {!mediaTailor.TrackingResponse} */ (JSON.parse(data));
258
+ if (dataAsJson.avails.length > 0) {
259
+ if (JSON.stringify(this.adBreaks_) !=
260
+ JSON.stringify(dataAsJson.avails)) {
261
+ this.adBreaks_ = dataAsJson.avails;
262
+ for (const adbreak of this.adBreaks_) {
263
+ for (const nonLinearAd of adbreak.nonLinearAdsList) {
264
+ for (const nonLinearAdResource of nonLinearAd.nonLinearAdList) {
265
+ this.requestStaticResource_(nonLinearAdResource);
266
+ }
267
+ }
268
+ }
269
+ cuepoints = this.getCuePoints();
270
+ this.onEvent_(new shaka.util.FakeEvent(
271
+ shaka.ads.AdManager.CUEPOINTS_CHANGED,
272
+ (new Map()).set('cuepoints', cuepoints)));
273
+ }
274
+ } else {
275
+ if (this.adBreaks_.length) {
276
+ this.onEvent_(new shaka.util.FakeEvent(
277
+ shaka.ads.AdManager.CUEPOINTS_CHANGED,
278
+ (new Map()).set('cuepoints', cuepoints)));
279
+ }
280
+ this.onEnded_();
281
+ this.adBreaks_ = [];
282
+ }
283
+ if (firstRequest && (this.isLive_ || cuepoints.length > 0)) {
284
+ this.setupAdBreakListeners_();
285
+ }
286
+ } catch (e) {}
287
+ }
288
+
289
+ /**
290
+ * @param {mediaTailor.NonLinearAd} nonLinearAd
291
+ * @private
292
+ */
293
+ async requestStaticResource_(nonLinearAd) {
294
+ if (!nonLinearAd.staticResource) {
295
+ return;
296
+ }
297
+ const cacheKey = this.getCacheKeyForNonLinear_(nonLinearAd);
298
+ const staticResource = this.staticResources_.get(cacheKey);
299
+ if (staticResource) {
300
+ return;
301
+ }
302
+
303
+ const type = shaka.net.NetworkingEngine.RequestType.ADS;
304
+ const request = shaka.net.NetworkingEngine.makeRequest(
305
+ [nonLinearAd.staticResource],
306
+ shaka.net.NetworkingEngine.defaultRetryParameters());
307
+
308
+ const op = this.networkingEngine_.request(type, request);
309
+ try {
310
+ this.staticResources_.set(cacheKey, []);
311
+ const response = await op.promise;
312
+ const data = shaka.util.StringUtils.fromUTF8(response.data);
313
+ const dataAsJson =
314
+ /** @type {!mediaTailorExternalResource.Response} */ (JSON.parse(data));
315
+ const apps = dataAsJson.apps;
316
+ this.staticResources_.set(cacheKey, apps);
317
+ } catch (e) {
318
+ this.staticResources_.delete(cacheKey);
319
+ }
320
+ }
321
+
322
+ /**
323
+ * @param {mediaTailor.NonLinearAd} nonLinearAd
324
+ * @return {string}
325
+ * @private
326
+ */
327
+ getCacheKeyForNonLinear_(nonLinearAd) {
328
+ return [
329
+ nonLinearAd.adId,
330
+ nonLinearAd.adParameters,
331
+ nonLinearAd.adSystem,
332
+ nonLinearAd.adTitle,
333
+ nonLinearAd.creativeAdId,
334
+ nonLinearAd.creativeId,
335
+ nonLinearAd.creativeSequence,
336
+ nonLinearAd.height,
337
+ nonLinearAd.width,
338
+ nonLinearAd.staticResource,
339
+ ].join('');
340
+ }
341
+
342
+ /**
343
+ * Setup Ad Break listeners
344
+ *
345
+ * @private
346
+ */
347
+ setupAdBreakListeners_() {
348
+ this.onTimeupdate_();
349
+ if (!this.isLive_) {
350
+ this.checkForSnapback_();
351
+ this.eventManager_.listen(this.video_, 'seeked', () => {
352
+ this.checkForSnapback_();
353
+ });
354
+ this.eventManager_.listen(this.video_, 'ended', () => {
355
+ this.onEnded_();
356
+ });
357
+ }
358
+ this.eventManager_.listen(this.video_, 'timeupdate', () => {
359
+ this.onTimeupdate_();
360
+ });
361
+ }
362
+
363
+ /**
364
+ * If a seek jumped over the ad break, return to the start of the
365
+ * ad break, then complete the seek after the ad played through.
366
+ *
367
+ * @private
368
+ */
369
+ checkForSnapback_() {
370
+ const currentTime = this.video_.currentTime;
371
+ if (currentTime == 0 || this.snapForwardTime_ != null) {
372
+ return;
373
+ }
374
+
375
+ let previousAdBreak;
376
+ let previousAd;
377
+ for (const adbreak of this.adBreaks_) {
378
+ for (const ad of adbreak.ads) {
379
+ if (!previousAd) {
380
+ if (ad.startTimeInSeconds < currentTime) {
381
+ previousAd = ad;
382
+ previousAdBreak = adbreak;
383
+ }
384
+ } else if (ad.startTimeInSeconds < currentTime &&
385
+ ad.startTimeInSeconds >
386
+ (previousAd.startTimeInSeconds + previousAd.durationInSeconds)) {
387
+ previousAd = ad;
388
+ previousAdBreak = adbreak;
389
+ break;
390
+ }
391
+ }
392
+ }
393
+
394
+ // The cue point gets marked as 'played' as soon as the playhead hits it
395
+ // (at the start of an ad), so when we come back to this method as a result
396
+ // of seeking back to the user-selected time, the 'played' flag will be set.
397
+ if (previousAdBreak && previousAd &&
398
+ !this.playedAds_.includes(previousAd.adId)) {
399
+ shaka.log.info('Seeking back to the start of the ad break at ' +
400
+ previousAdBreak.startTimeInSeconds +
401
+ ' and will return to ' + currentTime);
402
+ this.snapForwardTime_ = currentTime;
403
+ this.video_.currentTime = previousAdBreak.startTimeInSeconds;
404
+ }
405
+ }
406
+
407
+ /**
408
+ * @private
409
+ */
410
+ onAdBreakEnded_() {
411
+ const currentTime = this.video_.currentTime;
412
+ // If the ad break was a result of snapping back (a user seeked over
413
+ // an ad break and was returned to it), seek forward to the point,
414
+ // originally chosen by the user.
415
+ if (this.snapForwardTime_ && this.snapForwardTime_ > currentTime) {
416
+ this.video_.currentTime = this.snapForwardTime_;
417
+ }
418
+ this.snapForwardTime_ = null;
419
+ }
420
+
421
+ /**
422
+ * @private
423
+ */
424
+ onTimeupdate_() {
425
+ if (!this.video_.duration) {
426
+ // Can't play yet. Ignore.
427
+ return;
428
+ }
429
+ if (!this.ad_ && !this.adBreaks_.length) {
430
+ // No ads
431
+ return;
432
+ }
433
+ const currentTime = this.video_.currentTime;
434
+ let previousAd = false;
435
+ if (this.ad_) {
436
+ previousAd = true;
437
+ goog.asserts.assert(this.mediaTailorAd_, 'Ad should be defined');
438
+ this.sendInProgressEvents_(currentTime, this.mediaTailorAd_);
439
+ const remainingTime = this.ad_.getRemainingTime();
440
+ const duration = this.ad_.getDuration();
441
+ if (duration > 0 && (remainingTime <= 0 || remainingTime > duration)) {
442
+ this.onEnded_();
443
+ }
444
+ }
445
+ if (!this.ad_ || !this.ad_.isLinear()) {
446
+ this.checkLinearAds_(currentTime);
447
+ if (!this.ad_) {
448
+ this.checkNonLinearAds_(currentTime);
449
+ }
450
+ if (previousAd && !this.ad_) {
451
+ this.onAdBreakEnded_();
452
+ }
453
+ }
454
+ }
455
+
456
+ /**
457
+ * @param {number} currentTime
458
+ * @param {mediaTailor.Ad} ad
459
+ * @private
460
+ */
461
+ sendInProgressEvents_(currentTime, ad) {
462
+ const MediaTailorAdManager = shaka.ads.MediaTailorAdManager;
463
+ const firstQuartileTime = ad.startTimeInSeconds +
464
+ 0.25 * ad.durationInSeconds;
465
+ const midpointTime = ad.startTimeInSeconds +
466
+ 0.5 * ad.durationInSeconds;
467
+ const thirdQuartileTime = ad.startTimeInSeconds +
468
+ 0.75 * ad.durationInSeconds;
469
+ if (currentTime >= firstQuartileTime &&
470
+ !this.eventsSent.includes(MediaTailorAdManager.FIRSTQUARTILE_)) {
471
+ this.eventsSent.push(MediaTailorAdManager.FIRSTQUARTILE_);
472
+ this.sendTrackingEvent_(MediaTailorAdManager.FIRSTQUARTILE_);
473
+ } else if (currentTime >= midpointTime &&
474
+ !this.eventsSent.includes(MediaTailorAdManager.MIDPOINT_)) {
475
+ this.eventsSent.push(MediaTailorAdManager.MIDPOINT_);
476
+ this.sendTrackingEvent_(MediaTailorAdManager.MIDPOINT_);
477
+ } else if (currentTime >= thirdQuartileTime &&
478
+ !this.eventsSent.includes(MediaTailorAdManager.THIRDQUARTILE_)) {
479
+ this.eventsSent.push(MediaTailorAdManager.THIRDQUARTILE_);
480
+ this.sendTrackingEvent_(MediaTailorAdManager.THIRDQUARTILE_);
481
+ }
482
+ }
483
+
484
+ /**
485
+ * @param {number} currentTime
486
+ * @private
487
+ */
488
+ checkLinearAds_(currentTime) {
489
+ const MediaTailorAdManager = shaka.ads.MediaTailorAdManager;
490
+ for (const adbreak of this.adBreaks_) {
491
+ if (this.ad_ && this.ad_.isLinear()) {
492
+ break;
493
+ }
494
+ for (let i = 0; i < adbreak.ads.length; i++) {
495
+ const ad = adbreak.ads[i];
496
+ const startTime = ad.startTimeInSeconds;
497
+ const endTime = ad.startTimeInSeconds + ad.durationInSeconds;
498
+ if (startTime <= currentTime && endTime > currentTime) {
499
+ if (this.playedAds_.includes(ad.adId)) {
500
+ if (this.video_.ended) {
501
+ continue;
502
+ }
503
+ this.video_.currentTime = endTime;
504
+ return;
505
+ }
506
+ this.onEnded_();
507
+ this.mediaTailorAdBreak_ = adbreak;
508
+ this.ad_ = new shaka.ads.MediaTailorAd(
509
+ ad,
510
+ /* adPosition= */ i + 1,
511
+ /* totalAds= */ adbreak.ads.length,
512
+ /* isLinear= */ true,
513
+ this.video_);
514
+ this.mediaTailorAd_ = ad;
515
+ if (i === 0) {
516
+ this.sendTrackingEvent_(MediaTailorAdManager.BREAKSTART_);
517
+ }
518
+ this.setupCurrentAdListeners_();
519
+ break;
520
+ }
521
+ }
522
+ }
523
+ }
524
+
525
+ /**
526
+ * @param {number} currentTime
527
+ * @private
528
+ */
529
+ checkNonLinearAds_(currentTime) {
530
+ const MediaTailorAdManager = shaka.ads.MediaTailorAdManager;
531
+ for (const adbreak of this.adBreaks_) {
532
+ if (this.ad_) {
533
+ break;
534
+ }
535
+ for (let i = 0; i < adbreak.nonLinearAdsList.length; i++) {
536
+ const ad = adbreak.nonLinearAdsList[i];
537
+ if (!ad.nonLinearAdList.length) {
538
+ continue;
539
+ }
540
+ const startTime = adbreak.startTimeInSeconds;
541
+ const cacheKey = this.getCacheKeyForNonLinear_(ad.nonLinearAdList[0]);
542
+ const staticResource = this.staticResources_.get(cacheKey);
543
+ if (startTime <= currentTime &&
544
+ staticResource && staticResource.length) {
545
+ this.onEnded_();
546
+ this.displayNonLinearAd_(staticResource);
547
+ this.mediaTailorAdBreak_ = adbreak;
548
+ this.ad_ = new shaka.ads.MediaTailorAd(
549
+ ad,
550
+ /* adPosition= */ i + 1,
551
+ /* totalAds= */ adbreak.ads.length,
552
+ /* isLinear= */ false,
553
+ this.video_);
554
+ this.mediaTailorAd_ = ad;
555
+ if (i === 0) {
556
+ this.sendTrackingEvent_(MediaTailorAdManager.BREAKSTART_);
557
+ }
558
+ this.setupCurrentAdListeners_();
559
+ break;
560
+ }
561
+ }
562
+ }
563
+ }
564
+
565
+ /**
566
+ * @param {!Array.<mediaTailorExternalResource.App>} apps
567
+ * @private
568
+ */
569
+ displayNonLinearAd_(apps) {
570
+ for (const app of apps) {
571
+ if (!app.data.source.length) {
572
+ continue;
573
+ }
574
+ const imageElement = document.createElement('img');
575
+ imageElement.setAttribute('src', app.data.source[0].url);
576
+ imageElement.style.top = (app.placeholder.top || 0) + '%';
577
+ imageElement.style.height = (100 - (app.placeholder.top || 0)) + '%';
578
+ imageElement.style.left = (app.placeholder.left || 0) + '%';
579
+ imageElement.style.maxWidth = (100 - (app.placeholder.left || 0)) + '%';
580
+ imageElement.style.objectFit = 'contain';
581
+ imageElement.style.position = 'absolute';
582
+ this.adContainer_.appendChild(imageElement);
583
+ }
584
+ }
585
+
586
+ /**
587
+ * @private
588
+ */
589
+ onEnded_() {
590
+ if (this.ad_) {
591
+ // Remove all child nodes
592
+ while (this.adContainer_.lastChild) {
593
+ this.adContainer_.removeChild(this.adContainer_.firstChild);
594
+ }
595
+ if (!this.isLive_) {
596
+ this.playedAds_.push(this.mediaTailorAd_.adId);
597
+ }
598
+ this.removeCurrentAdListeners_();
599
+ const position = this.ad_.getPositionInSequence();
600
+ const totalAdsInBreak = this.ad_.getSequenceLength();
601
+ if (position === totalAdsInBreak) {
602
+ this.sendTrackingEvent_(shaka.ads.MediaTailorAdManager.BREAKEND_);
603
+ }
604
+ this.ad_ = null;
605
+ this.mediaTailorAd_ = null;
606
+ this.mediaTailorAdBreak_ = null;
607
+ }
608
+ }
609
+
610
+ /**
611
+ * @private
612
+ */
613
+ setupCurrentAdListeners_() {
614
+ const MediaTailorAdManager = shaka.ads.MediaTailorAdManager;
615
+ let needFirstEvents = false;
616
+ if (!this.video_.paused) {
617
+ this.sendTrackingEvent_(MediaTailorAdManager.IMPRESSION_);
618
+ this.sendTrackingEvent_(MediaTailorAdManager.START_);
619
+ } else {
620
+ needFirstEvents = true;
621
+ }
622
+ this.adListeners_.push({
623
+ target: this.video_,
624
+ type: 'volumechange',
625
+ listener: () => {
626
+ if (this.video_.muted) {
627
+ this.sendTrackingEvent_(MediaTailorAdManager.MUTE_);
628
+ }
629
+ },
630
+ });
631
+ this.adListeners_.push({
632
+ target: this.video_,
633
+ type: 'volumechange',
634
+ listener: () => {
635
+ if (!this.video_.muted) {
636
+ this.sendTrackingEvent_(MediaTailorAdManager.UNMUTE_);
637
+ }
638
+ },
639
+ });
640
+ this.adListeners_.push({
641
+ target: this.video_,
642
+ type: 'play',
643
+ listener: () => {
644
+ if (needFirstEvents) {
645
+ this.sendTrackingEvent_(MediaTailorAdManager.IMPRESSION_);
646
+ this.sendTrackingEvent_(MediaTailorAdManager.START_);
647
+ needFirstEvents = false;
648
+ } else {
649
+ this.sendTrackingEvent_(MediaTailorAdManager.RESUME_);
650
+ }
651
+ },
652
+ });
653
+ this.adListeners_.push({
654
+ target: this.video_,
655
+ type: 'pause',
656
+ listener: () => {
657
+ this.sendTrackingEvent_(MediaTailorAdManager.PAUSE_);
658
+ },
659
+ });
660
+ for (const listener of this.adListeners_) {
661
+ this.eventManager_.listen(
662
+ listener.target, listener.type, listener.listener);
663
+ }
664
+ }
665
+
666
+ /**
667
+ * @private
668
+ */
669
+ removeCurrentAdListeners_() {
670
+ this.sendTrackingEvent_(shaka.ads.MediaTailorAdManager.COMPLETE_);
671
+ for (const listener of this.adListeners_) {
672
+ this.eventManager_.unlisten(
673
+ listener.target, listener.type, listener.listener);
674
+ }
675
+ this.adListeners_ = [];
676
+ this.eventsSent = [];
677
+ }
678
+
679
+ /**
680
+ * @param {string} eventType
681
+ * @private
682
+ */
683
+ sendTrackingEvent_(eventType) {
684
+ let trackingEvent = this.mediaTailorAd_.trackingEvents.find(
685
+ (event) => event.eventType == eventType);
686
+ if (!trackingEvent) {
687
+ trackingEvent = this.mediaTailorAdBreak_.adBreakTrackingEvents.find(
688
+ (event) => event.eventType == eventType);
689
+ }
690
+ if (trackingEvent) {
691
+ const type = shaka.net.NetworkingEngine.RequestType.ADS;
692
+ for (const beaconUrl of trackingEvent.beaconUrls) {
693
+ if (!beaconUrl || beaconUrl == '') {
694
+ continue;
695
+ }
696
+ const request = shaka.net.NetworkingEngine.makeRequest(
697
+ [beaconUrl],
698
+ shaka.net.NetworkingEngine.defaultRetryParameters());
699
+ request.method = 'POST';
700
+ this.networkingEngine_.request(type, request);
701
+ }
702
+ }
703
+ switch (eventType) {
704
+ case shaka.ads.MediaTailorAdManager.IMPRESSION_:
705
+ this.onEvent_(
706
+ new shaka.util.FakeEvent(shaka.ads.AdManager.AD_IMPRESSION));
707
+ break;
708
+ case shaka.ads.MediaTailorAdManager.START_:
709
+ this.onEvent_(
710
+ new shaka.util.FakeEvent(shaka.ads.AdManager.AD_STARTED,
711
+ (new Map()).set('ad', this.ad_)));
712
+ break;
713
+ case shaka.ads.MediaTailorAdManager.MUTE_:
714
+ this.onEvent_(
715
+ new shaka.util.FakeEvent(shaka.ads.AdManager.AD_MUTED));
716
+ break;
717
+ case shaka.ads.MediaTailorAdManager.UNMUTE_:
718
+ this.onEvent_(
719
+ new shaka.util.FakeEvent(shaka.ads.AdManager.AD_VOLUME_CHANGED));
720
+ break;
721
+ case shaka.ads.MediaTailorAdManager.RESUME_:
722
+ this.onEvent_(
723
+ new shaka.util.FakeEvent(shaka.ads.AdManager.AD_RESUMED));
724
+ break;
725
+ case shaka.ads.MediaTailorAdManager.PAUSE_:
726
+ this.onEvent_(
727
+ new shaka.util.FakeEvent(shaka.ads.AdManager.AD_PAUSED));
728
+ break;
729
+ case shaka.ads.MediaTailorAdManager.FIRSTQUARTILE_:
730
+ this.onEvent_(
731
+ new shaka.util.FakeEvent(shaka.ads.AdManager.AD_FIRST_QUARTILE));
732
+ break;
733
+ case shaka.ads.MediaTailorAdManager.MIDPOINT_:
734
+ this.onEvent_(
735
+ new shaka.util.FakeEvent(shaka.ads.AdManager.AD_MIDPOINT));
736
+ break;
737
+ case shaka.ads.MediaTailorAdManager.THIRDQUARTILE_:
738
+ this.onEvent_(
739
+ new shaka.util.FakeEvent(shaka.ads.AdManager.AD_THIRD_QUARTILE));
740
+ break;
741
+ case shaka.ads.MediaTailorAdManager.COMPLETE_:
742
+ this.onEvent_(
743
+ new shaka.util.FakeEvent(shaka.ads.AdManager.AD_COMPLETE));
744
+ this.onEvent_(
745
+ new shaka.util.FakeEvent(shaka.ads.AdManager.AD_STOPPED));
746
+ break;
747
+ case shaka.ads.MediaTailorAdManager.BREAKSTART_:
748
+ this.adContainer_.setAttribute('ad-active', 'true');
749
+ break;
750
+ case shaka.ads.MediaTailorAdManager.BREAKEND_:
751
+ this.adContainer_.removeAttribute('ad-active');
752
+ break;
753
+ }
754
+ }
755
+ };
756
+
757
+
758
+ /**
759
+ * @const {string}
760
+ * @private
761
+ */
762
+ shaka.ads.MediaTailorAdManager.IMPRESSION_ = 'impression';
763
+
764
+
765
+ /**
766
+ * @const {string}
767
+ * @private
768
+ */
769
+ shaka.ads.MediaTailorAdManager.START_ = 'start';
770
+
771
+
772
+ /**
773
+ * @const {string}
774
+ * @private
775
+ */
776
+ shaka.ads.MediaTailorAdManager.MUTE_ = 'mute';
777
+
778
+
779
+ /**
780
+ * @const {string}
781
+ * @private
782
+ */
783
+ shaka.ads.MediaTailorAdManager.UNMUTE_ = 'unmute';
784
+
785
+
786
+ /**
787
+ * @const {string}
788
+ * @private
789
+ */
790
+ shaka.ads.MediaTailorAdManager.RESUME_ = 'resume';
791
+
792
+
793
+ /**
794
+ * @const {string}
795
+ * @private
796
+ */
797
+ shaka.ads.MediaTailorAdManager.PAUSE_ = 'pause';
798
+
799
+
800
+ /**
801
+ * @const {string}
802
+ * @private
803
+ */
804
+ shaka.ads.MediaTailorAdManager.FIRSTQUARTILE_ = 'firstQuartile';
805
+
806
+
807
+ /**
808
+ * @const {string}
809
+ * @private
810
+ */
811
+ shaka.ads.MediaTailorAdManager.MIDPOINT_ = 'midpoint';
812
+
813
+
814
+ /**
815
+ * @const {string}
816
+ * @private
817
+ */
818
+ shaka.ads.MediaTailorAdManager.THIRDQUARTILE_ = 'thirdQuartile';
819
+
820
+
821
+ /**
822
+ * @const {string}
823
+ * @private
824
+ */
825
+ shaka.ads.MediaTailorAdManager.COMPLETE_ = 'complete';
826
+
827
+
828
+ /**
829
+ * @const {string}
830
+ * @private
831
+ */
832
+ shaka.ads.MediaTailorAdManager.BREAKSTART_ = 'breakStart';
833
+
834
+
835
+ /**
836
+ * @const {string}
837
+ * @private
838
+ */
839
+ shaka.ads.MediaTailorAdManager.BREAKEND_ = 'breakEnd';