shaka-player 3.0.11 → 3.0.15
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.
- package/AUTHORS +5 -0
- package/CHANGELOG.md +132 -0
- package/CONTRIBUTORS +5 -0
- package/README.md +3 -0
- package/build/apps.py +2 -2
- package/build/check.py +2 -2
- package/build/conformance.textproto +0 -9
- package/build/generateExterns.js +1 -1
- package/build/shakaBuildHelpers.py +6 -5
- package/build/subprocessWindowsPatch.py +103 -0
- package/demo/common/assets.js +1 -1
- package/demo/common/message_ids.js +1 -0
- package/demo/config.js +2 -1
- package/demo/demo.less +4 -0
- package/demo/demo_utils.js +1 -0
- package/demo/input_container.js +2 -1
- package/demo/locales/en.json +1 -0
- package/demo/locales/source.json +4 -0
- package/dist/controls.css +2 -2
- package/dist/controls.css.map +1 -1
- package/dist/demo.compiled.debug.js +63 -60
- package/dist/demo.compiled.debug.map +3 -3
- package/dist/demo.compiled.js +63 -60
- package/dist/demo.compiled.map +3 -3
- package/dist/demo.css +1 -1
- package/dist/demo.css.map +1 -1
- package/dist/deps.js +9 -9
- package/dist/locales.js +35 -33
- package/dist/receiver.compiled.debug.js +59 -56
- package/dist/receiver.compiled.debug.map +3 -3
- package/dist/receiver.compiled.js +59 -56
- package/dist/receiver.compiled.map +3 -3
- package/dist/shaka-player.compiled.d.ts +131 -5
- package/dist/shaka-player.compiled.debug.d.ts +131 -5
- package/dist/shaka-player.compiled.debug.externs.js +142 -8
- package/dist/shaka-player.compiled.debug.js +330 -312
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +142 -8
- package/dist/shaka-player.compiled.js +707 -702
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +131 -5
- package/dist/shaka-player.ui.debug.d.ts +131 -5
- package/dist/shaka-player.ui.debug.externs.js +144 -10
- package/dist/shaka-player.ui.debug.js +354 -333
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +144 -10
- package/dist/shaka-player.ui.js +860 -855
- package/dist/shaka-player.ui.map +4 -4
- package/docs/tutorials/fairplay.md +1 -1
- package/docs/tutorials/faq.md +25 -0
- package/externs/aria.js +18 -0
- package/externs/ima.js +4 -0
- package/externs/shaka/ads.js +2 -0
- package/karma.conf.js +1 -0
- package/lib/ads/ad_manager.js +29 -11
- package/lib/ads/client_side_ad_manager.js +76 -86
- package/lib/ads/server_side_ad_manager.js +26 -11
- package/lib/cast/cast_proxy.js +3 -2
- package/lib/cast/cast_receiver.js +6 -2
- package/lib/cast/cast_sender.js +2 -2
- package/lib/dash/dash_parser.js +63 -1
- package/lib/dash/segment_list.js +1 -1
- package/lib/dash/segment_template.js +41 -14
- package/lib/hls/hls_parser.js +41 -11
- package/lib/media/content_workarounds.js +18 -0
- package/lib/media/drm_engine.js +8 -0
- package/lib/media/gap_jumping_controller.js +8 -4
- package/lib/media/media_source_engine.js +7 -0
- package/lib/media/playhead.js +1 -1
- package/lib/media/presentation_timeline.js +3 -2
- package/lib/media/segment_index.js +41 -11
- package/lib/media/streaming_engine.js +34 -21
- package/lib/net/networking_engine.js +2 -1
- package/lib/offline/download_manager.js +1 -2
- package/lib/player.js +99 -44
- package/lib/polyfill/encryption_scheme.js +2 -0
- package/lib/polyfill/fullscreen.js +2 -0
- package/lib/polyfill/mathround.js +2 -0
- package/lib/polyfill/mediasource.js +2 -0
- package/lib/polyfill/patchedmediakeys_apple.js +6 -4
- package/lib/polyfill/patchedmediakeys_ms.js +6 -4
- package/lib/polyfill/patchedmediakeys_nop.js +2 -0
- package/lib/polyfill/patchedmediakeys_webkit.js +6 -4
- package/lib/polyfill/pip_webkit.js +2 -0
- package/lib/polyfill/video_play_promise.js +2 -0
- package/lib/polyfill/videoplaybackquality.js +2 -0
- package/lib/polyfill/vttcue.js +2 -0
- package/lib/text/mp4_ttml_parser.js +3 -0
- package/lib/text/ttml_text_parser.js +5 -0
- package/lib/text/ui_text_displayer.js +37 -3
- package/lib/util/error.js +1 -4
- package/lib/util/fake_event.js +53 -7
- package/lib/util/mime_utils.js +33 -0
- package/lib/util/periods.js +25 -3
- package/lib/util/stream_utils.js +11 -0
- package/package.json +3 -3
- package/test/cast/cast_proxy_unit.js +12 -6
- package/test/cast/cast_receiver_integration.js +1 -1
- package/test/cast/cast_utils_unit.js +1 -1
- package/test/dash/dash_parser_manifest_unit.js +73 -0
- package/test/demo/demo_unit.js +0 -1
- package/test/hls/hls_parser_unit.js +45 -1
- package/test/media/drm_engine_unit.js +56 -0
- package/test/media/playhead_unit.js +27 -1
- package/test/media/presentation_timeline_unit.js +19 -0
- package/test/media/segment_index_unit.js +79 -6
- package/test/media/streaming_engine_unit.js +3 -3
- package/test/player_integration.js +38 -0
- package/test/player_unit.js +19 -1
- package/test/test/assets/3675/chunk-stream0-00001.m4s +0 -0
- package/test/test/assets/3675/chunk-stream0-00002.m4s +0 -0
- package/test/test/assets/3675/chunk-stream0-00003.m4s +0 -0
- package/test/test/assets/3675/chunk-stream0-00004.m4s +0 -0
- package/test/test/assets/3675/chunk-stream0-00005.m4s +0 -0
- package/test/test/assets/3675/chunk-stream0-00006.m4s +0 -0
- package/test/test/assets/3675/chunk-stream0-00007.m4s +0 -0
- package/test/test/assets/3675/dash_0.mpd +30 -0
- package/test/test/assets/3675/dash_1.mpd +30 -0
- package/test/test/assets/3675/dash_2.mpd +30 -0
- package/test/test/assets/3675/dash_3.mpd +30 -0
- package/test/test/assets/3675/dash_4.mpd +30 -0
- package/test/test/assets/3675/dash_5.mpd +26 -0
- package/test/test/assets/3675/init-stream0.m4s +0 -0
- package/test/test/util/fake_ad_manager.js +4 -1
- package/test/test/util/fake_media_source_engine.js +4 -0
- package/test/test/util/simple_fakes.js +5 -3
- package/test/test/util/waiter.js +36 -2
- package/test/text/ttml_text_parser_unit.js +9 -0
- package/test/text/ui_text_displayer_unit.js +19 -3
- package/test/ui/localization_unit.js +15 -14
- package/test/ui/ui_unit.js +4 -0
- package/ui/big_play_button.js +10 -0
- package/ui/cast_button.js +2 -3
- package/ui/controls.js +9 -7
- package/ui/less/containers.less +3 -0
- package/ui/locales/en.json +1 -0
- package/ui/locales/ru.json +6 -6
- package/ui/locales/source.json +4 -0
- package/ui/localization.js +28 -51
- package/ui/pip_button.js +2 -3
- package/ui/play_button.js +10 -10
- package/ui/small_play_button.js +12 -0
|
@@ -31,7 +31,7 @@ player.configure('drm.initDataTransform', (initData, initDataType) => {
|
|
|
31
31
|
|
|
32
32
|
// 'initData' is a buffer containing an 'skd://' URL as a UTF-8 string.
|
|
33
33
|
const skdUri = shaka.util.StringUtils.fromBytesAutoDetect(initData);
|
|
34
|
-
const contentId = getMyContentId(
|
|
34
|
+
const contentId = getMyContentId(skdUri);
|
|
35
35
|
const cert = player.drmInfo().serverCertificate;
|
|
36
36
|
return shaka.util.FairPlayUtils.initDataTransform(initData, contentId, cert);
|
|
37
37
|
});
|
package/docs/tutorials/faq.md
CHANGED
|
@@ -35,6 +35,17 @@ headers in the response. Additionally, with some manifests, we will send a
|
|
|
35
35
|
This can also happen with mixed-content restrictions. If the site is using
|
|
36
36
|
`https:`, then your manifest and segments must also.
|
|
37
37
|
|
|
38
|
+
*Sending `Range` header at the start of HLS playback can be disabled using this config:*
|
|
39
|
+
```
|
|
40
|
+
player.configure({
|
|
41
|
+
manifest: {
|
|
42
|
+
hls: {
|
|
43
|
+
useFullSegmentsForStartTime: true,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
})
|
|
47
|
+
```
|
|
48
|
+
|
|
38
49
|
<hr>
|
|
39
50
|
|
|
40
51
|
**Q:** I am getting `REQUESTED_KEY_SYSTEM_CONFIG_UNAVAILABLE` or error code
|
|
@@ -238,6 +249,20 @@ the [`.manifest.disableVideo`][ManifestConfiguration] or
|
|
|
238
249
|
[`.manifest.disableAudio`][ManifestConfiguration] configurations to signal that
|
|
239
250
|
your content does not have a video or audio stream.
|
|
240
251
|
|
|
252
|
+
<hr>
|
|
253
|
+
|
|
254
|
+
**Q:** How can I make Shaka Player work with Vue?
|
|
255
|
+
|
|
256
|
+
**A:** Currently, Shaka Player does not support being made into a Vue reactive
|
|
257
|
+
object. When Vue wraps an object in a reactive Proxy, it
|
|
258
|
+
{@link https://v3.vuejs.org/guide/reactivity.html#proxied-objects|also wraps
|
|
259
|
+
nested objects}. This results in Vue converting some of our internal values into
|
|
260
|
+
Proxy objects, which causes failures at load-time.
|
|
261
|
+
If you want to use Shaka Player in Vue, avoid making it into a reactive object;
|
|
262
|
+
so don't declare it using a ref(), and if you put your player instance into a
|
|
263
|
+
data() object, you can prefix the property name with "$" or "_" to make Vue not
|
|
264
|
+
proxy them.
|
|
265
|
+
|
|
241
266
|
[386]: https://github.com/google/shaka-player/issues/386#issuecomment-227898001
|
|
242
267
|
[489]: https://github.com/google/shaka-player/issues/489#issuecomment-240466224
|
|
243
268
|
[743]: https://github.com/google/shaka-player/issues/743
|
package/externs/aria.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/*! @license
|
|
2
|
+
* Shaka Player
|
|
3
|
+
* Copyright 2016 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @fileoverview Externs for ARIA properties which are missing from the Closure
|
|
9
|
+
* compiler.
|
|
10
|
+
*
|
|
11
|
+
* @externs
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/** @type {string} */
|
|
15
|
+
Element.prototype.ariaLabel;
|
|
16
|
+
|
|
17
|
+
/** @type {string} */
|
|
18
|
+
Element.prototype.ariaPressed;
|
package/externs/ima.js
CHANGED
package/externs/shaka/ads.js
CHANGED
package/karma.conf.js
CHANGED
|
@@ -136,6 +136,7 @@ module.exports = (config) => {
|
|
|
136
136
|
included: false,
|
|
137
137
|
},
|
|
138
138
|
{pattern: 'test/test/assets/*', included: false},
|
|
139
|
+
{pattern: 'test/test/assets/3675/*', included: false},
|
|
139
140
|
{pattern: 'dist/shaka-player.ui.js', included: false},
|
|
140
141
|
{pattern: 'dist/locales.js', included: false},
|
|
141
142
|
{pattern: 'demo/locales/en.json', included: false},
|
package/lib/ads/ad_manager.js
CHANGED
|
@@ -16,6 +16,7 @@ goog.require('shaka.log');
|
|
|
16
16
|
goog.require('shaka.util.Error');
|
|
17
17
|
goog.require('shaka.util.FakeEvent');
|
|
18
18
|
goog.require('shaka.util.FakeEventTarget');
|
|
19
|
+
goog.require('shaka.util.IReleasable');
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
/**
|
|
@@ -359,6 +360,7 @@ goog.require('shaka.util.FakeEventTarget');
|
|
|
359
360
|
/**
|
|
360
361
|
* A class responsible for ad-related interactions.
|
|
361
362
|
* @implements {shaka.extern.IAdManager}
|
|
363
|
+
* @implements {shaka.util.IReleasable}
|
|
362
364
|
* @export
|
|
363
365
|
*/
|
|
364
366
|
shaka.ads.AdManager = class extends shaka.util.FakeEventTarget {
|
|
@@ -403,6 +405,10 @@ shaka.ads.AdManager = class extends shaka.util.FakeEventTarget {
|
|
|
403
405
|
shaka.util.Error.Code.CS_IMA_SDK_MISSING);
|
|
404
406
|
}
|
|
405
407
|
|
|
408
|
+
if (this.csAdManager_) {
|
|
409
|
+
this.csAdManager_.release();
|
|
410
|
+
}
|
|
411
|
+
|
|
406
412
|
this.csAdManager_ = new shaka.ads.ClientSideAdManager(
|
|
407
413
|
adContainer, video, this.locale_,
|
|
408
414
|
(e) => {
|
|
@@ -430,6 +436,22 @@ shaka.ads.AdManager = class extends shaka.util.FakeEventTarget {
|
|
|
430
436
|
}
|
|
431
437
|
|
|
432
438
|
|
|
439
|
+
/**
|
|
440
|
+
* @override
|
|
441
|
+
* @export
|
|
442
|
+
*/
|
|
443
|
+
release() {
|
|
444
|
+
if (this.csAdManager_) {
|
|
445
|
+
this.csAdManager_.release();
|
|
446
|
+
this.csAdManager_ = null;
|
|
447
|
+
}
|
|
448
|
+
if (this.ssAdManager_) {
|
|
449
|
+
this.ssAdManager_.release();
|
|
450
|
+
this.ssAdManager_ = null;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
|
|
433
455
|
/**
|
|
434
456
|
* @override
|
|
435
457
|
* @export
|
|
@@ -438,21 +460,13 @@ shaka.ads.AdManager = class extends shaka.util.FakeEventTarget {
|
|
|
438
460
|
if (this.csAdManager_) {
|
|
439
461
|
this.csAdManager_.stop();
|
|
440
462
|
}
|
|
463
|
+
if (this.ssAdManager_) {
|
|
464
|
+
this.ssAdManager_.stop();
|
|
465
|
+
}
|
|
441
466
|
|
|
442
467
|
this.dispatchEvent(
|
|
443
468
|
new shaka.util.FakeEvent(shaka.ads.AdManager.AD_STOPPED));
|
|
444
469
|
|
|
445
|
-
// TODO:
|
|
446
|
-
// For SS DAI streams, if a different asset gets unloaded as
|
|
447
|
-
// part of the process
|
|
448
|
-
// of loading a DAI asset, stream manager state gets reset and we
|
|
449
|
-
// don't get any ad events.
|
|
450
|
-
// We need to figure out if it makes sense to stop the SS
|
|
451
|
-
// manager on unload, and, if it does, find
|
|
452
|
-
// a way to do it safely.
|
|
453
|
-
// if (this.ssAdManager_) {
|
|
454
|
-
// this.ssAdManager_.stop();
|
|
455
|
-
// }
|
|
456
470
|
this.stats_ = new shaka.ads.AdsStats();
|
|
457
471
|
}
|
|
458
472
|
|
|
@@ -491,6 +505,10 @@ shaka.ads.AdManager = class extends shaka.util.FakeEventTarget {
|
|
|
491
505
|
shaka.util.Error.Code.SS_IMA_SDK_MISSING);
|
|
492
506
|
}
|
|
493
507
|
|
|
508
|
+
if (this.ssAdManager_) {
|
|
509
|
+
this.ssAdManager_.release();
|
|
510
|
+
}
|
|
511
|
+
|
|
494
512
|
this.ssAdManager_ = new shaka.ads.ServerSideAdManager(
|
|
495
513
|
adContainer, video, this.locale_,
|
|
496
514
|
(e) => {
|
|
@@ -13,10 +13,12 @@ goog.provide('shaka.ads.ClientSideAdManager');
|
|
|
13
13
|
|
|
14
14
|
goog.require('goog.asserts');
|
|
15
15
|
goog.require('shaka.ads.ClientSideAd');
|
|
16
|
+
goog.require('shaka.util.IReleasable');
|
|
16
17
|
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* A class responsible for client-side ad interactions.
|
|
21
|
+
* @implements {shaka.util.IReleasable}
|
|
20
22
|
*/
|
|
21
23
|
shaka.ads.ClientSideAdManager = class {
|
|
22
24
|
/**
|
|
@@ -32,6 +34,9 @@ shaka.ads.ClientSideAdManager = class {
|
|
|
32
34
|
/** @private {HTMLMediaElement} */
|
|
33
35
|
this.video_ = video;
|
|
34
36
|
|
|
37
|
+
/** @private {ResizeObserver} */
|
|
38
|
+
this.resizeObserver_ = null;
|
|
39
|
+
|
|
35
40
|
/** @private {number} */
|
|
36
41
|
this.requestAdsStartTime_ = NaN;
|
|
37
42
|
|
|
@@ -106,6 +111,21 @@ shaka.ads.ClientSideAdManager = class {
|
|
|
106
111
|
}
|
|
107
112
|
}
|
|
108
113
|
|
|
114
|
+
/** @override */
|
|
115
|
+
release() {
|
|
116
|
+
this.stop();
|
|
117
|
+
if (this.resizeObserver_) {
|
|
118
|
+
this.resizeObserver_.disconnect();
|
|
119
|
+
}
|
|
120
|
+
if (this.eventManager_) {
|
|
121
|
+
this.eventManager_.release();
|
|
122
|
+
}
|
|
123
|
+
if (this.imaAdsManager_) {
|
|
124
|
+
this.imaAdsManager_.destroy();
|
|
125
|
+
}
|
|
126
|
+
this.adsLoader_.destroy();
|
|
127
|
+
}
|
|
128
|
+
|
|
109
129
|
/**
|
|
110
130
|
* @param {!google.ima.AdErrorEvent} e
|
|
111
131
|
* @private
|
|
@@ -118,7 +138,7 @@ shaka.ads.ClientSideAdManager = class {
|
|
|
118
138
|
// Remove ad breaks from the timeline
|
|
119
139
|
this.onEvent_(
|
|
120
140
|
new shaka.util.FakeEvent(shaka.ads.AdManager.CUEPOINTS_CHANGED,
|
|
121
|
-
|
|
141
|
+
(new Map()).set('cuepoints', [])));
|
|
122
142
|
}
|
|
123
143
|
|
|
124
144
|
|
|
@@ -131,17 +151,14 @@ shaka.ads.ClientSideAdManager = class {
|
|
|
131
151
|
|
|
132
152
|
const now = Date.now() / 1000;
|
|
133
153
|
const loadTime = now - this.requestAdsStartTime_;
|
|
134
|
-
this.onEvent_(
|
|
135
|
-
new
|
|
136
|
-
{'loadTime': loadTime}));
|
|
154
|
+
this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.ADS_LOADED,
|
|
155
|
+
(new Map()).set('loadTime', loadTime)));
|
|
137
156
|
|
|
138
157
|
this.imaAdsManager_ = e.getAdsManager(this.video_);
|
|
139
158
|
|
|
140
159
|
this.onEvent_(new shaka.util.FakeEvent(
|
|
141
160
|
shaka.ads.AdManager.IMA_AD_MANAGER_LOADED,
|
|
142
|
-
|
|
143
|
-
'imaAdManager': this.imaAdsManager_,
|
|
144
|
-
}));
|
|
161
|
+
(new Map()).set('imaAdManager', this.imaAdsManager_)));
|
|
145
162
|
|
|
146
163
|
const cuePointStarts = this.imaAdsManager_.getCuePoints();
|
|
147
164
|
if (cuePointStarts.length) {
|
|
@@ -152,9 +169,9 @@ shaka.ads.ClientSideAdManager = class {
|
|
|
152
169
|
cuePoints.push(shakaCuePoint);
|
|
153
170
|
}
|
|
154
171
|
|
|
155
|
-
this.onEvent_(
|
|
156
|
-
|
|
157
|
-
|
|
172
|
+
this.onEvent_(new shaka.util.FakeEvent(
|
|
173
|
+
shaka.ads.AdManager.CUEPOINTS_CHANGED,
|
|
174
|
+
(new Map()).set('cuepoints', cuePoints)));
|
|
158
175
|
}
|
|
159
176
|
|
|
160
177
|
this.addImaEventListeners_();
|
|
@@ -176,6 +193,16 @@ shaka.ads.ClientSideAdManager = class {
|
|
|
176
193
|
this.video_.offsetHeight, viewMode);
|
|
177
194
|
});
|
|
178
195
|
|
|
196
|
+
if ('ResizeObserver' in window) {
|
|
197
|
+
this.resizeObserver_ = new ResizeObserver(() => {
|
|
198
|
+
const viewMode = document.fullscreenElement ?
|
|
199
|
+
google.ima.ViewMode.FULLSCREEN : google.ima.ViewMode.NORMAL;
|
|
200
|
+
this.imaAdsManager_.resize(this.video_.offsetWidth,
|
|
201
|
+
this.video_.offsetHeight, viewMode);
|
|
202
|
+
});
|
|
203
|
+
this.resizeObserver_.observe(this.video_);
|
|
204
|
+
}
|
|
205
|
+
|
|
179
206
|
// Single video and overlay ads will start at this time
|
|
180
207
|
// TODO (ismena): Need a better inderstanding of what this does.
|
|
181
208
|
// The docs say it's called to 'start playing the ads,' but I haven't
|
|
@@ -194,6 +221,15 @@ shaka.ads.ClientSideAdManager = class {
|
|
|
194
221
|
* @private
|
|
195
222
|
*/
|
|
196
223
|
addImaEventListeners_() {
|
|
224
|
+
/**
|
|
225
|
+
* @param {!Event} e
|
|
226
|
+
* @param {string} type
|
|
227
|
+
*/
|
|
228
|
+
const convertEventAndSend = (e, type) => {
|
|
229
|
+
const data = (new Map()).set('originalEvent', e);
|
|
230
|
+
this.onEvent_(new shaka.util.FakeEvent(type, data));
|
|
231
|
+
};
|
|
232
|
+
|
|
197
233
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
198
234
|
google.ima.AdErrorEvent.Type.AD_ERROR, (error) => {
|
|
199
235
|
this.onAdError_(/** @type {!google.ima.AdErrorEvent} */ (error));
|
|
@@ -211,30 +247,22 @@ shaka.ads.ClientSideAdManager = class {
|
|
|
211
247
|
|
|
212
248
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
213
249
|
google.ima.AdEvent.Type.FIRST_QUARTILE, (e) => {
|
|
214
|
-
|
|
215
|
-
new shaka.util.FakeEvent(shaka.ads.AdManager.AD_FIRST_QUARTILE,
|
|
216
|
-
{'originalEvent': e}));
|
|
250
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_FIRST_QUARTILE);
|
|
217
251
|
});
|
|
218
252
|
|
|
219
253
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
220
254
|
google.ima.AdEvent.Type.MIDPOINT, (e) => {
|
|
221
|
-
|
|
222
|
-
new shaka.util.FakeEvent(shaka.ads.AdManager.AD_MIDPOINT,
|
|
223
|
-
{'originalEvent': e}));
|
|
255
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_MIDPOINT);
|
|
224
256
|
});
|
|
225
257
|
|
|
226
258
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
227
259
|
google.ima.AdEvent.Type.THIRD_QUARTILE, (e) => {
|
|
228
|
-
|
|
229
|
-
new shaka.util.FakeEvent(shaka.ads.AdManager.AD_THIRD_QUARTILE,
|
|
230
|
-
{'originalEvent': e}));
|
|
260
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_THIRD_QUARTILE);
|
|
231
261
|
});
|
|
232
262
|
|
|
233
263
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
234
264
|
google.ima.AdEvent.Type.COMPLETE, (e) => {
|
|
235
|
-
|
|
236
|
-
new shaka.util.FakeEvent(shaka.ads.AdManager.AD_COMPLETE,
|
|
237
|
-
{'originalEvent': e}));
|
|
265
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_COMPLETE);
|
|
238
266
|
});
|
|
239
267
|
|
|
240
268
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
@@ -249,140 +277,102 @@ shaka.ads.ClientSideAdManager = class {
|
|
|
249
277
|
|
|
250
278
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
251
279
|
google.ima.AdEvent.Type.SKIPPED, (e) => {
|
|
252
|
-
|
|
253
|
-
new shaka.util.FakeEvent(shaka.ads.AdManager.AD_SKIPPED,
|
|
254
|
-
{'originalEvent': e}));
|
|
280
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_SKIPPED);
|
|
255
281
|
});
|
|
256
282
|
|
|
257
283
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
258
284
|
google.ima.AdEvent.Type.VOLUME_CHANGED, (e) => {
|
|
259
|
-
|
|
260
|
-
new shaka.util.FakeEvent(shaka.ads.AdManager.AD_VOLUME_CHANGED,
|
|
261
|
-
{'originalEvent': e}));
|
|
285
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_VOLUME_CHANGED);
|
|
262
286
|
});
|
|
263
287
|
|
|
264
288
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
265
289
|
google.ima.AdEvent.Type.VOLUME_MUTED, (e) => {
|
|
266
|
-
|
|
267
|
-
new shaka.util.FakeEvent(shaka.ads.AdManager.AD_MUTED,
|
|
268
|
-
{'originalEvent': e}));
|
|
290
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_MUTED);
|
|
269
291
|
});
|
|
270
292
|
|
|
271
293
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
272
294
|
google.ima.AdEvent.Type.PAUSED, (e) => {
|
|
273
295
|
goog.asserts.assert(this.ad_ != null, 'Ad should not be null!');
|
|
274
296
|
this.ad_.setPaused(true);
|
|
275
|
-
|
|
276
|
-
new shaka.util.FakeEvent(shaka.ads.AdManager.AD_PAUSED,
|
|
277
|
-
{'originalEvent': e}));
|
|
297
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_PAUSED);
|
|
278
298
|
});
|
|
279
299
|
|
|
280
300
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
281
301
|
google.ima.AdEvent.Type.RESUMED, (e) => {
|
|
282
302
|
goog.asserts.assert(this.ad_ != null, 'Ad should not be null!');
|
|
283
303
|
this.ad_.setPaused(false);
|
|
284
|
-
|
|
285
|
-
new shaka.util.FakeEvent(shaka.ads.AdManager.AD_RESUMED,
|
|
286
|
-
{'originalEvent': e}));
|
|
304
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_RESUMED);
|
|
287
305
|
});
|
|
288
306
|
|
|
289
307
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
290
308
|
google.ima.AdEvent.Type.SKIPPABLE_STATE_CHANGED, (e) => {
|
|
291
309
|
goog.asserts.assert(this.ad_ != null, 'Ad should not be null!');
|
|
292
|
-
|
|
293
|
-
shaka.ads.AdManager.AD_SKIP_STATE_CHANGED,
|
|
294
|
-
{'originalEvent': e}));
|
|
310
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_SKIP_STATE_CHANGED);
|
|
295
311
|
});
|
|
296
312
|
|
|
297
313
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
298
314
|
google.ima.AdEvent.Type.CLICK, (e) => {
|
|
299
|
-
|
|
300
|
-
shaka.ads.AdManager.AD_CLICKED,
|
|
301
|
-
{'originalEvent': e}));
|
|
315
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_CLICKED);
|
|
302
316
|
});
|
|
303
317
|
|
|
304
318
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
305
319
|
google.ima.AdEvent.Type.AD_PROGRESS, (e) => {
|
|
306
|
-
|
|
307
|
-
shaka.ads.AdManager.AD_PROGRESS,
|
|
308
|
-
{'originalEvent': e}));
|
|
320
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_PROGRESS);
|
|
309
321
|
});
|
|
310
322
|
|
|
311
323
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
312
324
|
google.ima.AdEvent.Type.AD_BUFFERING, (e) => {
|
|
313
|
-
|
|
314
|
-
shaka.ads.AdManager.AD_BUFFERING,
|
|
315
|
-
{'originalEvent': e}));
|
|
325
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_BUFFERING);
|
|
316
326
|
});
|
|
317
327
|
|
|
318
328
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
319
329
|
google.ima.AdEvent.Type.IMPRESSION, (e) => {
|
|
320
|
-
|
|
321
|
-
shaka.ads.AdManager.AD_IMPRESSION,
|
|
322
|
-
{'originalEvent': e}));
|
|
330
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_IMPRESSION);
|
|
323
331
|
});
|
|
324
332
|
|
|
325
333
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
326
334
|
google.ima.AdEvent.Type.DURATION_CHANGE, (e) => {
|
|
327
|
-
|
|
328
|
-
shaka.ads.AdManager.AD_DURATION_CHANGED,
|
|
329
|
-
{'originalEvent': e}));
|
|
335
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_DURATION_CHANGED);
|
|
330
336
|
});
|
|
331
337
|
|
|
332
338
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
333
339
|
google.ima.AdEvent.Type.USER_CLOSE, (e) => {
|
|
334
|
-
|
|
335
|
-
shaka.ads.AdManager.AD_CLOSED,
|
|
336
|
-
{'originalEvent': e}));
|
|
340
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_CLOSED);
|
|
337
341
|
});
|
|
338
342
|
|
|
339
343
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
340
344
|
google.ima.AdEvent.Type.LOADED, (e) => {
|
|
341
|
-
|
|
342
|
-
shaka.ads.AdManager.AD_LOADED,
|
|
343
|
-
{'originalEvent': e}));
|
|
345
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_LOADED);
|
|
344
346
|
});
|
|
345
347
|
|
|
346
348
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
347
349
|
google.ima.AdEvent.Type.ALL_ADS_COMPLETED, (e) => {
|
|
348
|
-
|
|
349
|
-
shaka.ads.AdManager.ALL_ADS_COMPLETED,
|
|
350
|
-
{'originalEvent': e}));
|
|
350
|
+
convertEventAndSend(e, shaka.ads.AdManager.ALL_ADS_COMPLETED);
|
|
351
351
|
});
|
|
352
352
|
|
|
353
353
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
354
354
|
google.ima.AdEvent.Type.LINEAR_CHANGED, (e) => {
|
|
355
|
-
|
|
356
|
-
shaka.ads.AdManager.AD_LINEAR_CHANGED,
|
|
357
|
-
{'originalEvent': e}));
|
|
355
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_LINEAR_CHANGED);
|
|
358
356
|
});
|
|
359
357
|
|
|
360
358
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
361
359
|
google.ima.AdEvent.Type.AD_METADATA, (e) => {
|
|
362
|
-
|
|
363
|
-
shaka.ads.AdManager.AD_METADATA,
|
|
364
|
-
{'originalEvent': e}));
|
|
360
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_METADATA);
|
|
365
361
|
});
|
|
366
362
|
|
|
367
363
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
368
364
|
google.ima.AdEvent.Type.LOG, (e) => {
|
|
369
|
-
|
|
370
|
-
shaka.ads.AdManager.AD_RECOVERABLE_ERROR,
|
|
371
|
-
{'originalEvent': e}));
|
|
365
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_RECOVERABLE_ERROR);
|
|
372
366
|
});
|
|
373
367
|
|
|
374
368
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
375
369
|
google.ima.AdEvent.Type.AD_BREAK_READY, (e) => {
|
|
376
|
-
|
|
377
|
-
shaka.ads.AdManager.AD_BREAK_READY,
|
|
378
|
-
{'originalEvent': e}));
|
|
370
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_BREAK_READY);
|
|
379
371
|
});
|
|
380
372
|
|
|
381
373
|
this.eventManager_.listen(this.imaAdsManager_,
|
|
382
374
|
google.ima.AdEvent.Type.INTERACTION, (e) => {
|
|
383
|
-
|
|
384
|
-
shaka.ads.AdManager.AD_INTERACTION,
|
|
385
|
-
{'originalEvent': e}));
|
|
375
|
+
convertEventAndSend(e, shaka.ads.AdManager.AD_INTERACTION);
|
|
386
376
|
});
|
|
387
377
|
}
|
|
388
378
|
|
|
@@ -396,12 +386,12 @@ shaka.ads.ClientSideAdManager = class {
|
|
|
396
386
|
|
|
397
387
|
const imaAd = e.getAd();
|
|
398
388
|
this.ad_ = new shaka.ads.ClientSideAd(imaAd, this.imaAdsManager_);
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
389
|
+
const data = new Map()
|
|
390
|
+
.set('ad', this.ad_)
|
|
391
|
+
.set('sdkAdObject', imaAd)
|
|
392
|
+
.set('originalEvent', e);
|
|
393
|
+
this.onEvent_(new shaka.util.FakeEvent(
|
|
394
|
+
shaka.ads.AdManager.AD_STARTED, data));
|
|
405
395
|
this.adContainer_.setAttribute('ad-active', 'true');
|
|
406
396
|
this.video_.pause();
|
|
407
397
|
}
|
|
@@ -412,7 +402,7 @@ shaka.ads.ClientSideAdManager = class {
|
|
|
412
402
|
*/
|
|
413
403
|
onAdComplete_(e) {
|
|
414
404
|
this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.AD_STOPPED,
|
|
415
|
-
|
|
405
|
+
(new Map()).set('originalEvent', e)));
|
|
416
406
|
this.adContainer_.removeAttribute('ad-active');
|
|
417
407
|
this.video_.play();
|
|
418
408
|
}
|
|
@@ -14,10 +14,12 @@ goog.provide('shaka.ads.ServerSideAdManager');
|
|
|
14
14
|
goog.require('goog.asserts');
|
|
15
15
|
goog.require('shaka.ads.ServerSideAd');
|
|
16
16
|
goog.require('shaka.log');
|
|
17
|
+
goog.require('shaka.util.IReleasable');
|
|
17
18
|
|
|
18
19
|
|
|
19
20
|
/**
|
|
20
21
|
* A class responsible for server-side ad interactions.
|
|
22
|
+
* @implements {shaka.util.IReleasable}
|
|
21
23
|
*/
|
|
22
24
|
shaka.ads.ServerSideAdManager = class {
|
|
23
25
|
/**
|
|
@@ -75,9 +77,7 @@ shaka.ads.ServerSideAdManager = class {
|
|
|
75
77
|
|
|
76
78
|
this.onEvent_(new shaka.util.FakeEvent(
|
|
77
79
|
shaka.ads.AdManager.IMA_STREAM_MANAGER_LOADED,
|
|
78
|
-
|
|
79
|
-
'imaStreamManager': this.streamManager_,
|
|
80
|
-
}));
|
|
80
|
+
(new Map()).set('imaStreamManager', this.streamManager_)));
|
|
81
81
|
|
|
82
82
|
// Events
|
|
83
83
|
this.eventManager_.listen(this.streamManager_,
|
|
@@ -201,11 +201,27 @@ shaka.ads.ServerSideAdManager = class {
|
|
|
201
201
|
* Resets the stream manager and removes any continuous polling.
|
|
202
202
|
*/
|
|
203
203
|
stop() {
|
|
204
|
-
|
|
204
|
+
// TODO:
|
|
205
|
+
// For SS DAI streams, if a different asset gets unloaded as
|
|
206
|
+
// part of the process
|
|
207
|
+
// of loading a DAI asset, stream manager state gets reset and we
|
|
208
|
+
// don't get any ad events.
|
|
209
|
+
// We need to figure out if it makes sense to stop the SS
|
|
210
|
+
// manager on unload, and, if it does, find
|
|
211
|
+
// a way to do it safely.
|
|
212
|
+
// this.streamManager_.reset();
|
|
205
213
|
this.backupUrl_ = '';
|
|
206
214
|
this.snapForwardTime_ = null;
|
|
207
215
|
}
|
|
208
216
|
|
|
217
|
+
/** @override */
|
|
218
|
+
release() {
|
|
219
|
+
this.stop();
|
|
220
|
+
if (this.eventManager_) {
|
|
221
|
+
this.eventManager_.release();
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
209
225
|
/**
|
|
210
226
|
* @param {string} type
|
|
211
227
|
* @param {Uint8Array|string} data
|
|
@@ -280,7 +296,7 @@ shaka.ads.ServerSideAdManager = class {
|
|
|
280
296
|
}
|
|
281
297
|
|
|
282
298
|
this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.AD_STARTED,
|
|
283
|
-
|
|
299
|
+
(new Map()).set('ad', this.ad_)));
|
|
284
300
|
this.adContainer_.setAttribute('ad-active', 'true');
|
|
285
301
|
}
|
|
286
302
|
|
|
@@ -306,9 +322,8 @@ shaka.ads.ServerSideAdManager = class {
|
|
|
306
322
|
onLoaded_(e) {
|
|
307
323
|
const now = Date.now() / 1000;
|
|
308
324
|
const loadTime = now - this.streamRequestStartTime_;
|
|
309
|
-
this.onEvent_(
|
|
310
|
-
new
|
|
311
|
-
{'loadTime': loadTime}));
|
|
325
|
+
this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.ADS_LOADED,
|
|
326
|
+
(new Map()).set('loadTime', loadTime)));
|
|
312
327
|
|
|
313
328
|
const streamData = e.getStreamData();
|
|
314
329
|
const url = streamData.url;
|
|
@@ -368,8 +383,8 @@ shaka.ads.ServerSideAdManager = class {
|
|
|
368
383
|
cuePoints.push(shakaCuePoint);
|
|
369
384
|
}
|
|
370
385
|
|
|
371
|
-
this.onEvent_(
|
|
372
|
-
|
|
373
|
-
|
|
386
|
+
this.onEvent_(new shaka.util.FakeEvent(
|
|
387
|
+
shaka.ads.AdManager.CUEPOINTS_CHANGED,
|
|
388
|
+
(new Map()).set('cuepoints', cuePoints)));
|
|
374
389
|
}
|
|
375
390
|
};
|
package/lib/cast/cast_proxy.js
CHANGED
|
@@ -526,7 +526,8 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
|
|
|
526
526
|
goog.asserts.assert(error instanceof shaka.util.Error,
|
|
527
527
|
'Wrong error type!');
|
|
528
528
|
const eventType = shaka.Player.EventName.Error;
|
|
529
|
-
const
|
|
529
|
+
const data = (new Map()).set('detail', error);
|
|
530
|
+
const event = new shaka.util.FakeEvent(eventType, data);
|
|
530
531
|
this.localPlayer_.dispatchEvent(event);
|
|
531
532
|
});
|
|
532
533
|
}
|
|
@@ -599,7 +600,7 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
|
|
|
599
600
|
|
|
600
601
|
// Convert this real Event into a FakeEvent for dispatch from our
|
|
601
602
|
// FakeEventListener.
|
|
602
|
-
const fakeEvent =
|
|
603
|
+
const fakeEvent = shaka.util.FakeEvent.fromRealEvent(event);
|
|
603
604
|
this.videoEventTarget_.dispatchEvent(fakeEvent);
|
|
604
605
|
}
|
|
605
606
|
|
|
@@ -407,8 +407,12 @@ shaka.cast.CastReceiver = class extends shaka.util.FakeEventTarget {
|
|
|
407
407
|
goog.asserts.assert(error instanceof shaka.util.Error,
|
|
408
408
|
'Wrong error type!');
|
|
409
409
|
const eventType = shaka.Player.EventName.Error;
|
|
410
|
-
const
|
|
411
|
-
|
|
410
|
+
const data = (new Map()).set('detail', error);
|
|
411
|
+
const event = new shaka.util.FakeEvent(eventType, data);
|
|
412
|
+
// Only dispatch the event if the player still exists.
|
|
413
|
+
if (this.player_) {
|
|
414
|
+
this.player_.dispatchEvent(event);
|
|
415
|
+
}
|
|
412
416
|
return;
|
|
413
417
|
}
|
|
414
418
|
} else {
|
package/lib/cast/cast_sender.js
CHANGED
|
@@ -647,7 +647,7 @@ shaka.cast.CastSender = class {
|
|
|
647
647
|
case 'event': {
|
|
648
648
|
const targetName = message['targetName'];
|
|
649
649
|
const event = message['event'];
|
|
650
|
-
const fakeEvent =
|
|
650
|
+
const fakeEvent = shaka.util.FakeEvent.fromRealEvent(event);
|
|
651
651
|
this.onRemoteEvent_(targetName, fakeEvent);
|
|
652
652
|
break;
|
|
653
653
|
}
|
|
@@ -725,7 +725,7 @@ shaka.cast.CastSender = class {
|
|
|
725
725
|
|
|
726
726
|
// Dispatch it through the Player proxy
|
|
727
727
|
const fakeEvent = new shaka.util.FakeEvent(
|
|
728
|
-
'error',
|
|
728
|
+
'error', (new Map()).set('detail', shakaError));
|
|
729
729
|
this.onRemoteEvent_('player', fakeEvent);
|
|
730
730
|
|
|
731
731
|
// Force this session to disconnect and transfer playback to the local
|