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.
Files changed (184) hide show
  1. package/.github/config.yml +1 -0
  2. package/.github/workflows/demo-version-index.yaml +8 -0
  3. package/.github/workflows/release-please.yaml +18 -2
  4. package/.github/workflows/sync-labels.yaml +33 -0
  5. package/.github/workflows/update-issues.yaml +29 -0
  6. package/.github/workflows/validate-pr-title.yaml +35 -0
  7. package/AUTHORS +1 -0
  8. package/CHANGELOG.md +215 -41
  9. package/CONTRIBUTORS +1 -0
  10. package/README.md +14 -11
  11. package/app-engine/demo-version-index/README.md +3 -3
  12. package/app-engine/demo-version-index/app.yaml +27 -1
  13. package/app-engine/demo-version-index/generate.py +164 -0
  14. package/app-engine/demo-version-index/main.py +4 -155
  15. package/app-engine/demo-version-index/requirements.txt +0 -1
  16. package/build/checkversion.py +1 -1
  17. package/build/compiler.py +1 -1
  18. package/build/misspellings.txt +1 -0
  19. package/build/shaka-lab.yaml +0 -2
  20. package/build/types/polyfill +0 -3
  21. package/demo/common/asset.js +17 -1
  22. package/demo/common/assets.js +29 -0
  23. package/demo/common/message_ids.js +6 -3
  24. package/demo/config.js +10 -11
  25. package/demo/custom.js +39 -0
  26. package/demo/demo.less +0 -1
  27. package/demo/demo_utils.js +0 -1
  28. package/demo/locales/en.json +6 -3
  29. package/demo/locales/source.json +22 -10
  30. package/demo/main.js +9 -6
  31. package/demo/search.js +2 -1
  32. package/dist/controls.css +3 -3
  33. package/dist/controls.css.map +1 -1
  34. package/dist/demo.compiled.debug.js +71 -64
  35. package/dist/demo.compiled.debug.map +3 -3
  36. package/dist/demo.compiled.js +71 -64
  37. package/dist/demo.compiled.map +3 -3
  38. package/dist/demo.css +1 -1
  39. package/dist/demo.css.map +1 -1
  40. package/dist/deps.js +17 -20
  41. package/dist/locales.js +33 -31
  42. package/dist/receiver.compiled.debug.js +32 -28
  43. package/dist/receiver.compiled.debug.map +3 -3
  44. package/dist/receiver.compiled.js +32 -28
  45. package/dist/receiver.compiled.map +3 -3
  46. package/dist/shaka-player.compiled.d.ts +311 -314
  47. package/dist/shaka-player.compiled.debug.d.ts +311 -314
  48. package/dist/shaka-player.compiled.debug.externs.js +126 -126
  49. package/dist/shaka-player.compiled.debug.js +430 -484
  50. package/dist/shaka-player.compiled.debug.map +4 -4
  51. package/dist/shaka-player.compiled.externs.js +126 -126
  52. package/dist/shaka-player.compiled.js +829 -845
  53. package/dist/shaka-player.compiled.map +4 -4
  54. package/dist/shaka-player.ui.d.ts +357 -358
  55. package/dist/shaka-player.ui.debug.d.ts +357 -358
  56. package/dist/shaka-player.ui.debug.externs.js +134 -126
  57. package/dist/shaka-player.ui.debug.js +489 -541
  58. package/dist/shaka-player.ui.debug.map +4 -4
  59. package/dist/shaka-player.ui.externs.js +134 -126
  60. package/dist/shaka-player.ui.js +988 -1000
  61. package/dist/shaka-player.ui.map +4 -4
  62. package/docs/tutorials/config.md +0 -2
  63. package/docs/tutorials/drm-config.md +5 -0
  64. package/docs/tutorials/fairplay.md +7 -22
  65. package/docs/tutorials/faq.md +0 -11
  66. package/docs/tutorials/index.json +2 -8
  67. package/docs/tutorials/plugins.md +1 -3
  68. package/docs/tutorials/upgrade.md +85 -11
  69. package/externs/polyfill.js +15 -0
  70. package/externs/shaka/manifest.js +5 -1
  71. package/externs/shaka/net.js +12 -0
  72. package/externs/shaka/offline.js +5 -1
  73. package/externs/shaka/player.js +39 -21
  74. package/externs/shaka/text.js +12 -12
  75. package/externs/sourcebuffer.js +15 -0
  76. package/lib/abr/simple_abr_manager.js +2 -1
  77. package/lib/ads/client_side_ad.js +13 -2
  78. package/lib/ads/client_side_ad_manager.js +22 -4
  79. package/lib/cast/cast_utils.js +0 -1
  80. package/lib/dash/content_protection.js +85 -5
  81. package/lib/dash/dash_parser.js +1 -0
  82. package/lib/hls/hls_parser.js +390 -747
  83. package/lib/hls/manifest_text_parser.js +2 -3
  84. package/lib/media/drm_engine.js +105 -37
  85. package/lib/media/gap_jumping_controller.js +10 -45
  86. package/lib/media/media_source_engine.js +150 -30
  87. package/lib/media/playhead.js +2 -5
  88. package/lib/media/presentation_timeline.js +1 -2
  89. package/lib/media/segment_index.js +13 -46
  90. package/lib/media/segment_reference.js +47 -1
  91. package/lib/media/streaming_engine.js +28 -11
  92. package/lib/media/time_ranges_utils.js +4 -9
  93. package/lib/net/networking_engine.js +3 -0
  94. package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
  95. package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
  96. package/lib/offline/manifest_converter.js +1 -0
  97. package/lib/offline/storage.js +8 -41
  98. package/lib/player.js +17 -201
  99. package/lib/polyfill/media_capabilities.js +12 -6
  100. package/lib/polyfill/mediasource.js +0 -28
  101. package/lib/polyfill/patchedmediakeys_nop.js +2 -0
  102. package/lib/polyfill/patchedmediakeys_webkit.js +2 -0
  103. package/lib/text/cue.js +0 -6
  104. package/lib/text/lrc_text_parser.js +8 -0
  105. package/lib/text/mp4_ttml_parser.js +8 -0
  106. package/lib/text/mp4_vtt_parser.js +8 -0
  107. package/lib/text/sbv_text_parser.js +8 -0
  108. package/lib/text/simple_text_displayer.js +1 -7
  109. package/lib/text/srt_text_parser.js +8 -0
  110. package/lib/text/ssa_text_parser.js +8 -0
  111. package/lib/text/text_engine.js +19 -3
  112. package/lib/text/ttml_text_parser.js +8 -0
  113. package/lib/text/ui_text_displayer.js +1 -7
  114. package/lib/text/vtt_text_parser.js +27 -5
  115. package/lib/text/web_vtt_generator.js +1 -7
  116. package/lib/util/error.js +9 -13
  117. package/lib/util/fairplay_utils.js +109 -0
  118. package/lib/util/functional.js +0 -42
  119. package/lib/util/mime_utils.js +16 -5
  120. package/lib/util/platform.js +45 -0
  121. package/lib/util/player_configuration.js +17 -6
  122. package/lib/util/pssh.js +23 -4
  123. package/lib/util/stream_utils.js +92 -22
  124. package/lib/util/uint8array_utils.js +0 -16
  125. package/lib/util/xml_utils.js +1 -1
  126. package/package.json +5 -2
  127. package/roadmap.md +19 -19
  128. package/shaka-player.uncompiled.js +0 -3
  129. package/test/dash/dash_parser_content_protection_unit.js +44 -0
  130. package/test/dash/dash_parser_segment_template_unit.js +3 -4
  131. package/test/demo/demo_unit.js +2 -1
  132. package/test/hls/hls_live_unit.js +155 -230
  133. package/test/hls/hls_parser_unit.js +515 -432
  134. package/test/media/drm_engine_unit.js +86 -120
  135. package/test/media/media_source_engine_integration.js +25 -3
  136. package/test/media/media_source_engine_unit.js +3 -2
  137. package/test/media/playhead_unit.js +27 -191
  138. package/test/media/segment_index_unit.js +15 -25
  139. package/test/media/streaming_engine_integration.js +2 -39
  140. package/test/media/streaming_engine_unit.js +3 -2
  141. package/test/media/time_ranges_utils_unit.js +0 -5
  142. package/test/offline/manifest_convert_unit.js +34 -4
  143. package/test/offline/offline_manifest_parser_unit.js +1 -0
  144. package/test/offline/storage_integration.js +5 -4
  145. package/test/player_external.js +0 -6
  146. package/test/player_integration.js +16 -0
  147. package/test/player_unit.js +26 -0
  148. package/test/test/util/fake_media_source_engine.js +11 -4
  149. package/test/test/util/manifest_generator.js +3 -1
  150. package/test/test/util/manifest_parser_util.js +4 -1
  151. package/test/test/util/offline_utils.js +1 -0
  152. package/test/test/util/streaming_engine_util.js +1 -0
  153. package/test/test/util/test_scheme.js +24 -1
  154. package/test/test/util/util.js +4 -4
  155. package/test/text/cue_integration.js +2 -2
  156. package/test/text/lrc_text_parser_unit.js +6 -7
  157. package/test/text/mp4_ttml_parser_unit.js +6 -4
  158. package/test/text/mp4_vtt_parser_unit.js +6 -5
  159. package/test/text/sbv_text_parser_unit.js +5 -6
  160. package/test/text/srt_text_parser_unit.js +5 -6
  161. package/test/text/ssa_text_parser_unit.js +17 -29
  162. package/test/text/text_engine_unit.js +45 -5
  163. package/test/text/ttml_text_parser_unit.js +77 -77
  164. package/test/text/vtt_text_parser_unit.js +116 -59
  165. package/test/ui/ui_integration.js +0 -16
  166. package/test/ui/ui_unit.js +27 -0
  167. package/test/util/cmcd_manager_unit.js +3 -0
  168. package/test/util/stream_utils_unit.js +23 -7
  169. package/ui/controls.js +65 -40
  170. package/ui/fullscreen_button.js +26 -6
  171. package/ui/less/containers.less +4 -4
  172. package/ui/less/general.less +1 -1
  173. package/ui/less/range_elements.less +1 -0
  174. package/ui/locales/en.json +1 -0
  175. package/ui/locales/source.json +5 -0
  176. package/ui/resolution_selection.js +31 -33
  177. package/ui/ui.js +0 -17
  178. package/.github/pull_request_template.md +0 -10
  179. package/docs/tutorials/upgrade-v2-5.md +0 -441
  180. package/docs/tutorials/upgrade-v3.md +0 -38
  181. package/lib/polyfill/mathround.js +0 -49
  182. package/lib/polyfill/patchedmediakeys_apple.js +0 -744
  183. package/lib/polyfill/patchedmediakeys_ms.js +0 -698
  184. 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
- - main.py: A python service that queries available versions and generates the
9
- index from a template.
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, App Engine API).
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: 1s
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
- # Generate an index of Shaka Player versions on appspot.
6
-
7
- import collections
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())
@@ -3,4 +3,3 @@
3
3
  # SPDX-License-Identifier: Apache-2.0
4
4
 
5
5
  Flask==2.0.3
6
- appengine-python-standard==0.3.1
@@ -77,7 +77,7 @@ def main(_):
77
77
  logging.error('Changelog version does not match git version.')
78
78
  ret = 1
79
79
 
80
- return 0
80
+ return ret
81
81
 
82
82
 
83
83
  if __name__ == '__main__':
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('Externs generation failed')
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.
@@ -3,6 +3,7 @@
3
3
  # same as the match.
4
4
  {
5
5
  r'(?i)arti?fi?ci?ai?l': 'artificial',
6
+ r'(?i)bandwith': 'bandwidth',
6
7
  r'(?i)cur+ent': 'current',
7
8
  r"(?i)doens?'t": "doesn't",
8
9
  r'(?i)ful+screen': 'fullscreen',
@@ -155,8 +155,6 @@ Chromebook:
155
155
  extra_config: *chromeos_config
156
156
 
157
157
  Tizen:
158
- # TODO(joeyparrish): Get Tizen TV mounted in the lab and connected
159
- disabled: true
160
158
  browser: tizen
161
159
 
162
160
  XboxOne:
@@ -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
@@ -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) => {
@@ -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
- USE_FULL_SEGMENTS_FOR_START_TIME: 'DEMO_USE_FULL_SEGMENTS_FOR_START_TIME',
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.JUMP_LARGE_GAPS,
409
- 'streaming.jumpLargeGaps')
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,