shaka-player 4.2.7 → 4.2.8
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/.github/workflows/selenium-lab-tests.yaml +22 -0
- package/CHANGELOG.md +16 -0
- package/dist/deps.js +3 -2
- package/dist/locales.js +31 -31
- package/dist/shaka-player.compiled.debug.js +87 -81
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.js +567 -564
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.debug.js +99 -93
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.js +691 -688
- package/dist/shaka-player.ui.map +4 -4
- package/lib/dash/segment_template.js +17 -5
- package/lib/hls/hls_parser.js +1 -1
- package/lib/player.js +1 -1
- package/lib/polyfill/media_capabilities.js +4 -1
- package/lib/text/simple_text_displayer.js +2 -64
- package/lib/text/text_utils.js +88 -0
- package/lib/text/ui_text_displayer.js +0 -5
- package/lib/text/vtt_text_parser.js +256 -95
- package/lib/text/web_vtt_generator.js +2 -64
- package/lib/util/platform.js +8 -0
- package/package.json +1 -1
- package/support.html +1 -0
- package/test/dash/dash_parser_manifest_unit.js +0 -36
- package/test/test/util/layout_tests.js +433 -0
- package/test/test/util/util.js +0 -120
- package/test/{ui → text}/text_displayer_layout_unit.js +59 -235
- package/test/text/ui_text_displayer_unit.js +2 -4
- package/test/text/vtt_text_parser_unit.js +123 -6
- package/test/text/web_vtt_layout_integration.js +528 -0
|
@@ -102,11 +102,23 @@ shaka.dash.SegmentTemplate = class {
|
|
|
102
102
|
const periodEnd = context.periodInfo.duration ?
|
|
103
103
|
context.periodInfo.start + context.periodInfo.duration : Infinity;
|
|
104
104
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
105
|
+
/* When to fit segments. All refactors should honor/update this table:
|
|
106
|
+
*
|
|
107
|
+
* | dynamic | infinite | last | should | notes |
|
|
108
|
+
* | | period | period | fit | |
|
|
109
|
+
* | ------- | -------- | ------ | ------ | ------------------------- |
|
|
110
|
+
* | F | F | X | T | typical VOD |
|
|
111
|
+
* | F | T | X | X | impossible: infinite VOD |
|
|
112
|
+
* | T | F | F | T | typical live, old period |
|
|
113
|
+
* | T | F | T | F | typical IPR |
|
|
114
|
+
* | T | T | F | X | impossible: old, infinite |
|
|
115
|
+
* | T | T | T | F | typical live, new period |
|
|
116
|
+
*/
|
|
117
|
+
|
|
118
|
+
// We never fit the final period of dynamic content, which could be
|
|
119
|
+
// infinite live (with no limit to fit to) or IPR (which would expand the
|
|
120
|
+
// most recent segment to the end of the presentation).
|
|
121
|
+
const shouldFit = !(context.dynamic && context.periodInfo.isLastPeriod);
|
|
110
122
|
|
|
111
123
|
if (segmentIndex) {
|
|
112
124
|
if (shouldFit) {
|
package/lib/hls/hls_parser.js
CHANGED
|
@@ -2933,7 +2933,7 @@ shaka.hls.HlsParser.TEXT_EXTENSIONS_TO_MIME_TYPES_ = {
|
|
|
2933
2933
|
'm4f': 'application/mp4',
|
|
2934
2934
|
'cmft': 'application/mp4',
|
|
2935
2935
|
'vtt': 'text/vtt',
|
|
2936
|
-
'webvtt': '
|
|
2936
|
+
'webvtt': 'text/vtt',
|
|
2937
2937
|
'ttml': 'application/ttml+xml',
|
|
2938
2938
|
};
|
|
2939
2939
|
|
package/lib/player.js
CHANGED
|
@@ -6605,7 +6605,7 @@ shaka.Player.TYPICAL_BUFFERING_THRESHOLD_ = 0.5;
|
|
|
6605
6605
|
* @define {string} A version number taken from git at compile time.
|
|
6606
6606
|
* @export
|
|
6607
6607
|
*/
|
|
6608
|
-
shaka.Player.version = 'v4.2.
|
|
6608
|
+
shaka.Player.version = 'v4.2.8-uncompiled';
|
|
6609
6609
|
|
|
6610
6610
|
// Initialize the deprecation system using the version string we just set
|
|
6611
6611
|
// on the player.
|
|
@@ -47,6 +47,8 @@ shaka.polyfill.MediaCapabilities = class {
|
|
|
47
47
|
// should always install polyfill for WebOS browsers.
|
|
48
48
|
// Since MediaCapabilities implementation is buggy in EOS browsers, we
|
|
49
49
|
// should always install polyfill for EOS browsers.
|
|
50
|
+
// Since MediaCapabilities implementation is buggy in Hisense browsers, we
|
|
51
|
+
// should always install polyfill for Hisense browsers.
|
|
50
52
|
let canUseNativeMCap = true;
|
|
51
53
|
if (shaka.util.Platform.isApple() ||
|
|
52
54
|
shaka.util.Platform.isPS5() ||
|
|
@@ -54,7 +56,8 @@ shaka.polyfill.MediaCapabilities = class {
|
|
|
54
56
|
shaka.util.Platform.isWebOS() ||
|
|
55
57
|
shaka.util.Platform.isTizen() ||
|
|
56
58
|
shaka.util.Platform.isChromecast() ||
|
|
57
|
-
shaka.util.Platform.isEOS()
|
|
59
|
+
shaka.util.Platform.isEOS() ||
|
|
60
|
+
shaka.util.Platform.isHisense()) {
|
|
58
61
|
canUseNativeMCap = false;
|
|
59
62
|
}
|
|
60
63
|
if (canUseNativeMCap && navigator.mediaCapabilities) {
|
|
@@ -14,6 +14,7 @@ goog.provide('shaka.text.SimpleTextDisplayer');
|
|
|
14
14
|
goog.require('goog.asserts');
|
|
15
15
|
goog.require('shaka.log');
|
|
16
16
|
goog.require('shaka.text.Cue');
|
|
17
|
+
goog.require('shaka.text.Utils');
|
|
17
18
|
|
|
18
19
|
|
|
19
20
|
/**
|
|
@@ -79,70 +80,7 @@ shaka.text.SimpleTextDisplayer = class {
|
|
|
79
80
|
* @export
|
|
80
81
|
*/
|
|
81
82
|
append(cues) {
|
|
82
|
-
|
|
83
|
-
// their contents should be combined and replace the payload of the parent.
|
|
84
|
-
const flattenPayload = (cue) => {
|
|
85
|
-
// Handle styles (currently bold/italics/underline).
|
|
86
|
-
// TODO add support for color rendering.
|
|
87
|
-
const openStyleTags = [];
|
|
88
|
-
const bold = cue.fontWeight >= shaka.text.Cue.fontWeight.BOLD;
|
|
89
|
-
const italics = cue.fontStyle == shaka.text.Cue.fontStyle.ITALIC;
|
|
90
|
-
const underline = cue.textDecoration.includes(
|
|
91
|
-
shaka.text.Cue.textDecoration.UNDERLINE);
|
|
92
|
-
if (bold) {
|
|
93
|
-
openStyleTags.push('b');
|
|
94
|
-
}
|
|
95
|
-
if (italics) {
|
|
96
|
-
openStyleTags.push('i');
|
|
97
|
-
}
|
|
98
|
-
if (underline) {
|
|
99
|
-
openStyleTags.push('u');
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Prefix opens tags, suffix closes tags in reverse order of opening.
|
|
103
|
-
const prefixStyleTags = openStyleTags.reduce((acc, tag) => {
|
|
104
|
-
return `${acc}<${tag}>`;
|
|
105
|
-
}, '');
|
|
106
|
-
const suffixStyleTags = openStyleTags.reduceRight((acc, tag) => {
|
|
107
|
-
return `${acc}</${tag}>`;
|
|
108
|
-
}, '');
|
|
109
|
-
|
|
110
|
-
if (cue.lineBreak) {
|
|
111
|
-
// This is a vertical lineBreak, so insert a newline.
|
|
112
|
-
return '\n';
|
|
113
|
-
} else if (cue.nestedCues.length) {
|
|
114
|
-
return cue.nestedCues.map(flattenPayload).join('');
|
|
115
|
-
} else {
|
|
116
|
-
// This is a real cue.
|
|
117
|
-
return prefixStyleTags + cue.payload + suffixStyleTags;
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
// We don't want to modify the array or objects passed in, since we don't
|
|
122
|
-
// technically own them. So we build a new array and replace certain items
|
|
123
|
-
// in it if they need to be flattened.
|
|
124
|
-
// We also don't want to flatten the text payloads starting at a container
|
|
125
|
-
// element; otherwise, for containers encapsulating multiple caption lines,
|
|
126
|
-
// the lines would merge into a single cue. This is undesirable when a
|
|
127
|
-
// subset of the captions are outside of the append time window. To fix
|
|
128
|
-
// this, we only call flattenPayload() starting at elements marked as
|
|
129
|
-
// isContainer = false.
|
|
130
|
-
const getCuesToFlatten = (cues, result) => {
|
|
131
|
-
for (const cue of cues) {
|
|
132
|
-
if (cue.isContainer) {
|
|
133
|
-
// Recurse to find the actual text payload cues.
|
|
134
|
-
getCuesToFlatten(cue.nestedCues, result);
|
|
135
|
-
} else {
|
|
136
|
-
// Flatten the payload.
|
|
137
|
-
const flatCue = cue.clone();
|
|
138
|
-
flatCue.nestedCues = [];
|
|
139
|
-
flatCue.payload = flattenPayload(cue);
|
|
140
|
-
result.push(flatCue);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
return result;
|
|
144
|
-
};
|
|
145
|
-
const flattenedCues = getCuesToFlatten(cues, []);
|
|
83
|
+
const flattenedCues = shaka.text.Utils.getCuesToFlatten(cues, []);
|
|
146
84
|
|
|
147
85
|
// Convert cues.
|
|
148
86
|
const textTrackCues = [];
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/*! @license
|
|
2
|
+
* Shaka Player
|
|
3
|
+
* Copyright 2016 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
goog.provide('shaka.text.Utils');
|
|
8
|
+
|
|
9
|
+
goog.require('shaka.text.Cue');
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
shaka.text.Utils = class {
|
|
13
|
+
/**
|
|
14
|
+
* Flatten nested cue payloads recursively. If a cue has nested cues,
|
|
15
|
+
* their contents should be combined and replace the payload of the parent.
|
|
16
|
+
*
|
|
17
|
+
* @param {!shaka.text.Cue} cue
|
|
18
|
+
* @return {string}
|
|
19
|
+
* @private
|
|
20
|
+
*/
|
|
21
|
+
static flattenPayload_(cue) {
|
|
22
|
+
// Handle styles (currently bold/italics/underline).
|
|
23
|
+
// TODO: add support for color rendering.
|
|
24
|
+
const openStyleTags = [];
|
|
25
|
+
const bold = cue.fontWeight >= shaka.text.Cue.fontWeight.BOLD;
|
|
26
|
+
const italics = cue.fontStyle == shaka.text.Cue.fontStyle.ITALIC;
|
|
27
|
+
const underline = cue.textDecoration.includes(
|
|
28
|
+
shaka.text.Cue.textDecoration.UNDERLINE);
|
|
29
|
+
if (bold) {
|
|
30
|
+
openStyleTags.push('b');
|
|
31
|
+
}
|
|
32
|
+
if (italics) {
|
|
33
|
+
openStyleTags.push('i');
|
|
34
|
+
}
|
|
35
|
+
if (underline) {
|
|
36
|
+
openStyleTags.push('u');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Prefix opens tags, suffix closes tags in reverse order of opening.
|
|
40
|
+
const prefixStyleTags = openStyleTags.reduce((acc, tag) => {
|
|
41
|
+
return `${acc}<${tag}>`;
|
|
42
|
+
}, '');
|
|
43
|
+
const suffixStyleTags = openStyleTags.reduceRight((acc, tag) => {
|
|
44
|
+
return `${acc}</${tag}>`;
|
|
45
|
+
}, '');
|
|
46
|
+
|
|
47
|
+
if (cue.lineBreak) {
|
|
48
|
+
// This is a vertical lineBreak, so insert a newline.
|
|
49
|
+
return '\n';
|
|
50
|
+
} else if (cue.nestedCues.length) {
|
|
51
|
+
return cue.nestedCues.map(shaka.text.Utils.flattenPayload_).join('');
|
|
52
|
+
} else {
|
|
53
|
+
// This is a real cue.
|
|
54
|
+
return prefixStyleTags + cue.payload + suffixStyleTags;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* We don't want to modify the array or objects passed in, since we don't
|
|
60
|
+
* technically own them. So we build a new array and replace certain items
|
|
61
|
+
* in it if they need to be flattened.
|
|
62
|
+
* We also don't want to flatten the text payloads starting at a container
|
|
63
|
+
* element; otherwise, for containers encapsulating multiple caption lines,
|
|
64
|
+
* the lines would merge into a single cue. This is undesirable when a
|
|
65
|
+
* subset of the captions are outside of the append time window. To fix
|
|
66
|
+
* this, we only call flattenPayload() starting at elements marked as
|
|
67
|
+
* isContainer = false.
|
|
68
|
+
*
|
|
69
|
+
* @param {!Array.<!shaka.text.Cue>} cues
|
|
70
|
+
* @param {!Array.<!shaka.text.Cue>} result
|
|
71
|
+
* @return {!Array.<!shaka.text.Cue>}
|
|
72
|
+
*/
|
|
73
|
+
static getCuesToFlatten(cues, result) {
|
|
74
|
+
for (const cue of cues) {
|
|
75
|
+
if (cue.isContainer) {
|
|
76
|
+
// Recurse to find the actual text payload cues.
|
|
77
|
+
shaka.text.Utils.getCuesToFlatten(cue.nestedCues, result);
|
|
78
|
+
} else {
|
|
79
|
+
// Flatten the payload.
|
|
80
|
+
const flatCue = cue.clone();
|
|
81
|
+
flatCue.nestedCues = [];
|
|
82
|
+
flatCue.payload = shaka.text.Utils.flattenPayload_(cue);
|
|
83
|
+
result.push(flatCue);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
@@ -617,12 +617,7 @@ shaka.text.UITextDisplayer = class {
|
|
|
617
617
|
// TODO: Implement lineAlignment of 'CENTER'.
|
|
618
618
|
if (cue.line != null) {
|
|
619
619
|
if (cue.lineInterpretation == Cue.lineInterpretation.PERCENTAGE) {
|
|
620
|
-
// When setting absolute positioning, you need to set x/y/width/height
|
|
621
|
-
// so the element is positioned correctly. Set these as default and
|
|
622
|
-
// other settings will override them.
|
|
623
620
|
style.position = 'absolute';
|
|
624
|
-
style.left = '0';
|
|
625
|
-
style.top = '0';
|
|
626
621
|
if (cue.writingMode == Cue.writingMode.HORIZONTAL_TOP_TO_BOTTOM) {
|
|
627
622
|
style.width = '100%';
|
|
628
623
|
if (cue.lineAlign == Cue.lineAlign.START) {
|