shaka-player 3.3.5 → 4.0.2
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/config.yml +1 -0
- package/.github/workflows/demo-version-index.yaml +8 -0
- package/.github/workflows/release-please.yaml +18 -2
- package/.github/workflows/sync-labels.yaml +33 -0
- package/.github/workflows/update-issues.yaml +29 -0
- package/.github/workflows/validate-pr-title.yaml +35 -0
- package/AUTHORS +1 -0
- package/CHANGELOG.md +215 -41
- package/CONTRIBUTORS +1 -0
- package/README.md +14 -11
- package/app-engine/demo-version-index/README.md +3 -3
- package/app-engine/demo-version-index/app.yaml +27 -1
- package/app-engine/demo-version-index/generate.py +164 -0
- package/app-engine/demo-version-index/main.py +4 -155
- package/app-engine/demo-version-index/requirements.txt +0 -1
- package/build/checkversion.py +1 -1
- package/build/compiler.py +1 -1
- package/build/misspellings.txt +1 -0
- package/build/shaka-lab.yaml +0 -2
- package/build/types/polyfill +0 -3
- package/demo/common/asset.js +17 -1
- package/demo/common/assets.js +29 -0
- package/demo/common/message_ids.js +6 -3
- package/demo/config.js +10 -11
- package/demo/custom.js +39 -0
- package/demo/demo.less +0 -1
- package/demo/demo_utils.js +0 -1
- package/demo/locales/en.json +6 -3
- package/demo/locales/source.json +22 -10
- package/demo/main.js +9 -6
- package/demo/search.js +2 -1
- package/dist/controls.css +3 -3
- package/dist/controls.css.map +1 -1
- package/dist/demo.compiled.debug.js +71 -64
- package/dist/demo.compiled.debug.map +3 -3
- package/dist/demo.compiled.js +71 -64
- package/dist/demo.compiled.map +3 -3
- package/dist/demo.css +1 -1
- package/dist/demo.css.map +1 -1
- package/dist/deps.js +17 -20
- package/dist/locales.js +33 -31
- package/dist/receiver.compiled.debug.js +32 -28
- package/dist/receiver.compiled.debug.map +3 -3
- package/dist/receiver.compiled.js +32 -28
- package/dist/receiver.compiled.map +3 -3
- package/dist/shaka-player.compiled.d.ts +311 -314
- package/dist/shaka-player.compiled.debug.d.ts +311 -314
- package/dist/shaka-player.compiled.debug.externs.js +126 -126
- package/dist/shaka-player.compiled.debug.js +430 -484
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +126 -126
- package/dist/shaka-player.compiled.js +829 -845
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +357 -358
- package/dist/shaka-player.ui.debug.d.ts +357 -358
- package/dist/shaka-player.ui.debug.externs.js +134 -126
- package/dist/shaka-player.ui.debug.js +489 -541
- package/dist/shaka-player.ui.debug.map +4 -4
- package/dist/shaka-player.ui.externs.js +134 -126
- package/dist/shaka-player.ui.js +988 -1000
- package/dist/shaka-player.ui.map +4 -4
- package/docs/tutorials/config.md +0 -2
- package/docs/tutorials/drm-config.md +5 -0
- package/docs/tutorials/fairplay.md +7 -22
- package/docs/tutorials/faq.md +0 -11
- package/docs/tutorials/index.json +2 -8
- package/docs/tutorials/plugins.md +1 -3
- package/docs/tutorials/upgrade.md +85 -11
- package/externs/polyfill.js +15 -0
- package/externs/shaka/manifest.js +5 -1
- package/externs/shaka/net.js +12 -0
- package/externs/shaka/offline.js +5 -1
- package/externs/shaka/player.js +39 -21
- package/externs/shaka/text.js +12 -12
- package/externs/sourcebuffer.js +15 -0
- package/lib/abr/simple_abr_manager.js +2 -1
- package/lib/ads/client_side_ad.js +13 -2
- package/lib/ads/client_side_ad_manager.js +22 -4
- package/lib/cast/cast_utils.js +0 -1
- package/lib/dash/content_protection.js +85 -5
- package/lib/dash/dash_parser.js +1 -0
- package/lib/hls/hls_parser.js +390 -747
- package/lib/hls/manifest_text_parser.js +2 -3
- package/lib/media/drm_engine.js +105 -37
- package/lib/media/gap_jumping_controller.js +10 -45
- package/lib/media/media_source_engine.js +150 -30
- package/lib/media/playhead.js +2 -5
- package/lib/media/presentation_timeline.js +1 -2
- package/lib/media/segment_index.js +13 -46
- package/lib/media/segment_reference.js +47 -1
- package/lib/media/streaming_engine.js +28 -11
- package/lib/media/time_ranges_utils.js +4 -9
- package/lib/net/networking_engine.js +3 -0
- package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
- package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
- package/lib/offline/manifest_converter.js +1 -0
- package/lib/offline/storage.js +8 -41
- package/lib/player.js +17 -201
- package/lib/polyfill/media_capabilities.js +12 -6
- package/lib/polyfill/mediasource.js +0 -28
- package/lib/polyfill/patchedmediakeys_nop.js +2 -0
- package/lib/polyfill/patchedmediakeys_webkit.js +2 -0
- package/lib/text/cue.js +0 -6
- package/lib/text/lrc_text_parser.js +8 -0
- package/lib/text/mp4_ttml_parser.js +8 -0
- package/lib/text/mp4_vtt_parser.js +8 -0
- package/lib/text/sbv_text_parser.js +8 -0
- package/lib/text/simple_text_displayer.js +1 -7
- package/lib/text/srt_text_parser.js +8 -0
- package/lib/text/ssa_text_parser.js +8 -0
- package/lib/text/text_engine.js +19 -3
- package/lib/text/ttml_text_parser.js +8 -0
- package/lib/text/ui_text_displayer.js +1 -7
- package/lib/text/vtt_text_parser.js +27 -5
- package/lib/text/web_vtt_generator.js +1 -7
- package/lib/util/error.js +9 -13
- package/lib/util/fairplay_utils.js +109 -0
- package/lib/util/functional.js +0 -42
- package/lib/util/mime_utils.js +16 -5
- package/lib/util/platform.js +45 -0
- package/lib/util/player_configuration.js +17 -6
- package/lib/util/pssh.js +23 -4
- package/lib/util/stream_utils.js +92 -22
- package/lib/util/uint8array_utils.js +0 -16
- package/lib/util/xml_utils.js +1 -1
- package/package.json +5 -2
- package/roadmap.md +19 -19
- package/shaka-player.uncompiled.js +0 -3
- package/test/dash/dash_parser_content_protection_unit.js +44 -0
- package/test/dash/dash_parser_segment_template_unit.js +3 -4
- package/test/demo/demo_unit.js +2 -1
- package/test/hls/hls_live_unit.js +155 -230
- package/test/hls/hls_parser_unit.js +515 -432
- package/test/media/drm_engine_unit.js +86 -120
- package/test/media/media_source_engine_integration.js +25 -3
- package/test/media/media_source_engine_unit.js +3 -2
- package/test/media/playhead_unit.js +27 -191
- package/test/media/segment_index_unit.js +15 -25
- package/test/media/streaming_engine_integration.js +2 -39
- package/test/media/streaming_engine_unit.js +3 -2
- package/test/media/time_ranges_utils_unit.js +0 -5
- package/test/offline/manifest_convert_unit.js +34 -4
- package/test/offline/offline_manifest_parser_unit.js +1 -0
- package/test/offline/storage_integration.js +5 -4
- package/test/player_external.js +0 -6
- package/test/player_integration.js +16 -0
- package/test/player_unit.js +26 -0
- package/test/test/util/fake_media_source_engine.js +11 -4
- package/test/test/util/manifest_generator.js +3 -1
- package/test/test/util/manifest_parser_util.js +4 -1
- package/test/test/util/offline_utils.js +1 -0
- package/test/test/util/streaming_engine_util.js +1 -0
- package/test/test/util/test_scheme.js +24 -1
- package/test/test/util/util.js +4 -4
- package/test/text/cue_integration.js +2 -2
- package/test/text/lrc_text_parser_unit.js +6 -7
- package/test/text/mp4_ttml_parser_unit.js +6 -4
- package/test/text/mp4_vtt_parser_unit.js +6 -5
- package/test/text/sbv_text_parser_unit.js +5 -6
- package/test/text/srt_text_parser_unit.js +5 -6
- package/test/text/ssa_text_parser_unit.js +17 -29
- package/test/text/text_engine_unit.js +45 -5
- package/test/text/ttml_text_parser_unit.js +77 -77
- package/test/text/vtt_text_parser_unit.js +116 -59
- package/test/ui/ui_integration.js +0 -16
- package/test/ui/ui_unit.js +27 -0
- package/test/util/cmcd_manager_unit.js +3 -0
- package/test/util/stream_utils_unit.js +23 -7
- package/ui/controls.js +65 -40
- package/ui/fullscreen_button.js +26 -6
- package/ui/less/containers.less +4 -4
- package/ui/less/general.less +1 -1
- package/ui/less/range_elements.less +1 -0
- package/ui/locales/en.json +1 -0
- package/ui/locales/source.json +5 -0
- package/ui/resolution_selection.js +31 -33
- package/ui/ui.js +0 -17
- package/.github/pull_request_template.md +0 -10
- package/docs/tutorials/upgrade-v2-5.md +0 -441
- package/docs/tutorials/upgrade-v3.md +0 -38
- package/lib/polyfill/mathround.js +0 -49
- package/lib/polyfill/patchedmediakeys_apple.js +0 -744
- package/lib/polyfill/patchedmediakeys_ms.js +0 -698
- package/test/util/functional_unit.js +0 -82
|
@@ -5,10 +5,10 @@ releases and demos at https://index-dot-shaka-player-demo.appspot.com/
|
|
|
5
5
|
|
|
6
6
|
- app.yaml: App Engine config file. Defines the runtime (Python 3).
|
|
7
7
|
|
|
8
|
-
-
|
|
9
|
-
|
|
8
|
+
- generate.py: A python script that generates the index's static content from
|
|
9
|
+
a template.
|
|
10
10
|
|
|
11
11
|
- requirements.txt: Used by App Engine to install the necessary Python server
|
|
12
|
-
requirements (Flask
|
|
12
|
+
requirements (Flask).
|
|
13
13
|
|
|
14
14
|
- templates/index.html: A Jinja2 template used to generate the index HTML.
|
|
@@ -1,2 +1,28 @@
|
|
|
1
|
+
# Copyright 2022 Google LLC
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
1
15
|
runtime: python39
|
|
2
|
-
default_expiration:
|
|
16
|
+
default_expiration: 1h
|
|
17
|
+
|
|
18
|
+
handlers:
|
|
19
|
+
# Server static/index.html as the root.
|
|
20
|
+
- url: /
|
|
21
|
+
secure: always
|
|
22
|
+
static_files: static/index.html
|
|
23
|
+
upload: static/index.html
|
|
24
|
+
# Any other requests are served from the static/ folder.
|
|
25
|
+
- url: /(.+)
|
|
26
|
+
secure: always
|
|
27
|
+
static_files: static/\1
|
|
28
|
+
upload: static/.+
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
# Shaka Player Version Index Generator
|
|
4
|
+
# Copyright 2022 Google LLC
|
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
6
|
+
|
|
7
|
+
# Generate an index of Shaka Player versions on appspot.
|
|
8
|
+
|
|
9
|
+
import collections
|
|
10
|
+
import jinja2
|
|
11
|
+
import os
|
|
12
|
+
import re
|
|
13
|
+
import subprocess
|
|
14
|
+
|
|
15
|
+
DEMO_URL_TEMPLATE = 'https://{0}-dot-shaka-player-demo.appspot.com/'
|
|
16
|
+
|
|
17
|
+
# In Google Hosted Libraries
|
|
18
|
+
HOSTED_URL_TEMPLATE = 'https://ajax.googleapis.com/ajax/libs/shaka-player/{0}/shaka-player.{1}'
|
|
19
|
+
|
|
20
|
+
# Before Google Hosted Libraries, v1 appspot URLs
|
|
21
|
+
V1_URL_TEMPLATE = 'https://{0}-dot-shaka-player-demo.appspot.com/shaka-player.{1}'
|
|
22
|
+
# Before Google Hosted Libraries, v2 appspot URLs
|
|
23
|
+
V2_URL_TEMPLATE = 'https://{0}-dot-shaka-player-demo.appspot.com/dist/shaka-player.{1}'
|
|
24
|
+
|
|
25
|
+
def version_to_demo_url(v):
|
|
26
|
+
return DEMO_URL_TEMPLATE.format(v.replace('.', '-'))
|
|
27
|
+
|
|
28
|
+
def version_to_lib_url(v):
|
|
29
|
+
if v == 'nightly':
|
|
30
|
+
return V2_URL_TEMPLATE.format(v, 'compiled.js')
|
|
31
|
+
elif (version_key(v) == version_key('v1.6.5') or
|
|
32
|
+
version_key(v) >= version_key('v2.0.6')):
|
|
33
|
+
return HOSTED_URL_TEMPLATE.format(v.replace('v', ''), 'compiled.js')
|
|
34
|
+
elif version_key(v) >= version_key('v2.0.0-beta'):
|
|
35
|
+
return V2_URL_TEMPLATE.format(v.replace('.', '-'), 'compiled.js')
|
|
36
|
+
else:
|
|
37
|
+
return V1_URL_TEMPLATE.format(v.replace('.', '-'), 'compiled.js')
|
|
38
|
+
|
|
39
|
+
def version_to_ui_lib_url(v):
|
|
40
|
+
if v == 'nightly':
|
|
41
|
+
return V2_URL_TEMPLATE.format(v, 'ui.js')
|
|
42
|
+
elif version_key(v) >= version_key('v2.5.0'):
|
|
43
|
+
return HOSTED_URL_TEMPLATE.format(v.replace('v', ''), 'ui.js')
|
|
44
|
+
else:
|
|
45
|
+
return None
|
|
46
|
+
|
|
47
|
+
def version_to_lib_externs_url(v):
|
|
48
|
+
if v == 'nightly':
|
|
49
|
+
return V2_URL_TEMPLATE.format(v, 'compiled.externs.js')
|
|
50
|
+
elif version_key(v) >= version_key('v2.0.6'):
|
|
51
|
+
return HOSTED_URL_TEMPLATE.format(v.replace('v', ''), 'compiled.externs.js')
|
|
52
|
+
else:
|
|
53
|
+
return None
|
|
54
|
+
|
|
55
|
+
def version_to_ui_lib_externs_url(v):
|
|
56
|
+
if v == 'nightly':
|
|
57
|
+
return V2_URL_TEMPLATE.format(v, 'ui.externs.js')
|
|
58
|
+
elif version_key(v) >= version_key('v2.5.0'):
|
|
59
|
+
return HOSTED_URL_TEMPLATE.format(v.replace('v', ''), 'ui.externs.js')
|
|
60
|
+
else:
|
|
61
|
+
return None
|
|
62
|
+
|
|
63
|
+
def version_to_lib_defs_url(v):
|
|
64
|
+
if v == 'nightly':
|
|
65
|
+
return V2_URL_TEMPLATE.format(v, 'compiled.d.ts')
|
|
66
|
+
elif version_key(v) >= version_key('v3.0.6'):
|
|
67
|
+
return HOSTED_URL_TEMPLATE.format(v.replace('v', ''), 'compiled.d.ts')
|
|
68
|
+
else:
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
def version_to_ui_lib_defs_url(v):
|
|
72
|
+
if v == 'nightly':
|
|
73
|
+
return V2_URL_TEMPLATE.format(v, 'ui.d.ts')
|
|
74
|
+
elif version_key(v) >= version_key('v3.0.6'):
|
|
75
|
+
return HOSTED_URL_TEMPLATE.format(v.replace('v', ''), 'ui.d.ts')
|
|
76
|
+
else:
|
|
77
|
+
return None
|
|
78
|
+
|
|
79
|
+
def version_to_metadata(v):
|
|
80
|
+
return {
|
|
81
|
+
'version': v,
|
|
82
|
+
'best': False, # Corrected later in another loop
|
|
83
|
+
'demo': version_to_demo_url(v),
|
|
84
|
+
'lib': version_to_lib_url(v),
|
|
85
|
+
'ui_lib': version_to_ui_lib_url(v),
|
|
86
|
+
'lib_externs': version_to_lib_externs_url(v),
|
|
87
|
+
'ui_lib_externs': version_to_ui_lib_externs_url(v),
|
|
88
|
+
'lib_defs': version_to_lib_defs_url(v),
|
|
89
|
+
'ui_lib_defs': version_to_ui_lib_defs_url(v),
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
def is_release_tag(name):
|
|
93
|
+
matches = re.match(r'v\d+\.\d+\.\d+(-.+)?', name)
|
|
94
|
+
# Doesn't match, not a version tag.
|
|
95
|
+
if not matches:
|
|
96
|
+
return False
|
|
97
|
+
# A "master" (old) or "main" (new) tag, indicating the state of the main
|
|
98
|
+
# branch at the time of a release. Not an actual version in itself, though.
|
|
99
|
+
if matches.group(1) == '-master' or matches.group(1) == '-main':
|
|
100
|
+
return False
|
|
101
|
+
# For historical reasons, these oldest few tags are not currently deployed to
|
|
102
|
+
# appengine. All other matching tags are, though.
|
|
103
|
+
if name in ['v1.2.0', 'v1.2.1', 'v1.2.2', 'v1.2.3']:
|
|
104
|
+
return False
|
|
105
|
+
return True
|
|
106
|
+
|
|
107
|
+
def version_key(version):
|
|
108
|
+
if version == 'nightly':
|
|
109
|
+
# A false version number for nightly, greater than any actual release
|
|
110
|
+
# version.
|
|
111
|
+
return [float('inf')]
|
|
112
|
+
|
|
113
|
+
assert version[0] == 'v'
|
|
114
|
+
main_version, _, suffix = version[1:].partition('-')
|
|
115
|
+
if not suffix:
|
|
116
|
+
suffix = '}}}' # this puts main releases after prerelease versions
|
|
117
|
+
version_tuple = [int(x) for x in main_version.split('.')]
|
|
118
|
+
return version_tuple + [suffix]
|
|
119
|
+
|
|
120
|
+
def get_release_tags():
|
|
121
|
+
output = subprocess.check_output(['git', 'tag'], text=True)
|
|
122
|
+
return list(filter(is_release_tag, output.split('\n')))
|
|
123
|
+
|
|
124
|
+
def generate():
|
|
125
|
+
# Get all release tags.
|
|
126
|
+
versions = get_release_tags()
|
|
127
|
+
# Now sort, putting prerelease versions ahead of the corresponding release.
|
|
128
|
+
versions.sort(key=version_key)
|
|
129
|
+
|
|
130
|
+
version_metadata = collections.OrderedDict()
|
|
131
|
+
latest_by_branch = {}
|
|
132
|
+
for v in versions:
|
|
133
|
+
version_metadata[v] = version_to_metadata(v)
|
|
134
|
+
|
|
135
|
+
# Because |versions| is already sorted, we can just overwrite the entry
|
|
136
|
+
# in the latest_by_branch dictionary.
|
|
137
|
+
branch_key = tuple(version_key(v)[0:2])
|
|
138
|
+
latest_by_branch[branch_key] = v
|
|
139
|
+
|
|
140
|
+
for v in latest_by_branch.values():
|
|
141
|
+
version_metadata[v]['best'] = True
|
|
142
|
+
|
|
143
|
+
# Append nightly rather than filter for it, so that it always appears at the
|
|
144
|
+
# end of the list.
|
|
145
|
+
version_metadata['nightly'] = version_to_metadata('nightly')
|
|
146
|
+
version_metadata['nightly']['best'] = True
|
|
147
|
+
|
|
148
|
+
# Debug: uncomment to see a list of version metadata objects.
|
|
149
|
+
#for i in version_metadata.values(): print(i)
|
|
150
|
+
|
|
151
|
+
script_path = os.path.dirname(__file__)
|
|
152
|
+
template_path = os.path.join(script_path, 'templates', 'index.html')
|
|
153
|
+
output_path = os.path.join(script_path, 'static', 'index.html')
|
|
154
|
+
|
|
155
|
+
os.makedirs(os.path.dirname(output_path), exist_ok=True)
|
|
156
|
+
|
|
157
|
+
with open(template_path, 'r') as template_file:
|
|
158
|
+
with open(output_path, 'w') as output_file:
|
|
159
|
+
template = jinja2.Template(template_file.read())
|
|
160
|
+
output = template.render(versions=version_metadata.values())
|
|
161
|
+
output_file.write(output)
|
|
162
|
+
|
|
163
|
+
if __name__ == '__main__':
|
|
164
|
+
generate()
|
|
@@ -2,161 +2,10 @@
|
|
|
2
2
|
# Copyright 2022 Google LLC
|
|
3
3
|
# SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
|
|
5
|
-
#
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import google.appengine.api.modules
|
|
9
|
-
import jinja2
|
|
10
|
-
import os
|
|
11
|
-
import random
|
|
12
|
-
import re
|
|
13
|
-
|
|
14
|
-
from flask import Flask, render_template
|
|
15
|
-
|
|
16
|
-
DEMO_URL_TEMPLATE = 'https://{0}-dot-shaka-player-demo.appspot.com/'
|
|
17
|
-
|
|
18
|
-
# In Google Hosted Libraries
|
|
19
|
-
HOSTED_URL_TEMPLATE = 'https://ajax.googleapis.com/ajax/libs/shaka-player/{0}/shaka-player.{1}'
|
|
20
|
-
|
|
21
|
-
# Before Google Hosted Libraries, v1 appspot URLs
|
|
22
|
-
V1_URL_TEMPLATE = 'https://{0}-dot-shaka-player-demo.appspot.com/shaka-player.{1}'
|
|
23
|
-
# Before Google Hosted Libraries, v2 appspot URLs
|
|
24
|
-
V2_URL_TEMPLATE = 'https://{0}-dot-shaka-player-demo.appspot.com/dist/shaka-player.{1}'
|
|
25
|
-
|
|
26
|
-
def version_to_demo_url(v):
|
|
27
|
-
return DEMO_URL_TEMPLATE.format(v.replace('.', '-'))
|
|
28
|
-
|
|
29
|
-
def version_to_lib_url(v):
|
|
30
|
-
if v == 'nightly':
|
|
31
|
-
return V2_URL_TEMPLATE.format(v, 'compiled.js')
|
|
32
|
-
elif (version_key(v) == version_key('v1.6.5') or
|
|
33
|
-
version_key(v) >= version_key('v2.0.6')):
|
|
34
|
-
return HOSTED_URL_TEMPLATE.format(v.replace('v', ''), 'compiled.js')
|
|
35
|
-
elif version_key(v) >= version_key('v2.0.0-beta'):
|
|
36
|
-
return V2_URL_TEMPLATE.format(v.replace('.', '-'), 'compiled.js')
|
|
37
|
-
else:
|
|
38
|
-
return V1_URL_TEMPLATE.format(v.replace('.', '-'), 'compiled.js')
|
|
39
|
-
|
|
40
|
-
def version_to_ui_lib_url(v):
|
|
41
|
-
if v == 'nightly':
|
|
42
|
-
return V2_URL_TEMPLATE.format(v, 'ui.js')
|
|
43
|
-
elif version_key(v) >= version_key('v2.5.0'):
|
|
44
|
-
return HOSTED_URL_TEMPLATE.format(v.replace('v', ''), 'ui.js')
|
|
45
|
-
else:
|
|
46
|
-
return None
|
|
47
|
-
|
|
48
|
-
def version_to_lib_externs_url(v):
|
|
49
|
-
if v == 'nightly':
|
|
50
|
-
return V2_URL_TEMPLATE.format(v, 'compiled.externs.js')
|
|
51
|
-
elif version_key(v) >= version_key('v2.0.6'):
|
|
52
|
-
return HOSTED_URL_TEMPLATE.format(v.replace('v', ''), 'compiled.externs.js')
|
|
53
|
-
else:
|
|
54
|
-
return None
|
|
55
|
-
|
|
56
|
-
def version_to_ui_lib_externs_url(v):
|
|
57
|
-
if v == 'nightly':
|
|
58
|
-
return V2_URL_TEMPLATE.format(v, 'ui.externs.js')
|
|
59
|
-
elif version_key(v) >= version_key('v2.5.0'):
|
|
60
|
-
return HOSTED_URL_TEMPLATE.format(v.replace('v', ''), 'ui.externs.js')
|
|
61
|
-
else:
|
|
62
|
-
return None
|
|
63
|
-
|
|
64
|
-
def version_to_lib_defs_url(v):
|
|
65
|
-
if v == 'nightly':
|
|
66
|
-
return V2_URL_TEMPLATE.format(v, 'compiled.d.ts')
|
|
67
|
-
elif version_key(v) >= version_key('v3.0.6'):
|
|
68
|
-
return HOSTED_URL_TEMPLATE.format(v.replace('v', ''), 'compiled.d.ts')
|
|
69
|
-
else:
|
|
70
|
-
return None
|
|
71
|
-
|
|
72
|
-
def version_to_ui_lib_defs_url(v):
|
|
73
|
-
if v == 'nightly':
|
|
74
|
-
return V2_URL_TEMPLATE.format(v, 'ui.d.ts')
|
|
75
|
-
elif version_key(v) >= version_key('v3.0.6'):
|
|
76
|
-
return HOSTED_URL_TEMPLATE.format(v.replace('v', ''), 'ui.d.ts')
|
|
77
|
-
else:
|
|
78
|
-
return None
|
|
79
|
-
|
|
80
|
-
def version_to_metadata(v):
|
|
81
|
-
return {
|
|
82
|
-
'version': v,
|
|
83
|
-
'best': False, # Corrected later in another loop
|
|
84
|
-
'demo': version_to_demo_url(v),
|
|
85
|
-
'lib': version_to_lib_url(v),
|
|
86
|
-
'ui_lib': version_to_ui_lib_url(v),
|
|
87
|
-
'lib_externs': version_to_lib_externs_url(v),
|
|
88
|
-
'ui_lib_externs': version_to_ui_lib_externs_url(v),
|
|
89
|
-
'lib_defs': version_to_lib_defs_url(v),
|
|
90
|
-
'ui_lib_defs': version_to_ui_lib_defs_url(v),
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
def is_release_version(name):
|
|
94
|
-
return re.match(r'v\d+-\d+-\d+(?:-.+)?', name)
|
|
95
|
-
|
|
96
|
-
def appengine_version_to_package_version(version):
|
|
97
|
-
# Replace the first two dashes with dots. More dashes indicate a prerelease
|
|
98
|
-
# version, as seen in "v2.0.0-beta3".
|
|
99
|
-
return version.replace('-', '.', 2)
|
|
100
|
-
|
|
101
|
-
def version_key(version):
|
|
102
|
-
if version == 'nightly':
|
|
103
|
-
# A false version number for nightly, greater than any actual release
|
|
104
|
-
# version.
|
|
105
|
-
return [float('inf')]
|
|
106
|
-
|
|
107
|
-
assert version[0] == 'v'
|
|
108
|
-
main_version, _, suffix = version[1:].partition('-')
|
|
109
|
-
if not suffix:
|
|
110
|
-
suffix = '}}}' # this puts main releases after prerelease versions
|
|
111
|
-
version_tuple = [int(x) for x in main_version.split('.')]
|
|
112
|
-
return version_tuple + [suffix]
|
|
113
|
-
|
|
114
|
-
def get_appengine_versions():
|
|
115
|
-
if os.getenv('GAE_ENV', '').startswith('standard'):
|
|
116
|
-
# NOTE: this doesn't return anything useful in a local dev server.
|
|
117
|
-
return google.appengine.api.modules.modules.get_versions()
|
|
118
|
-
|
|
119
|
-
# For a local dev server, fake it so we can test sorting.
|
|
120
|
-
fake_versions = [
|
|
121
|
-
'v1-6-0', 'v1-6-1', 'v1-6-2', 'v1-6-3', 'v1-6-4', 'v1-6-5',
|
|
122
|
-
'v2-0-0-beta', 'v2-0-0-beta2', 'v2-0-0-beta3', 'v2-0-0',
|
|
123
|
-
'v2-1-0', 'v2-1-1', 'v2-1-2',
|
|
124
|
-
'v2-2-1', 'v2-2-2-beta', 'v2-2-2-beta2', 'v2-2-2', 'v2-2-9', 'v2-2-10',
|
|
125
|
-
]
|
|
126
|
-
random.shuffle(fake_versions) # in-place shuffle
|
|
127
|
-
return fake_versions
|
|
5
|
+
# In the App Engine Python 3 runtime, you must have an entrypoint, even if all
|
|
6
|
+
# content is static and no routes are defined. This seems pretty weird, and
|
|
7
|
+
# wasn't required in the Python 2 runtime.
|
|
128
8
|
|
|
9
|
+
from flask import Flask
|
|
129
10
|
|
|
130
11
|
app = Flask(__name__)
|
|
131
|
-
|
|
132
|
-
@app.route('/')
|
|
133
|
-
def root():
|
|
134
|
-
appengine_versions = get_appengine_versions()
|
|
135
|
-
# Filter for release versions only.
|
|
136
|
-
appengine_versions = filter(is_release_version, appengine_versions)
|
|
137
|
-
|
|
138
|
-
# Now convert from appengine versions (v2-0-0) to package versions (v2.0.0).
|
|
139
|
-
versions = list(map(appengine_version_to_package_version, appengine_versions))
|
|
140
|
-
# Now sort, putting prerelease versions ahead of the corresponding release.
|
|
141
|
-
versions.sort(key=version_key)
|
|
142
|
-
|
|
143
|
-
version_metadata = collections.OrderedDict()
|
|
144
|
-
latest_by_branch = {}
|
|
145
|
-
for v in versions:
|
|
146
|
-
version_metadata[v] = version_to_metadata(v)
|
|
147
|
-
|
|
148
|
-
# Because |versions| is already sorted, we can just overwrite the entry
|
|
149
|
-
# in the latest_by_branch dictionary.
|
|
150
|
-
branch_key = tuple(version_key(v)[0:2])
|
|
151
|
-
latest_by_branch[branch_key] = v
|
|
152
|
-
|
|
153
|
-
for v in latest_by_branch.values():
|
|
154
|
-
version_metadata[v]['best'] = True
|
|
155
|
-
|
|
156
|
-
# Append nightly rather than filter for it, so that it always appears at the
|
|
157
|
-
# end of the list.
|
|
158
|
-
version_metadata['nightly'] = version_to_metadata('nightly')
|
|
159
|
-
version_metadata['nightly']['best'] = True
|
|
160
|
-
|
|
161
|
-
for i in version_metadata.values(): print(i)
|
|
162
|
-
return render_template('index.html', versions=version_metadata.values())
|
package/build/checkversion.py
CHANGED
package/build/compiler.py
CHANGED
|
@@ -287,7 +287,7 @@ class Less(object):
|
|
|
287
287
|
cmd_line = lessc + less_options + [self.main_source_file, self.output]
|
|
288
288
|
|
|
289
289
|
if shakaBuildHelpers.execute_get_code(cmd_line) != 0:
|
|
290
|
-
logging.error('
|
|
290
|
+
logging.error('CSS compilation failed')
|
|
291
291
|
return False
|
|
292
292
|
|
|
293
293
|
# We need to prepend the license header to the compiled CSS.
|
package/build/misspellings.txt
CHANGED
package/build/shaka-lab.yaml
CHANGED
package/build/types/polyfill
CHANGED
|
@@ -4,12 +4,9 @@
|
|
|
4
4
|
+../../lib/polyfill/aria.js
|
|
5
5
|
+../../lib/polyfill/encryption_scheme.js
|
|
6
6
|
+../../lib/polyfill/fullscreen.js
|
|
7
|
-
+../../lib/polyfill/mathround.js
|
|
8
7
|
+../../lib/polyfill/mediasource.js
|
|
9
8
|
+../../lib/polyfill/media_capabilities.js
|
|
10
9
|
+../../lib/polyfill/orientation.js
|
|
11
|
-
+../../lib/polyfill/patchedmediakeys_apple.js
|
|
12
|
-
+../../lib/polyfill/patchedmediakeys_ms.js
|
|
13
10
|
+../../lib/polyfill/patchedmediakeys_nop.js
|
|
14
11
|
+../../lib/polyfill/patchedmediakeys_webkit.js
|
|
15
12
|
+../../lib/polyfill/pip_webkit.js
|
package/demo/common/asset.js
CHANGED
|
@@ -77,6 +77,8 @@ const ShakaDemoAssetInfo = class {
|
|
|
77
77
|
this.imaContentSrcId = null;
|
|
78
78
|
/** @type {?string} */
|
|
79
79
|
this.mimeType = null;
|
|
80
|
+
/** @type {?string} */
|
|
81
|
+
this.mediaPlaylistFullMimeType = null;
|
|
80
82
|
|
|
81
83
|
|
|
82
84
|
// Offline storage values.
|
|
@@ -161,6 +163,15 @@ const ShakaDemoAssetInfo = class {
|
|
|
161
163
|
return this.drm.length == 1 && this.drm[0] == shakaAssets.KeySystem.CLEAR;
|
|
162
164
|
}
|
|
163
165
|
|
|
166
|
+
/**
|
|
167
|
+
* @param {string} mediaPlaylistFullMimeType
|
|
168
|
+
* @return {!ShakaDemoAssetInfo}
|
|
169
|
+
*/
|
|
170
|
+
setMediaPlaylistFullMimeType(mediaPlaylistFullMimeType) {
|
|
171
|
+
this.mediaPlaylistFullMimeType = mediaPlaylistFullMimeType;
|
|
172
|
+
return this;
|
|
173
|
+
}
|
|
174
|
+
|
|
164
175
|
/**
|
|
165
176
|
* @param {!Object} extraConfig
|
|
166
177
|
* @return {!ShakaDemoAssetInfo}
|
|
@@ -368,7 +379,7 @@ const ShakaDemoAssetInfo = class {
|
|
|
368
379
|
*/
|
|
369
380
|
getConfiguration() {
|
|
370
381
|
const config = /** @type {shaka.extern.PlayerConfiguration} */(
|
|
371
|
-
{drm: {advanced: {}}, manifest: {dash: {}}});
|
|
382
|
+
{drm: {advanced: {}}, manifest: {dash: {}, hls: {}}});
|
|
372
383
|
|
|
373
384
|
if (this.extraConfig) {
|
|
374
385
|
for (const key in this.extraConfig) {
|
|
@@ -376,6 +387,11 @@ const ShakaDemoAssetInfo = class {
|
|
|
376
387
|
}
|
|
377
388
|
}
|
|
378
389
|
|
|
390
|
+
if (this.mediaPlaylistFullMimeType) {
|
|
391
|
+
config.manifest.hls.mediaPlaylistFullMimeType =
|
|
392
|
+
this.mediaPlaylistFullMimeType;
|
|
393
|
+
}
|
|
394
|
+
|
|
379
395
|
if (this.licenseServers.size) {
|
|
380
396
|
config.drm.servers = config.drm.servers || {};
|
|
381
397
|
this.licenseServers.forEach((value, key) => {
|
package/demo/common/assets.js
CHANGED
|
@@ -125,6 +125,8 @@ shakaAssets.Feature = {
|
|
|
125
125
|
MP4: shakaDemo.MessageIds.MP4,
|
|
126
126
|
// Set if the asset has at least one MPEG-2 TS stream.
|
|
127
127
|
MP2TS: shakaDemo.MessageIds.MP2TS,
|
|
128
|
+
// Set if the asset has at least one containerless stream (AAC, etc).
|
|
129
|
+
CONTAINERLESS: shakaDemo.MessageIds.CONTAINERLESS,
|
|
128
130
|
|
|
129
131
|
// Set if the asset has at least one stream that is at least 720p.
|
|
130
132
|
HIGH_DEFINITION: shakaDemo.MessageIds.HIGH_DEFINITION,
|
|
@@ -294,6 +296,15 @@ shakaAssets.testAssets = [
|
|
|
294
296
|
.addFeature(shakaAssets.Feature.SUBTITLES)
|
|
295
297
|
.addFeature(shakaAssets.Feature.SURROUND)
|
|
296
298
|
.addFeature(shakaAssets.Feature.OFFLINE),
|
|
299
|
+
new ShakaDemoAssetInfo(
|
|
300
|
+
/* name= */ 'Angel One (HLS, MP4, video media playlist only)',
|
|
301
|
+
/* iconUri= */ 'https://storage.googleapis.com/shaka-asset-icons/angel_one.png',
|
|
302
|
+
/* manifestUri= */ 'https://storage.googleapis.com/shaka-demo-assets/angel-one-hls/playlist_v-0480p-1000k-libx264.mp4.m3u8',
|
|
303
|
+
/* source= */ shakaAssets.Source.SHAKA)
|
|
304
|
+
.addFeature(shakaAssets.Feature.HLS)
|
|
305
|
+
.addFeature(shakaAssets.Feature.MP4)
|
|
306
|
+
.addFeature(shakaAssets.Feature.OFFLINE)
|
|
307
|
+
.setMediaPlaylistFullMimeType('video/mp4; codecs="avc1.4d401f"'),
|
|
297
308
|
new ShakaDemoAssetInfo(
|
|
298
309
|
/* name= */ 'Angel One (HLS, MP4, multilingual, Widevine)',
|
|
299
310
|
/* iconUri= */ 'https://storage.googleapis.com/shaka-asset-icons/angel_one.png',
|
|
@@ -1190,6 +1201,24 @@ shakaAssets.testAssets = [
|
|
|
1190
1201
|
.addFeature(shakaAssets.Feature.HLS)
|
|
1191
1202
|
.addFeature(shakaAssets.Feature.LIVE)
|
|
1192
1203
|
.addFeature(shakaAssets.Feature.MP4),
|
|
1204
|
+
new ShakaDemoAssetInfo(
|
|
1205
|
+
/* name= */ 'Audio only HLS with raw AAC',
|
|
1206
|
+
/* iconUri= */ 'https://storage.googleapis.com/shaka-asset-icons/apple_test_pattern.png',
|
|
1207
|
+
/* manifestUri= */ 'https://storage.googleapis.com/shaka-demo-assets/raw-hls-audio-only/manifest.m3u8',
|
|
1208
|
+
/* source= */ shakaAssets.Source.APPLE)
|
|
1209
|
+
.addFeature(shakaAssets.Feature.HLS)
|
|
1210
|
+
.addFeature(shakaAssets.Feature.CONTAINERLESS)
|
|
1211
|
+
.addFeature(shakaAssets.Feature.AUDIO_ONLY),
|
|
1212
|
+
new ShakaDemoAssetInfo(
|
|
1213
|
+
/* name= */ 'Apple Advanced HLS Stream (TS) with raw AAC',
|
|
1214
|
+
/* iconUri= */ 'https://storage.googleapis.com/shaka-asset-icons/apple_test_pattern.png',
|
|
1215
|
+
/* manifestUri= */ 'https://devstreaming-cdn.apple.com/videos/streaming/examples/img_bipbop_adv_example_ts/master.m3u8',
|
|
1216
|
+
/* source= */ shakaAssets.Source.APPLE)
|
|
1217
|
+
.addFeature(shakaAssets.Feature.HLS)
|
|
1218
|
+
.addFeature(shakaAssets.Feature.MP2TS)
|
|
1219
|
+
.addFeature(shakaAssets.Feature.CONTAINERLESS)
|
|
1220
|
+
.addFeature(shakaAssets.Feature.HIGH_DEFINITION)
|
|
1221
|
+
.addFeature(shakaAssets.Feature.OFFLINE),
|
|
1193
1222
|
// }}}
|
|
1194
1223
|
|
|
1195
1224
|
// IRT assets {{{
|
|
@@ -13,6 +13,7 @@ shakaDemo.MessageIds = {
|
|
|
13
13
|
ADS: 'DEMO_ADS',
|
|
14
14
|
AUDIO_ONLY: 'DEMO_AUDIO_ONLY',
|
|
15
15
|
CAPTIONS: 'DEMO_CAPTIONS',
|
|
16
|
+
CONTAINERLESS: 'DEMO_CONTAINERLESS',
|
|
16
17
|
DASH: 'DEMO_DASH',
|
|
17
18
|
HIGH_DEFINITION: 'DEMO_HIGH_DEFINITION',
|
|
18
19
|
HLS: 'DEMO_HLS',
|
|
@@ -106,6 +107,8 @@ shakaDemo.MessageIds = {
|
|
|
106
107
|
DRM_SYSTEM: 'DEMO_DRM_SYSTEM',
|
|
107
108
|
DRM_TAB: 'DEMO_DRM_TAB',
|
|
108
109
|
EDIT_CUSTOM: 'DEMO_EDIT_CUSTOM',
|
|
110
|
+
HLS_FULL_MIME_TYPE: 'DEMO_HLS_FULL_MIME_TYPE',
|
|
111
|
+
HLS_TAB: 'DEMO_HLS_TAB',
|
|
109
112
|
HEADERS_TAB: 'DEMO_HEADERS_TAB',
|
|
110
113
|
ICON_URL: 'DEMO_ICON_URL',
|
|
111
114
|
LICENSE_CERTIFICATE_URL: 'DEMO_LICENSE_CERTIFICATE_URL',
|
|
@@ -187,12 +190,11 @@ shakaDemo.MessageIds = {
|
|
|
187
190
|
IGNORE_DASH_SUGGESTED_PRESENTATION_DELAY: 'DEMO_IGNORE_DASH_SUGGESTED_PRESENTATION_DELAY',
|
|
188
191
|
IGNORE_HLS_IMAGE_FAILURES: 'DEMO_IGNORE_HLS_IMAGE_FAILURES',
|
|
189
192
|
IGNORE_HLS_TEXT_FAILURES: 'DEMO_IGNORE_HLS_TEXT_FAILURES',
|
|
190
|
-
|
|
193
|
+
IGNORE_MANIFEST_PROGRAM_DATE_TIME: 'DEMO_IGNORE_MANIFEST_PROGRAM_DATE_TIME',
|
|
191
194
|
IGNORE_MIN_BUFFER_TIME: 'DEMO_IGNORE_MIN_BUFFER_TIME',
|
|
192
195
|
IGNORE_TEXT_FAILURES: 'DEMO_IGNORE_TEXT_FAILURES',
|
|
193
196
|
INACCURATE_MANIFEST_TOLERANCE: 'DEMO_INACCURATE_MANIFEST_TOLERANCE',
|
|
194
197
|
INITIAL_SEGMENT_LIMIT: 'DEMO_INITIAL_SEGMENT_LIMIT',
|
|
195
|
-
JUMP_LARGE_GAPS: 'DEMO_JUMP_LARGE_GAPS',
|
|
196
198
|
LANGUAGE_SECTION_HEADER: 'DEMO_LANGUAGE_SECTION_HEADER',
|
|
197
199
|
LOG_LEVEL: 'DEMO_LOG_LEVEL',
|
|
198
200
|
LOG_LEVEL_DEBUG: 'DEMO_LOG_LEVEL_DEBUG',
|
|
@@ -208,7 +210,6 @@ shakaDemo.MessageIds = {
|
|
|
208
210
|
MAX_FRAMERATE: 'DEMO_MAX_FRAMERATE',
|
|
209
211
|
MAX_HEIGHT: 'DEMO_MAX_HEIGHT',
|
|
210
212
|
MAX_PIXELS: 'DEMO_MAX_PIXELS',
|
|
211
|
-
MAX_SMALL_GAP_SIZE: 'DEMO_MAX_SMALL_GAP_SIZE',
|
|
212
213
|
MAX_WIDTH: 'DEMO_MAX_WIDTH',
|
|
213
214
|
MIN_BANDWIDTH: 'DEMO_MIN_BANDWIDTH',
|
|
214
215
|
MIN_BYTES: 'DEMO_MIN_BYTES',
|
|
@@ -222,6 +223,7 @@ shakaDemo.MessageIds = {
|
|
|
222
223
|
NUMBER_INTEGER_WARNING: 'DEMO_NUMBER_INTEGER_WARNING',
|
|
223
224
|
NUMBER_NONZERO_DECIMAL_WARNING: 'DEMO_NUMBER_NONZERO_DECIMAL_WARNING',
|
|
224
225
|
NUMBER_NONZERO_INTEGER_WARNING: 'DEMO_NUMBER_NONZERO_INTEGER_WARNING',
|
|
226
|
+
NUMBER_OF_PARALLEL_DOWNLOADS: 'DEMO_NUMBER_OF_PARALLEL_DOWNLOADS',
|
|
225
227
|
OFFLINE_SECTION_HEADER: 'DEMO_OFFLINE_SECTION_HEADER',
|
|
226
228
|
PREFER_FORCED_SUBS: 'DEMO_PREFER_FORCED_SUBS',
|
|
227
229
|
PREFER_NATIVE_HLS: 'DEMO_PREFER_NATIVE_HLS',
|
|
@@ -229,6 +231,7 @@ shakaDemo.MessageIds = {
|
|
|
229
231
|
RESTRICTIONS_SECTION_HEADER: 'DEMO_RESTRICTIONS_SECTION_HEADER',
|
|
230
232
|
SAFE_SEEK_OFFSET: 'DEMO_SAFE_SEEK_OFFSET',
|
|
231
233
|
SAFE_SKIP_DISTANCE: 'DEMO_SAFE_SKIP_DISTANCE',
|
|
234
|
+
SEGMENT_RELATIVE_VTT_TIMING: 'DEMO_SEGMENT_RELATIVE_VTT_TIMING',
|
|
232
235
|
SESSION_ID: 'DEMO_SESSION_ID',
|
|
233
236
|
SHAKA_CONTROLS: 'DEMO_SHAKA_CONTROLS',
|
|
234
237
|
SLOW_HALF_LIFE: 'DEMO_SLOW_HALF_LIFE',
|
package/demo/config.js
CHANGED
|
@@ -208,12 +208,12 @@ shakaDemo.Config = class {
|
|
|
208
208
|
'manifest.hls.ignoreTextStreamFailures')
|
|
209
209
|
.addBoolInput_(MessageIds.IGNORE_HLS_IMAGE_FAILURES,
|
|
210
210
|
'manifest.hls.ignoreImageStreamFailures')
|
|
211
|
-
.addBoolInput_(MessageIds.USE_FULL_SEGMENTS_FOR_START_TIME,
|
|
212
|
-
'manifest.hls.useFullSegmentsForStartTime')
|
|
213
211
|
.addTextInput_(MessageIds.DEFAULT_AUDIO_CODEC,
|
|
214
212
|
'manifest.hls.defaultAudioCodec')
|
|
215
213
|
.addTextInput_(MessageIds.DEFAULT_VIDEO_CODEC,
|
|
216
214
|
'manifest.hls.defaultVideoCodec')
|
|
215
|
+
.addBoolInput_(MessageIds.IGNORE_MANIFEST_PROGRAM_DATE_TIME,
|
|
216
|
+
'manifest.hls.ignoreManifestProgramDateTime')
|
|
217
217
|
.addNumberInput_(MessageIds.AVAILABILITY_WINDOW_OVERRIDE,
|
|
218
218
|
'manifest.availabilityWindowOverride',
|
|
219
219
|
/* canBeDecimal= */ true,
|
|
@@ -236,7 +236,9 @@ shakaDemo.Config = class {
|
|
|
236
236
|
.addBoolInput_(MessageIds.DISABLE_TEXT,
|
|
237
237
|
'manifest.disableText')
|
|
238
238
|
.addBoolInput_(MessageIds.DISABLE_THUMBNAILS,
|
|
239
|
-
'manifest.disableThumbnails')
|
|
239
|
+
'manifest.disableThumbnails')
|
|
240
|
+
.addBoolInput_(MessageIds.SEGMENT_RELATIVE_VTT_TIMING,
|
|
241
|
+
'manifest.segmentRelativeVttTiming');
|
|
240
242
|
|
|
241
243
|
this.addRetrySection_('manifest', MessageIds.MANIFEST_RETRY_SECTION_HEADER);
|
|
242
244
|
}
|
|
@@ -339,7 +341,9 @@ shakaDemo.Config = class {
|
|
|
339
341
|
const docLink = this.resolveExternLink_('.OfflineConfiguration');
|
|
340
342
|
this.addSection_(MessageIds.OFFLINE_SECTION_HEADER, docLink)
|
|
341
343
|
.addBoolInput_(MessageIds.USE_PERSISTENT_LICENSES,
|
|
342
|
-
'offline.usePersistentLicense')
|
|
344
|
+
'offline.usePersistentLicense')
|
|
345
|
+
.addNumberInput_(MessageIds.NUMBER_OF_PARALLEL_DOWNLOADS,
|
|
346
|
+
'offline.numberOfParallelDownloads');
|
|
343
347
|
}
|
|
344
348
|
|
|
345
349
|
/** @private */
|
|
@@ -350,9 +354,6 @@ shakaDemo.Config = class {
|
|
|
350
354
|
.addNumberInput_(MessageIds.GAP_DETECTION_THRESHOLD,
|
|
351
355
|
'streaming.gapDetectionThreshold',
|
|
352
356
|
/* canBeDecimal= */ true)
|
|
353
|
-
.addNumberInput_(MessageIds.MAX_SMALL_GAP_SIZE,
|
|
354
|
-
'streaming.smallGapLimit',
|
|
355
|
-
/* canBeDecimal= */ true)
|
|
356
357
|
.addNumberInput_(MessageIds.BUFFERING_GOAL,
|
|
357
358
|
'streaming.bufferingGoal',
|
|
358
359
|
/* canBeDecimal= */ true)
|
|
@@ -405,10 +406,8 @@ shakaDemo.Config = class {
|
|
|
405
406
|
this.latestInput_.input().checked = true;
|
|
406
407
|
}
|
|
407
408
|
|
|
408
|
-
this.addBoolInput_(MessageIds.
|
|
409
|
-
'streaming.
|
|
410
|
-
.addBoolInput_(MessageIds.FORCE_TRANSMUX_TS,
|
|
411
|
-
'streaming.forceTransmuxTS')
|
|
409
|
+
this.addBoolInput_(MessageIds.FORCE_TRANSMUX_TS,
|
|
410
|
+
'streaming.forceTransmuxTS')
|
|
412
411
|
.addBoolInput_(MessageIds.START_AT_SEGMENT_BOUNDARY,
|
|
413
412
|
'streaming.startAtSegmentBoundary')
|
|
414
413
|
.addBoolInput_(MessageIds.IGNORE_TEXT_FAILURES,
|