shaka-player 2.5.4 → 2.5.5
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/.csslintrc +13 -0
- package/CHANGELOG.md +56 -0
- package/build/build.py +4 -1
- package/build/check.py +17 -0
- package/build/compiler.py +40 -0
- package/build/types/core +1 -0
- package/build/types/ui +4 -1
- package/demo/asset_card.js +41 -11
- package/demo/cast_receiver/receiver_app.css +19 -13
- package/demo/close_button.js +0 -6
- package/demo/common/asset.js +6 -1
- package/demo/common/assets.js +72 -14
- package/demo/demo.less +105 -16
- package/demo/index.html +8 -5
- package/demo/load.js +5 -7
- package/demo/main.js +81 -16
- package/dist/.csslintstamp +0 -0
- package/dist/controls.css +1 -1
- package/dist/controls.css.map +1 -1
- package/dist/demo.compiled.debug.js +46 -39
- package/dist/demo.compiled.debug.map +3 -3
- package/dist/demo.compiled.js +46 -39
- package/dist/demo.compiled.map +3 -3
- package/dist/demo.css +1 -1
- package/dist/demo.css.map +1 -1
- package/dist/deps.js +11 -7
- package/dist/receiver.compiled.debug.js +10 -6
- package/dist/receiver.compiled.debug.map +3 -3
- package/dist/receiver.compiled.js +10 -6
- package/dist/receiver.compiled.map +3 -3
- package/dist/shaka-player.compiled.debug.externs.js +123 -92
- package/dist/shaka-player.compiled.debug.js +113 -105
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +123 -92
- package/dist/shaka-player.compiled.js +551 -548
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.debug.externs.js +170 -101
- package/dist/shaka-player.ui.debug.js +187 -188
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +170 -101
- package/dist/shaka-player.ui.js +651 -651
- package/dist/shaka-player.ui.map +3 -3
- package/docs/tutorials/drm-config.md +1 -0
- package/docs/tutorials/fairplay.md +77 -0
- package/docs/tutorials/index.json +1 -0
- package/docs/tutorials/ui-customization.md +3 -0
- package/docs/tutorials/ui.md +3 -1
- package/externs/mediasession.js +16 -1
- package/externs/shaka/net.js +5 -1
- package/externs/shaka/player.js +136 -90
- package/externs/webkitmediakeys.js +4 -0
- package/lib/dash/content_protection.js +33 -1
- package/lib/dash/dash_parser.js +12 -4
- package/lib/hls/hls_parser.js +20 -4
- package/lib/media/drm_engine.js +29 -2
- package/lib/media/media_source_engine.js +7 -3
- package/lib/media/playhead.js +8 -3
- package/lib/media/streaming_engine.js +24 -8
- package/lib/media/video_wrapper.js +8 -3
- package/lib/net/networking_engine.js +1 -0
- package/lib/player.js +3 -2
- package/lib/polyfill/patchedmediakeys_apple.js +2 -72
- package/lib/util/error.js +12 -0
- package/lib/util/fairplay_utils.js +122 -0
- package/lib/util/player_configuration.js +5 -0
- package/lib/util/pssh.js +41 -0
- package/package.json +4 -3
- package/shaka-player.uncompiled.js +5 -1
- package/test/dash/dash_parser_content_protection_unit.js +35 -1
- package/test/dash/dash_parser_manifest_unit.js +31 -0
- package/test/hls/hls_live_unit.js +7 -1
- package/test/hls/hls_parser_unit.js +50 -0
- package/test/media/media_source_engine_integration.js +12 -0
- package/test/media/playhead_unit.js +2 -0
- package/test/player_external.js +3 -2
- package/test/player_integration.js +75 -0
- package/test/test/externs/jasmine.js +6 -0
- package/test/test/util/test_scheme.js +32 -1
- package/test/test/util/ui_utils.js +41 -0
- package/test/ui/ui_unit.js +129 -3
- package/ui/audio_language_selection.js +17 -96
- package/ui/big_play_button.js +61 -0
- package/ui/controls.js +111 -86
- package/ui/controls.less +3 -5
- package/ui/externs/ui.js +14 -2
- package/ui/fullscreen_button.js +2 -52
- package/ui/less/buttons.less +8 -8
- package/ui/less/containers.less +21 -21
- package/ui/less/general.less +11 -0
- package/ui/less/other_elements.less +2 -1
- package/ui/less/overflow_menu.less +11 -10
- package/ui/less/range_elements.less +6 -0
- package/ui/less/spinner.less +2 -0
- package/ui/pip_button.js +1 -1
- package/ui/{play_pause_button.js → play_button.js} +17 -47
- package/ui/resolution_selection.js +41 -104
- package/ui/seek_bar.js +15 -17
- package/ui/settings_menu.js +113 -0
- package/ui/small_play_button.js +73 -0
- package/ui/text_displayer.js +2 -2
- package/ui/text_selection.js +39 -105
- package/ui/ui.js +12 -0
package/demo/demo.less
CHANGED
|
@@ -26,12 +26,10 @@
|
|
|
26
26
|
@drawer-width: 550px;
|
|
27
27
|
|
|
28
28
|
@mdl-footer-link-color: #9e9e9e; /* copied from MDL stylesheet */
|
|
29
|
-
@mdl-button-color: rgb(
|
|
29
|
+
@mdl-button-color: rgb(63,81,181); /* copied from MDL stylesheet */
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
color: darken(@mdl-button-color, 20%);
|
|
34
|
-
}
|
|
31
|
+
@progress-circle-size: 45px;
|
|
32
|
+
@progress-circle-thickness: 5px;
|
|
35
33
|
|
|
36
34
|
/* This is a less mixin only, rather than a CSS class. MDL has an equivalent
|
|
37
35
|
* class with the same name, which can be used in the application directly. */
|
|
@@ -53,6 +51,7 @@
|
|
|
53
51
|
position: absolute;
|
|
54
52
|
top: 10px;
|
|
55
53
|
right: 10px;
|
|
54
|
+
|
|
56
55
|
/* Give the button a round background, meant to look like the play button. */
|
|
57
56
|
border-radius: 50%;
|
|
58
57
|
width: 32px;
|
|
@@ -67,11 +66,16 @@ html, body {
|
|
|
67
66
|
|
|
68
67
|
/* Give the FAB a drop shadow, that expands a little bit when moused over. */
|
|
69
68
|
.mdl-button--fab {
|
|
70
|
-
filter: drop-shadow(0 2px 5px #
|
|
69
|
+
filter: drop-shadow(0 2px 5px #333);
|
|
71
70
|
transition: 0.2s ease-in-out;
|
|
72
71
|
}
|
|
72
|
+
|
|
73
73
|
.mdl-button--fab:hover {
|
|
74
|
-
filter: drop-shadow(0 2px 8px #
|
|
74
|
+
filter: drop-shadow(0 2px 8px #333);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.input-container-label {
|
|
78
|
+
padding-right: 1em;
|
|
75
79
|
}
|
|
76
80
|
|
|
77
81
|
/* Remove vertical padding on MDL text fields, but only while they are in
|
|
@@ -81,22 +85,27 @@ html, body {
|
|
|
81
85
|
// The default width of 300px is a bit too wide for us.
|
|
82
86
|
width: 200px;
|
|
83
87
|
}
|
|
88
|
+
|
|
84
89
|
.hamburger-menu .mdl-textfield__label {
|
|
85
90
|
top: 4px;
|
|
86
91
|
}
|
|
92
|
+
|
|
87
93
|
.hamburger-menu .mdl-textfield__label:after {
|
|
88
94
|
bottom: 0;
|
|
89
95
|
}
|
|
96
|
+
|
|
90
97
|
.hamburger-menu .mdl-layout-title {
|
|
91
98
|
/* The line-height style in mdl-layout-title looks weird on narrow displays,
|
|
92
99
|
* so remove it in the hamburger menu. */
|
|
93
100
|
line-height: unset;
|
|
94
101
|
}
|
|
102
|
+
|
|
95
103
|
.hamburger-menu .input-container-label {
|
|
96
104
|
/* Give the labels for input rows a left margin. This keeps them from directly
|
|
97
105
|
* touching the left side of the screen, for improved readability. */
|
|
98
106
|
margin-left: 1em;
|
|
99
107
|
}
|
|
108
|
+
|
|
100
109
|
.hamburger-menu .mdl-button--raised {
|
|
101
110
|
/* Left-align the text content of the section header buttons. */
|
|
102
111
|
text-align: left;
|
|
@@ -113,8 +122,9 @@ html, body {
|
|
|
113
122
|
|
|
114
123
|
#error-display-link {
|
|
115
124
|
color: white;
|
|
116
|
-
display: block;
|
|
117
|
-
|
|
125
|
+
display: inline-block;
|
|
126
|
+
margin-left: auto;
|
|
127
|
+
margin-right: auto;
|
|
118
128
|
}
|
|
119
129
|
|
|
120
130
|
.input-disabled {
|
|
@@ -126,9 +136,10 @@ html, body {
|
|
|
126
136
|
color: white;
|
|
127
137
|
position: relative;
|
|
128
138
|
padding: 0 0;
|
|
129
|
-
top:
|
|
130
|
-
right:
|
|
139
|
+
top: 0;
|
|
140
|
+
right: 1em;
|
|
131
141
|
float: right;
|
|
142
|
+
font-size: 24px;
|
|
132
143
|
font-weight: bold;
|
|
133
144
|
text-decoration: none;
|
|
134
145
|
cursor: pointer;
|
|
@@ -139,6 +150,7 @@ html, body {
|
|
|
139
150
|
display: inline-block;
|
|
140
151
|
margin: 1em;
|
|
141
152
|
}
|
|
153
|
+
|
|
142
154
|
.asset-card-unsupported {
|
|
143
155
|
display: inline-block;
|
|
144
156
|
margin: 1em;
|
|
@@ -152,41 +164,53 @@ html, body {
|
|
|
152
164
|
background-size: contain;
|
|
153
165
|
background-repeat: no-repeat;
|
|
154
166
|
display: inline-block;
|
|
167
|
+
|
|
155
168
|
/* features */
|
|
156
169
|
&[icon="high_definition"] {
|
|
157
170
|
background-image: data-uri('icons/custom_high_definition.svg');
|
|
158
171
|
}
|
|
172
|
+
|
|
159
173
|
&[icon="ultra_high_definition"] {
|
|
160
174
|
background-image: data-uri('icons/custom_ultra_high_definition.svg');
|
|
161
175
|
}
|
|
176
|
+
|
|
162
177
|
&[icon="subtitles"] {
|
|
163
178
|
background-image: data-uri('icons/baseline-subtitles-24px.svg');
|
|
164
179
|
}
|
|
180
|
+
|
|
165
181
|
&[icon="closed_caption"] {
|
|
166
182
|
background-image: data-uri('icons/baseline-closed_caption-24px.svg');
|
|
167
183
|
}
|
|
184
|
+
|
|
168
185
|
&[icon="live"] {
|
|
169
186
|
background-image: data-uri('icons/baseline-live_tv-24px.svg');
|
|
170
187
|
}
|
|
188
|
+
|
|
171
189
|
&[icon="trick_mode"] {
|
|
172
190
|
background-image: data-uri('icons/baseline-fast_forward-24px.svg');
|
|
173
191
|
}
|
|
192
|
+
|
|
174
193
|
&[icon="surround_sound"] {
|
|
175
194
|
background-image: data-uri('icons/baseline-surround_sound-24px.svg');
|
|
176
195
|
}
|
|
196
|
+
|
|
177
197
|
&[icon="multiple_languages"] {
|
|
178
198
|
background-image: data-uri('icons/baseline-language-24px.svg');
|
|
179
199
|
}
|
|
200
|
+
|
|
180
201
|
&[icon="audio_only"] {
|
|
181
202
|
background-image: data-uri('icons/baseline-audiotrack-24px.svg');
|
|
182
203
|
}
|
|
204
|
+
|
|
183
205
|
/* key systems */
|
|
184
206
|
&[icon="widevine"] {
|
|
185
207
|
background-image: data-uri('icons/custom_widevine.svg');
|
|
186
208
|
}
|
|
209
|
+
|
|
187
210
|
&[icon="clear_key"] {
|
|
188
211
|
background-image: data-uri('icons/custom_clear_key.svg');
|
|
189
212
|
}
|
|
213
|
+
|
|
190
214
|
&[icon="playready"] {
|
|
191
215
|
background-image: data-uri('icons/custom_playready.svg');
|
|
192
216
|
}
|
|
@@ -207,6 +231,48 @@ html, body {
|
|
|
207
231
|
right: 5px;
|
|
208
232
|
}
|
|
209
233
|
|
|
234
|
+
.progress-circle {
|
|
235
|
+
position: absolute;
|
|
236
|
+
top: 0;
|
|
237
|
+
right: 14px;
|
|
238
|
+
width: @progress-circle-size;
|
|
239
|
+
height: @progress-circle-size;
|
|
240
|
+
|
|
241
|
+
/* This should be unclickable, so that you can click the button beneath. */
|
|
242
|
+
pointer-events: none;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
.progress-circle-svg {
|
|
246
|
+
/* In rotation, 0 degrees is the right side. That means that the progress
|
|
247
|
+
* circle "starts at" the right side. Normally, you expect the circle to
|
|
248
|
+
* "start at" the top, like a clock; this rotates the circle, so it behaves
|
|
249
|
+
* thusly. */
|
|
250
|
+
transform: rotate(-90deg);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.progress-circle-circle() {
|
|
254
|
+
/* Set the position and radius of the circle, so it is in the center of the
|
|
255
|
+
* svg's canvas. */
|
|
256
|
+
cx: @progress-circle-size / 2;
|
|
257
|
+
cy: @progress-circle-size / 2;
|
|
258
|
+
r: (@progress-circle-size - @progress-circle-thickness) / 2;
|
|
259
|
+
fill: none;
|
|
260
|
+
stroke-width: @progress-circle-thickness;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
.progress-circle-bar {
|
|
264
|
+
.progress-circle-circle();
|
|
265
|
+
|
|
266
|
+
stroke: @mdl-button-color;
|
|
267
|
+
stroke-linecap: round;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
.progress-circle-back {
|
|
271
|
+
.progress-circle-circle();
|
|
272
|
+
|
|
273
|
+
stroke: #eee;
|
|
274
|
+
}
|
|
275
|
+
|
|
210
276
|
.asset-card .mdl-card__title {
|
|
211
277
|
/* The maximum width of the title should be narrower than the width of the
|
|
212
278
|
* card itself, so that the title doesn't overlap with the store button. */
|
|
@@ -222,9 +288,9 @@ html, body {
|
|
|
222
288
|
.asset-card img {
|
|
223
289
|
/* Icons are 300px by 210px (10:7 aspect ratio). */
|
|
224
290
|
width: 300px;
|
|
291
|
+
|
|
225
292
|
/* Constrain to space if necessary. */
|
|
226
293
|
max-width: 100%;
|
|
227
|
-
|
|
228
294
|
display: block;
|
|
229
295
|
margin-left: auto;
|
|
230
296
|
margin-right: auto;
|
|
@@ -253,6 +319,7 @@ html, body {
|
|
|
253
319
|
height: auto;
|
|
254
320
|
flex-wrap: wrap;
|
|
255
321
|
}
|
|
322
|
+
|
|
256
323
|
/* The spacer should be hidden in this mode, so that the version number is no
|
|
257
324
|
* longer being forced to the right. */
|
|
258
325
|
.app-header .mdl-layout-spacer {
|
|
@@ -295,6 +362,7 @@ footer .mdl-mega-footer__link-list {
|
|
|
295
362
|
/* The default color was low-contrast on this dark background. */
|
|
296
363
|
color: lighten(@mdl-footer-link-color, 20%);
|
|
297
364
|
}
|
|
365
|
+
|
|
298
366
|
a[disabled] {
|
|
299
367
|
/* Making the disabled version even darker would be even worse in terms of
|
|
300
368
|
* contrast, so use a strikethrough style instead. */
|
|
@@ -364,6 +432,7 @@ footer .mdl-mega-footer__link-list {
|
|
|
364
432
|
/* The video bar fills the horizontal space, but its height depends on the
|
|
365
433
|
* contents. */
|
|
366
434
|
width: 100%;
|
|
435
|
+
|
|
367
436
|
/* Add a little bit of padding on top, to make the video not look cropped. */
|
|
368
437
|
padding-top: 1em;
|
|
369
438
|
}
|
|
@@ -381,6 +450,24 @@ footer .mdl-mega-footer__link-list {
|
|
|
381
450
|
max-width: 100%;
|
|
382
451
|
}
|
|
383
452
|
|
|
453
|
+
#video-bar.no-input-sized {
|
|
454
|
+
/* Add some additional padding so that TV overscan doesn't cut off the version
|
|
455
|
+
* number or other information we might need. */
|
|
456
|
+
padding: 2.5em 2em;
|
|
457
|
+
|
|
458
|
+
/* Constrain the body to its size minus margin and padding, so that nested
|
|
459
|
+
* elements can constrain to the body. */
|
|
460
|
+
width: 100%;
|
|
461
|
+
width: calc(100% - 4em);
|
|
462
|
+
height: 100%;
|
|
463
|
+
height: calc(100% - 5em);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
.video-container.no-input-sized {
|
|
467
|
+
width: 100%;
|
|
468
|
+
height: 100%;
|
|
469
|
+
}
|
|
470
|
+
|
|
384
471
|
#video {
|
|
385
472
|
/* Fill whatever space we're given, whether fullscreen or not. */
|
|
386
473
|
width: 100%;
|
|
@@ -398,26 +485,28 @@ footer .mdl-mega-footer__link-list {
|
|
|
398
485
|
.input-container-row {
|
|
399
486
|
display: inline-block;
|
|
400
487
|
}
|
|
488
|
+
|
|
401
489
|
.input-container-style-flex {
|
|
402
490
|
display: flex;
|
|
403
491
|
flex-wrap: wrap;
|
|
404
492
|
}
|
|
493
|
+
|
|
405
494
|
.input-container-style-vertical {
|
|
406
495
|
text-align: left;
|
|
407
496
|
}
|
|
497
|
+
|
|
408
498
|
.input-container-style-accordion {
|
|
409
499
|
text-align: left;
|
|
410
500
|
opacity: 0;
|
|
411
|
-
max-height:
|
|
501
|
+
max-height: 0;
|
|
412
502
|
transition: 0.3s ease-in-out;
|
|
413
503
|
}
|
|
504
|
+
|
|
414
505
|
.input-container-style-accordion.show {
|
|
415
506
|
opacity: 1;
|
|
507
|
+
|
|
416
508
|
/* If the max-height is too high (e.g. set to 100%), the "sliding out"
|
|
417
509
|
* animation is too fast to make out with the eye.
|
|
418
510
|
* So give it a fixed maximum instead. */
|
|
419
511
|
max-height: 1000px;
|
|
420
512
|
}
|
|
421
|
-
.input-container-label {
|
|
422
|
-
padding-right: 1em;
|
|
423
|
-
}
|
package/demo/index.html
CHANGED
|
@@ -84,18 +84,21 @@ UNCOMPILED_JS = [
|
|
|
84
84
|
</head>
|
|
85
85
|
<body>
|
|
86
86
|
<div id="main-layout" class="mdl-layout mdl-js-layout mdl-layout--fixed-header">
|
|
87
|
-
<header class="app-header mdl-layout__header">
|
|
87
|
+
<header class="app-header mdl-layout__header should-hide-in-no-input-mode">
|
|
88
88
|
<header class="mdl-layout__header-row" id="nav-button-container">
|
|
89
89
|
<img alt="Shaka Player Logo" src="shaka_logo_trans.png" class="logo" />
|
|
90
90
|
<button id="nav-button-front" class="mdl-button mdl-js-button mdl-js-ripple-effect should-disable-on-fail" defaultselected>HOME</button>
|
|
91
91
|
<button id="nav-button-search" class="mdl-button mdl-js-button mdl-js-ripple-effect should-disable-on-fail">SEARCH</button>
|
|
92
92
|
<button id="nav-button-custom" class="mdl-button mdl-js-button mdl-js-ripple-effect should-disable-on-fail">CUSTOM CONTENT</button>
|
|
93
93
|
<div class="mdl-layout-spacer"></div>
|
|
94
|
-
<div
|
|
95
|
-
<span
|
|
94
|
+
<div class="version-block">
|
|
95
|
+
<span class="version-string"></span>
|
|
96
96
|
</div>
|
|
97
97
|
</header>
|
|
98
98
|
</header>
|
|
99
|
+
<div class="version-block hidden should-show-in-no-input-mode">
|
|
100
|
+
<span class="version-string"></span>
|
|
101
|
+
</div>
|
|
99
102
|
<div class="mdl-layout__drawer hamburger-menu">
|
|
100
103
|
<div id="hamburger-menu-title" class="mdl-layout-title">
|
|
101
104
|
Shaka Player Demo Config
|
|
@@ -115,8 +118,8 @@ UNCOMPILED_JS = [
|
|
|
115
118
|
<video data-shaka-player autoplay playsinline id="video"></video>
|
|
116
119
|
</div>
|
|
117
120
|
</div>
|
|
118
|
-
<div id="contents"></div>
|
|
119
|
-
<footer class="mdl-mega-footer">
|
|
121
|
+
<div id="contents" class="should-hide-in-no-input-mode"></div>
|
|
122
|
+
<footer class="mdl-mega-footer should-hide-in-no-input-mode">
|
|
120
123
|
<div class="mdl-mega-footer__middle-section">
|
|
121
124
|
|
|
122
125
|
<div class="mdl-mega-footer__drop-down-section">
|
package/demo/load.js
CHANGED
|
@@ -87,40 +87,34 @@ function shakaUncompiledModeSupported() {
|
|
|
87
87
|
fragments = fragments ? fragments.split(';') : [];
|
|
88
88
|
var combined = fields.concat(fragments);
|
|
89
89
|
|
|
90
|
-
var scripts = window['UNCOMPILED_JS'];
|
|
91
90
|
var buildType = 'uncompiled';
|
|
92
91
|
var buildSpecified = false;
|
|
93
92
|
|
|
94
93
|
if (!shakaUncompiledModeSupported()) {
|
|
95
94
|
// If uncompiled mode is not supported, default to the compiled debug
|
|
96
95
|
// version, which should still work.
|
|
97
|
-
scripts = window['COMPILED_DEBUG_JS'];
|
|
98
96
|
buildType = 'debug_compiled';
|
|
99
97
|
}
|
|
100
98
|
|
|
101
99
|
if (!navigator.onLine) {
|
|
102
100
|
// If we're offline, default to the compiled version, which may have been
|
|
103
101
|
// cached by the service worker.
|
|
104
|
-
scripts = window['COMPILED_JS'];
|
|
105
102
|
buildType = 'compiled';
|
|
106
103
|
}
|
|
107
104
|
|
|
108
105
|
// Very old browsers do not have Array.prototype.indexOf, so we loop.
|
|
109
106
|
for (var i = 0; i < combined.length; ++i) {
|
|
110
107
|
if (combined[i] == 'build=compiled') {
|
|
111
|
-
scripts = window['COMPILED_JS'];
|
|
112
108
|
buildType = 'compiled';
|
|
113
109
|
buildSpecified = true;
|
|
114
110
|
break;
|
|
115
111
|
}
|
|
116
112
|
if (combined[i] == 'build=debug_compiled') {
|
|
117
|
-
scripts = window['COMPILED_DEBUG_JS'];
|
|
118
113
|
buildType = 'debug_compiled';
|
|
119
114
|
buildSpecified = true;
|
|
120
115
|
break;
|
|
121
116
|
}
|
|
122
117
|
if (combined[i] == 'build=uncompiled') {
|
|
123
|
-
scripts = window['UNCOMPILED_JS'];
|
|
124
118
|
buildType = 'uncompiled';
|
|
125
119
|
buildSpecified = true;
|
|
126
120
|
break;
|
|
@@ -131,7 +125,6 @@ function shakaUncompiledModeSupported() {
|
|
|
131
125
|
// The URL says uncompiled, but we know it won't work. This URL was
|
|
132
126
|
// probably copied from some other browser, but it won't work in this one.
|
|
133
127
|
// Force the use of the compiled debug build and update the hash.
|
|
134
|
-
scripts = window['COMPILED_DEBUG_JS'];
|
|
135
128
|
buildType = 'debug_compiled';
|
|
136
129
|
|
|
137
130
|
// Replace the build type in either the hash or the URL parameters.
|
|
@@ -159,6 +152,11 @@ function shakaUncompiledModeSupported() {
|
|
|
159
152
|
|
|
160
153
|
// The application must define its list of compiled and uncompiled sources
|
|
161
154
|
// before including this loader. The URLs should be relative to the page.
|
|
155
|
+
var scripts = {
|
|
156
|
+
'compiled': window['COMPILED_JS'],
|
|
157
|
+
'debug_compiled': window['COMPILED_DEBUG_JS'],
|
|
158
|
+
'uncompiled': window['UNCOMPILED_JS'],
|
|
159
|
+
}[buildType];
|
|
162
160
|
for (var j = 0; j < scripts.length; ++j) {
|
|
163
161
|
loadRelativeScript(scripts[j]);
|
|
164
162
|
}
|
package/demo/main.js
CHANGED
|
@@ -65,6 +65,9 @@ shakaDemo.Main = class {
|
|
|
65
65
|
|
|
66
66
|
/** @private {string} */
|
|
67
67
|
this.uiLocale_ = '';
|
|
68
|
+
|
|
69
|
+
/** @private {boolean} */
|
|
70
|
+
this.noInput_ = false;
|
|
68
71
|
}
|
|
69
72
|
|
|
70
73
|
/**
|
|
@@ -91,8 +94,8 @@ shakaDemo.Main = class {
|
|
|
91
94
|
document.getElementById('error-display-close-button').addEventListener(
|
|
92
95
|
'click', (event) => this.closeError_());
|
|
93
96
|
|
|
94
|
-
// Set up version
|
|
95
|
-
this.
|
|
97
|
+
// Set up version strings in the appropriate divs.
|
|
98
|
+
this.setUpVersionStrings_();
|
|
96
99
|
}
|
|
97
100
|
|
|
98
101
|
/**
|
|
@@ -155,16 +158,40 @@ shakaDemo.Main = class {
|
|
|
155
158
|
}
|
|
156
159
|
}
|
|
157
160
|
|
|
161
|
+
// Optionally enter noinput mode. This has to happen before setting up the
|
|
162
|
+
// player.
|
|
163
|
+
this.noInput_ = 'noinput' in this.getParams_();
|
|
158
164
|
this.setupPlayer_();
|
|
159
165
|
this.readHash_();
|
|
160
166
|
window.addEventListener('hashchange', () => this.hashChanged_());
|
|
161
167
|
|
|
162
168
|
await this.setupStorage_();
|
|
163
169
|
|
|
170
|
+
if (this.noInput_) {
|
|
171
|
+
// Set the page to noInput mode, disabling the header and footer.
|
|
172
|
+
const hideClass = 'should-hide-in-no-input-mode';
|
|
173
|
+
for (const element of document.getElementsByClassName(hideClass)) {
|
|
174
|
+
this.hideNode_(element);
|
|
175
|
+
}
|
|
176
|
+
const showClass = 'should-show-in-no-input-mode';
|
|
177
|
+
for (const element of document.getElementsByClassName(showClass)) {
|
|
178
|
+
this.showNode_(element);
|
|
179
|
+
}
|
|
180
|
+
// Also fullscreen the container.
|
|
181
|
+
this.container_.classList.add('no-input-sized');
|
|
182
|
+
document.getElementById('video-bar').classList.add('no-input-sized');
|
|
183
|
+
}
|
|
184
|
+
|
|
164
185
|
// The main page is loaded. Dispatch an event, so the various
|
|
165
186
|
// configurations will load themselves.
|
|
166
187
|
this.dispatchEventWithName_('shaka-main-loaded');
|
|
167
188
|
|
|
189
|
+
// Wait for one interruptor cycle, so that the tabs have time to load.
|
|
190
|
+
// This ensures that, for example, if there is an asset playing at page
|
|
191
|
+
// load time, the video will scroll into view second, and the page won't
|
|
192
|
+
// scroll away from the video.
|
|
193
|
+
await Promise.resolve();
|
|
194
|
+
|
|
168
195
|
// Update the componentHandler, to account for any new MDL elements added.
|
|
169
196
|
componentHandler.upgradeDom();
|
|
170
197
|
|
|
@@ -186,14 +213,19 @@ shakaDemo.Main = class {
|
|
|
186
213
|
const ui = video['ui'];
|
|
187
214
|
this.player_ = ui.getControls().getPlayer();
|
|
188
215
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
216
|
+
if (!this.noInput_) {
|
|
217
|
+
// Don't add the close button if in noInput mode; it doesn't make much
|
|
218
|
+
// sense to stop playing a video if you can't start playing other videos.
|
|
192
219
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
220
|
+
// Register custom controls to the UI.
|
|
221
|
+
const factory = new shakaDemo.CloseButton.Factory();
|
|
222
|
+
shaka.ui.Controls.registerElement('close', factory);
|
|
223
|
+
|
|
224
|
+
// Configure UI.
|
|
225
|
+
const uiConfig = ui.getConfiguration();
|
|
226
|
+
uiConfig.controlPanelElements.push('close');
|
|
227
|
+
ui.configure(uiConfig);
|
|
228
|
+
}
|
|
197
229
|
|
|
198
230
|
// Add application-level default configs here. These are not the library
|
|
199
231
|
// defaults, but they are the application defaults. This will affect the
|
|
@@ -457,7 +489,7 @@ shakaDemo.Main = class {
|
|
|
457
489
|
return 'This asset cannot be downloaded.';
|
|
458
490
|
}
|
|
459
491
|
|
|
460
|
-
if (!asset.
|
|
492
|
+
if (!asset.isClear()) {
|
|
461
493
|
const hasSupportedDRM = asset.drm.some((drm) => {
|
|
462
494
|
return this.support_.drm[drm];
|
|
463
495
|
});
|
|
@@ -816,11 +848,22 @@ shakaDemo.Main = class {
|
|
|
816
848
|
this.hideNode_(videoBar);
|
|
817
849
|
this.video_.poster = shakaDemo.Main.mainPoster_;
|
|
818
850
|
|
|
851
|
+
if (document.fullscreenElement) {
|
|
852
|
+
document.exitFullscreen();
|
|
853
|
+
}
|
|
854
|
+
if (document.pictureInPictureElement) {
|
|
855
|
+
document.exitPictureInPicture();
|
|
856
|
+
}
|
|
819
857
|
this.player_.unload();
|
|
820
858
|
|
|
821
859
|
// The currently-selected asset changed, so update asset cards.
|
|
822
860
|
this.dispatchEventWithName_('shaka-main-selected-asset-changed');
|
|
823
861
|
|
|
862
|
+
// Unset media session title, but only if the browser supports that API.
|
|
863
|
+
if (navigator.mediaSession) {
|
|
864
|
+
navigator.mediaSession.metadata = null;
|
|
865
|
+
}
|
|
866
|
+
|
|
824
867
|
// Remake hash, to change the current asset.
|
|
825
868
|
this.remakeHash();
|
|
826
869
|
}
|
|
@@ -942,6 +985,18 @@ shakaDemo.Main = class {
|
|
|
942
985
|
if (this.player_.isAudioOnly()) {
|
|
943
986
|
this.video_.poster = shakaDemo.Main.audioOnlyPoster_;
|
|
944
987
|
}
|
|
988
|
+
|
|
989
|
+
// Set media session title, but only if the browser supports that API.
|
|
990
|
+
if (navigator.mediaSession) {
|
|
991
|
+
const metadata = {
|
|
992
|
+
title: asset.name,
|
|
993
|
+
artwork: [{src: asset.iconUri}],
|
|
994
|
+
};
|
|
995
|
+
if (asset.source != shakaAssets.Source.UNKNOWN) {
|
|
996
|
+
metadata.artist = asset.source;
|
|
997
|
+
}
|
|
998
|
+
navigator.mediaSession.metadata = new MediaMetadata(metadata);
|
|
999
|
+
}
|
|
945
1000
|
} catch (reason) {
|
|
946
1001
|
const error = /** @type {!shaka.util.Error} */ (reason);
|
|
947
1002
|
if (error.code == shaka.util.Error.Code.LOAD_INTERRUPTED) {
|
|
@@ -1024,6 +1079,10 @@ shakaDemo.Main = class {
|
|
|
1024
1079
|
}
|
|
1025
1080
|
}
|
|
1026
1081
|
|
|
1082
|
+
if (this.noInput_) {
|
|
1083
|
+
params.push('noinput');
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1027
1086
|
if (this.nativeControlsEnabled_) {
|
|
1028
1087
|
params.push('nativecontrols');
|
|
1029
1088
|
}
|
|
@@ -1160,8 +1219,12 @@ shakaDemo.Main = class {
|
|
|
1160
1219
|
document.dispatchEvent(event);
|
|
1161
1220
|
}
|
|
1162
1221
|
|
|
1163
|
-
/**
|
|
1164
|
-
|
|
1222
|
+
/**
|
|
1223
|
+
* Sets the "version-string" divs to a version string.
|
|
1224
|
+
* For example, "v2.5.4-master (uncompiled)".
|
|
1225
|
+
* @private
|
|
1226
|
+
*/
|
|
1227
|
+
setUpVersionStrings_() {
|
|
1165
1228
|
const version = shaka.Player.version;
|
|
1166
1229
|
let split = version.split('-');
|
|
1167
1230
|
let inParen = [];
|
|
@@ -1176,10 +1239,12 @@ shakaDemo.Main = class {
|
|
|
1176
1239
|
}
|
|
1177
1240
|
|
|
1178
1241
|
// Put the version into the version string div.
|
|
1179
|
-
const
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1242
|
+
const versionStringDivs = document.getElementsByClassName('version-string');
|
|
1243
|
+
for (const div of versionStringDivs) {
|
|
1244
|
+
div.textContent = split.join('-');
|
|
1245
|
+
if (inParen.length > 0) {
|
|
1246
|
+
div.textContent += ' (' + inParen.join(', ') + ')';
|
|
1247
|
+
}
|
|
1183
1248
|
}
|
|
1184
1249
|
}
|
|
1185
1250
|
|
|
File without changes
|
package/dist/controls.css
CHANGED
|
@@ -14,4 +14,4 @@
|
|
|
14
14
|
* See the License for the specific language governing permissions and
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
|
-
.shaka-video-container{position:relative;top:0;left:0;display:flex}.shaka-video-container .material-icons{font-family:'Material Icons'}.shaka-video-container *{font-family:Roboto-Regular,Roboto,sans-serif}.shaka-video-container:fullscreen{width:100%;height:100%;background-color:#000}.shaka-video-container:fullscreen .shaka-text-container{font-size:4.
|
|
17
|
+
.shaka-video-container{position:relative;top:0;left:0;display:flex}.shaka-video-container .material-icons{font-family:'Material Icons'}.shaka-video-container *{font-family:Roboto-Regular,Roboto,sans-serif}.shaka-video-container:fullscreen{width:100%;height:100%;background-color:#000}.shaka-video-container:fullscreen .shaka-text-container{font-size:4.4vmin}.shaka-video-container:-webkit-full-screen{width:100%;height:100%;background-color:#000}.shaka-video-container:-webkit-full-screen .shaka-text-container{font-size:4.4vmin}.shaka-video-container:-moz-full-screen{width:100%;height:100%;background-color:#000}.shaka-video-container:-moz-full-screen .shaka-text-container{font-size:4.4vmin}.shaka-video-container:-ms-fullscreen{width:100%;height:100%;background-color:#000}.shaka-video-container:-ms-fullscreen .shaka-text-container{font-size:4.4vmin}.shaka-controls-container{position:absolute;top:0;left:0;right:0;bottom:0;margin:0;padding:0;width:100%;height:100%;box-sizing:border-box;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;background:linear-gradient(to top,#000 0,rgba(0,0,0,0) 92px);opacity:0;transition:opacity cubic-bezier(.4,0,.6,1) .6s;z-index:1}.shaka-controls-container *{flex-shrink:0}.shaka-controls-container[shown=true]{opacity:1}.shaka-controls-container[casting=true]{opacity:1}.shaka-controls-container[casting=true] .shaka-fullscreen-button{display:none}.shaka-bottom-controls{width:98%;padding:0;padding-left:2%;padding-bottom:2.5%;z-index:1}.shaka-controls-button-panel{width:98.5%;padding:0;margin:0;display:flex;flex-direction:row;justify-content:flex-end;align-items:center;overflow:hidden;min-width:48px;font-size:12px;font-weight:400;font-style:normal;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.shaka-controls-button-panel>*{color:#fff;height:32px;margin:1px 6px;padding:0;background:0 0;border:0;cursor:pointer}.shaka-play-button-container{margin:0;width:100%;height:100%;flex-shrink:1;position:absolute;left:0;right:0;top:0;bottom:0;display:flex;justify-content:center;align-items:center}.shaka-text-container{position:absolute;left:0;right:0;top:0;bottom:0;bottom:15%;width:100%;min-width:48px;text-align:center;display:flex;justify-content:center;align-items:flex-end;overflow:hidden;font-size:20px;line-height:1.4}.shaka-text-container span{background-color:rgba(0,0,0,.8);color:#fff;display:block;max-width:95%}.shaka-spinner-container{position:absolute;left:0;right:0;top:0;bottom:0;width:100%;height:100%;flex-shrink:1;display:flex;justify-content:center;align-items:center}.shaka-spinner{position:relative;top:0;left:0;margin:0;box-sizing:border-box;padding:7.8%;width:0;height:0}.shaka-play-button{box-sizing:border-box;padding:7.5%;width:0;height:0;margin:0;border-radius:50%;box-shadow:rgba(0,0,0,.1) 0 0 20px 0;border:none;background-size:50%;background-repeat:no-repeat;background-position:center center;background-color:rgba(255,255,255,.9)}.shaka-play-button[icon=play]{background-image:url(data:image/svg+xml,%3Csvg%20fill%3D%22%23000000%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20width%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M8%205v14l11-7z%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%0A%3C%2Fsvg%3E)}.shaka-play-button[icon=pause]{background-image:url(data:image/svg+xml,%3Csvg%20fill%3D%22%23000000%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20width%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M6%2019h4V5H6v14zm8-14v14h4V5h-4z%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%0A%3C%2Fsvg%3E)}.shaka-current-time{font-size:14px;color:#fff;height:auto;cursor:pointer}.shaka-current-time[disabled]{background-color:transparent;color:#fff;cursor:default}.shaka-controls-container button:focus,.shaka-controls-container input:focus{outline:1px solid Highlight;outline:1px solid -webkit-focus-ring-color}.shaka-controls-container button:-moz-focus-inner,.shaka-controls-container input:-moz-focus-outer{outline:0;border:0}.shaka-controls-container:not(.shaka-keyboard-navigation) button:focus,.shaka-controls-container:not(.shaka-keyboard-navigation) input:focus{outline:0;border:0}.shaka-mobile .shaka-volume-bar-container{display:none}.shaka-range-container{position:relative;top:0;left:0;margin:4px 6px;height:4px;border-radius:4px;background:#fff}.shaka-volume-bar-container{width:100px}@media screen and (max-width:550px){.shaka-volume-bar-container{display:none}}.shaka-seek-bar-container{width:96.5%}.shaka-range-element{-webkit-appearance:none;background:0 0;position:absolute;top:0;left:0;right:0;bottom:0;margin:0;padding:0;width:100%;height:100%;height:12px;top:-4px;z-index:1}.shaka-range-element::-webkit-slider-runnable-track{width:100%;height:12px;background:0 0;color:transparent;border:none}.shaka-range-element::-webkit-slider-thumb{-webkit-appearance:none;border:none;border-radius:12px;height:12px;width:12px;background:#fff}.shaka-range-element::-moz-range-track{width:100%;height:12px;background:0 0;color:transparent;border:none}.shaka-range-element::-moz-range-thumb{-webkit-appearance:none;border:none;border-radius:12px;height:12px;width:12px;background:#fff}.shaka-range-element::-ms-track{width:100%;height:12px;background:0 0;color:transparent;border:none}.shaka-range-element::-ms-thumb{-webkit-appearance:none;border:none;border-radius:12px;height:12px;width:12px;background:#fff}.shaka-range-element::-ms-tooltip{display:none}.shaka-range-element::-ms-fill-lower{display:none}.shaka-range-element::-ms-fill-upper{display:none}.shaka-spinner-svg{position:absolute;top:0;left:0;right:0;bottom:0;animation:rotate 2s linear infinite;transform-origin:center center;width:100%;height:100%;margin:0;padding:0}.shaka-spinner-path{stroke:#202124;stroke-dasharray:20,200;stroke-dashoffset:0;animation:dash 1.5s ease-in-out infinite;stroke-linecap:round}@keyframes rotate{100%{transform:rotate(360deg)}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}100%{stroke-dasharray:89,200;stroke-dashoffset:-124px}}.shaka-spacer{cursor:default;flex-shrink:1;flex-grow:1;margin:0}.shaka-settings-menu{overflow-x:hidden;overflow-y:auto;white-space:nowrap;background:#fff;box-shadow:0 1px 9px 0 rgba(0,0,0,.4);border-radius:2px;max-height:250px;min-width:180px;display:none;flex-direction:column;position:absolute;z-index:2;right:15px;bottom:30px}.shaka-settings-menu button{font-size:14px;background:0 0;color:#000;border:none;min-height:30px;padding:3.5px 6px;display:flex;align-items:center}.shaka-settings-menu button:hover{background:#e0e0e0}.shaka-keyboard-navigation .shaka-settings-menu button:focus{background:#e0e0e0}.shaka-settings-menu i{padding-left:10px}.shaka-settings-menu.shaka-low-position{bottom:15px}.shaka-overflow-menu span{text-align:left;position:relative;left:13px}.shaka-overflow-button-label{position:relative;display:flex;flex-direction:column}.shaka-current-selection-span{color:rgba(0,0,0,.54)}.shaka-audio-languages span,.shaka-resolutions span,.shaka-text-languages span{margin-left:54px}.shaka-back-to-overflow-button span{margin-left:0}.shaka-back-to-overflow-button i{padding-right:20px}.shaka-auto-span{left:17px}.shaka-captions-on{color:#000}.shaka-captions-off{color:grey}@font-face{font-family:Roboto;font-style:normal;font-weight:400;src:local('Roboto'),local('Roboto-Regular'),url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu4mxP.ttf) format('truetype')}@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialicons/v48/flUhRq6tzZclQEJ-Vdg-IuiaDsNZ.ttf) format('truetype')}.material-icons{font-family:'Material Icons';font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr}.shaka-cast-receiver-name{display:none;background-color:rgba(0,0,0,.5);color:#fff;font-size:150%;padding:5px;bottom:50px;left:0;right:0;margin:auto;width:max-content}.shaka-cast-connected-button{display:none}.shaka-hidden,button.shaka-hidden{display:none}.shaka-displayed,button.shaka-displayed{display:flex}/*# sourceMappingURL=controls.css.map */
|
package/dist/controls.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../ui/less/containers.less","$stdin","../ui/less/general.less","../ui/less/buttons.less","../ui/less/range_elements.less","../ui/less/spinner.less","../ui/less/other_elements.less","../ui/less/overflow_menu.less","../ui/https:/fonts.googleapis.com/css?family=Roboto","../ui/https:/fonts.googleapis.com/icon?family=Material+Icons","../ui/controls.less"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../ui/less/containers.less","$stdin","../ui/less/general.less","../ui/less/buttons.less","../ui/less/range_elements.less","../ui/less/spinner.less","../ui/less/other_elements.less","../ui/less/overflow_menu.less","../ui/https:/fonts.googleapis.com/css?family=Roboto","../ui/https:/fonts.googleapis.com/icon?family=Material+Icons","../ui/controls.less"],"names":[],"mappings":"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"}
|