shaka-player 3.3.0 → 3.3.3

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 (344) hide show
  1. package/.csslintrc +11 -1
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  3. package/.github/pull_request_template.md +6 -34
  4. package/.github/workflows/build-and-test.yaml +130 -0
  5. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +56 -0
  6. package/.github/workflows/custom-actions/set-commit-status/action.yaml +41 -0
  7. package/.github/workflows/demo-version-index.yaml +29 -0
  8. package/.github/workflows/nightly-demo.yaml +42 -0
  9. package/.github/workflows/release-please.yaml +145 -0
  10. package/.github/workflows/safari-homedir-launcher.sh +18 -0
  11. package/.github/workflows/selenium-lab-tests.yaml +93 -0
  12. package/AUTHORS +2 -0
  13. package/CHANGELOG.md +1722 -1640
  14. package/CONTRIBUTING.md +2 -2
  15. package/CONTRIBUTORS +2 -0
  16. package/README.md +7 -7
  17. package/app-engine/README.md +9 -0
  18. package/app-engine/demo-version-index/README.md +14 -0
  19. package/app-engine/demo-version-index/app.yaml +2 -0
  20. package/app-engine/demo-version-index/main.py +162 -0
  21. package/app-engine/demo-version-index/requirements.txt +6 -0
  22. package/app-engine/demo-version-index/templates/index.html +114 -0
  23. package/app-engine/shaka-player-demo/README.md +18 -0
  24. package/app-engine/shaka-player-demo/app.yaml +61 -0
  25. package/app-engine/shaka-player-demo/main.py +95 -0
  26. package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
  27. package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
  28. package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
  29. package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
  30. package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
  31. package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
  32. package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
  33. package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
  34. package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
  35. package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
  36. package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
  37. package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
  38. package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
  39. package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
  40. package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
  41. package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
  42. package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
  43. package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
  44. package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
  45. package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
  46. package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
  47. package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
  48. package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
  49. package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
  50. package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
  51. package/app-engine/shaka-player-demo/posters/standard.png +0 -0
  52. package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
  53. package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
  54. package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
  55. package/app-engine/shaka-player-demo/posters.py +110 -0
  56. package/app-engine/shaka-player-demo/requirements.txt +5 -0
  57. package/app-engine/shaka-player-demo/time.txt +1 -0
  58. package/build/README.md +1 -1
  59. package/build/checkversion.py +1 -1
  60. package/build/conformance.textproto +196 -169
  61. package/build/docker/Dockerfile +20 -0
  62. package/build/docker/docker-compose.yml +10 -0
  63. package/build/gendeps.py +18 -15
  64. package/build/shaka-lab.yaml +163 -0
  65. package/build/shakaBuildHelpers.py +4 -29
  66. package/build/test.py +93 -28
  67. package/build/types/polyfill +1 -0
  68. package/build/wrapper.template.js +2 -2
  69. package/demo/TengwarTelcontar.woff2 +0 -0
  70. package/demo/asset_card.js +1 -2
  71. package/demo/cast_receiver/index.html +1 -1
  72. package/demo/cast_receiver/receiver_app.css +14 -14
  73. package/demo/common/assets.js +2 -0
  74. package/demo/config.js +0 -1
  75. package/demo/custom.js +0 -1
  76. package/demo/customWarning.txt +2 -2
  77. package/demo/demo.less +29 -18
  78. package/demo/demo_uncompiled.js +1 -13
  79. package/demo/index.html +1 -1
  80. package/demo/main.js +3 -3
  81. package/dist/controls.css +3 -3
  82. package/dist/controls.css.map +1 -1
  83. package/dist/demo.compiled.debug.js +191 -194
  84. package/dist/demo.compiled.debug.map +4 -4
  85. package/dist/demo.compiled.js +191 -194
  86. package/dist/demo.compiled.map +4 -4
  87. package/dist/demo.css +1 -1
  88. package/dist/demo.css.map +1 -1
  89. package/dist/deps.js +233 -226
  90. package/dist/locales.js +30 -30
  91. package/dist/receiver.compiled.debug.js +43 -45
  92. package/dist/receiver.compiled.debug.map +4 -4
  93. package/dist/receiver.compiled.js +43 -45
  94. package/dist/receiver.compiled.map +4 -4
  95. package/dist/shaka-player.compiled.d.ts +272 -238
  96. package/dist/shaka-player.compiled.debug.d.ts +272 -238
  97. package/dist/shaka-player.compiled.debug.externs.js +53 -16
  98. package/dist/shaka-player.compiled.debug.js +393 -394
  99. package/dist/shaka-player.compiled.debug.map +4 -4
  100. package/dist/shaka-player.compiled.externs.js +53 -16
  101. package/dist/shaka-player.compiled.js +840 -843
  102. package/dist/shaka-player.compiled.map +4 -4
  103. package/dist/shaka-player.ui.d.ts +318 -293
  104. package/dist/shaka-player.ui.debug.d.ts +318 -293
  105. package/dist/shaka-player.ui.debug.externs.js +55 -27
  106. package/dist/shaka-player.ui.debug.js +415 -417
  107. package/dist/shaka-player.ui.debug.map +4 -4
  108. package/dist/shaka-player.ui.externs.js +55 -27
  109. package/dist/shaka-player.ui.js +997 -1000
  110. package/dist/shaka-player.ui.map +4 -4
  111. package/docs/design/REDESIGN.md +33 -33
  112. package/docs/design/bg-fetch.md +2 -2
  113. package/docs/design/codec_preferences.md +1 -1
  114. package/docs/design/dash-audio-channels.md +3 -3
  115. package/docs/design/dash-manifests.md +1 -1
  116. package/docs/design/gap-jumping.md +3 -3
  117. package/docs/design/preload.md +2 -2
  118. package/docs/tutorials/faq.md +8 -8
  119. package/docs/tutorials/index.json +1 -0
  120. package/docs/tutorials/plugins.md +3 -3
  121. package/docs/tutorials/selenium-grid-config.md +122 -0
  122. package/docs/tutorials/welcome.md +10 -2
  123. package/externs/cmcd.js +186 -0
  124. package/externs/shaka/player.js +8 -0
  125. package/externs/shaka/text.js +10 -0
  126. package/karma.conf.js +156 -45
  127. package/lib/abr/simple_abr_manager.js +12 -6
  128. package/lib/ads/ad_manager.js +1 -0
  129. package/lib/cast/cast_proxy.js +6 -4
  130. package/lib/cast/cast_receiver.js +3 -0
  131. package/lib/cea/cea608_data_channel.js +2 -2
  132. package/lib/cea/cea708_service.js +5 -4
  133. package/lib/cea/mp4_cea_parser.js +11 -5
  134. package/lib/cea/sei_processor.js +6 -3
  135. package/lib/dash/dash_parser.js +40 -30
  136. package/lib/dash/mpd_utils.js +4 -5
  137. package/lib/dash/segment_list.js +1 -2
  138. package/lib/dash/segment_template.js +3 -3
  139. package/lib/hls/hls_parser.js +41 -9
  140. package/lib/hls/manifest_text_parser.js +4 -3
  141. package/lib/media/adaptation_set.js +1 -2
  142. package/lib/media/content_workarounds.js +2 -2
  143. package/lib/media/drm_engine.js +3 -2
  144. package/lib/media/media_source_engine.js +3 -2
  145. package/lib/media/mp4_segment_index_parser.js +1 -4
  146. package/lib/media/playhead.js +2 -2
  147. package/lib/media/presentation_timeline.js +18 -8
  148. package/lib/media/quality_observer.js +17 -34
  149. package/lib/media/region_observer.js +39 -33
  150. package/lib/media/region_timeline.js +17 -19
  151. package/lib/media/segment_index.js +2 -1
  152. package/lib/media/segment_reference.js +19 -1
  153. package/lib/media/streaming_engine.js +12 -9
  154. package/lib/media/time_ranges_utils.js +1 -3
  155. package/lib/media/video_wrapper.js +1 -1
  156. package/lib/net/networking_engine.js +5 -1
  157. package/lib/offline/storage.js +12 -13
  158. package/lib/player.js +87 -41
  159. package/lib/polyfill/all.js +2 -3
  160. package/lib/polyfill/encryption_scheme.js +1 -1
  161. package/lib/polyfill/media_capabilities.js +32 -17
  162. package/lib/polyfill/mediasource.js +1 -1
  163. package/lib/polyfill/symbol.js +46 -0
  164. package/lib/text/cue.js +7 -1
  165. package/lib/text/simple_text_displayer.js +2 -1
  166. package/lib/text/ttml_text_parser.js +92 -63
  167. package/lib/text/ui_text_displayer.js +18 -12
  168. package/lib/util/buffer_utils.js +1 -3
  169. package/lib/util/cmcd_manager.js +47 -201
  170. package/lib/util/ebml_parser.js +3 -3
  171. package/lib/util/error.js +1 -1
  172. package/lib/util/fake_event_target.js +21 -1
  173. package/lib/util/iterables.js +0 -46
  174. package/lib/util/mp4_box_parsers.js +1 -4
  175. package/lib/util/mp4_parser.js +5 -7
  176. package/lib/util/periods.js +10 -11
  177. package/lib/util/platform.js +3 -3
  178. package/lib/util/pssh.js +1 -4
  179. package/lib/util/stream_utils.js +88 -11
  180. package/lib/util/string_utils.js +3 -5
  181. package/lib/util/uint8array_utils.js +3 -5
  182. package/lib/util/xml_utils.js +34 -7
  183. package/package.json +62 -40
  184. package/roadmap.md +17 -17
  185. package/shaka-player.uncompiled.js +1 -0
  186. package/test/abr/simple_abr_manager_unit.js +3 -8
  187. package/test/ads/ad_manager_unit.js +0 -6
  188. package/test/cast/cast_proxy_unit.js +0 -8
  189. package/test/cast/cast_receiver_integration.js +1 -18
  190. package/test/cast/cast_receiver_unit.js +1 -9
  191. package/test/cast/cast_sender_unit.js +0 -6
  192. package/test/cast/cast_utils_unit.js +0 -13
  193. package/test/cea/cea608_memory_unit.js +0 -5
  194. package/test/cea/cea708_service_unit.js +0 -7
  195. package/test/cea/cea708_window_unit.js +0 -5
  196. package/test/cea/cea_decoder_unit.js +0 -6
  197. package/test/cea/dtvcc_packet_builder_unit.js +0 -3
  198. package/test/cea/dtvcc_packet_unit.js +0 -5
  199. package/test/cea/mp4_cea_parser_unit.js +0 -4
  200. package/test/dash/dash_parser_content_protection_unit.js +1 -10
  201. package/test/dash/dash_parser_live_unit.js +45 -15
  202. package/test/dash/dash_parser_manifest_unit.js +4 -17
  203. package/test/dash/dash_parser_segment_base_unit.js +1 -8
  204. package/test/dash/dash_parser_segment_list_unit.js +1 -7
  205. package/test/dash/dash_parser_segment_template_unit.js +0 -9
  206. package/test/dash/mpd_utils_unit.js +3 -11
  207. package/test/demo/demo_unit.js +0 -5
  208. package/test/deprecate/enforcer_unit.js +0 -4
  209. package/test/deprecate/version_unit.js +0 -2
  210. package/test/hls/hls_live_unit.js +2 -14
  211. package/test/hls/hls_parser_unit.js +76 -15
  212. package/test/hls/manifest_text_parser_unit.js +0 -10
  213. package/test/media/adaptation_set_criteria_unit.js +3 -7
  214. package/test/media/adaptation_set_unit.js +0 -2
  215. package/test/media/buffering_observer_unit.js +1 -4
  216. package/test/media/closed_caption_parser_unit.js +0 -3
  217. package/test/media/drm_engine_integration.js +2 -15
  218. package/test/media/drm_engine_unit.js +7 -27
  219. package/test/media/manifest_parser_unit.js +0 -4
  220. package/test/media/media_source_engine_integration.js +0 -7
  221. package/test/media/media_source_engine_unit.js +1 -14
  222. package/test/media/mp4_segment_index_parser_unit.js +0 -4
  223. package/test/media/play_rate_controller_unit.js +0 -4
  224. package/test/media/playhead_unit.js +8 -16
  225. package/test/media/presentation_timeline_unit.js +4 -7
  226. package/test/media/quality_observer_unit.js +4 -5
  227. package/test/media/region_observer_unit.js +40 -10
  228. package/test/media/region_timeline_unit.js +40 -25
  229. package/test/media/segment_index_unit.js +0 -6
  230. package/test/media/segment_reference_unit.js +0 -3
  231. package/test/media/stall_detector_unit.js +0 -5
  232. package/test/media/streaming_engine_integration.js +11 -37
  233. package/test/media/streaming_engine_unit.js +155 -34
  234. package/test/media/time_ranges_utils_unit.js +0 -2
  235. package/test/media/transmuxer_integration.js +0 -6
  236. package/test/media/webm_segment_index_parser_unit.js +0 -4
  237. package/test/net/data_uri_plugin_unit.js +0 -7
  238. package/test/net/http_plugin_unit.js +0 -9
  239. package/test/net/networking_engine_unit.js +0 -11
  240. package/test/offline/download_progress_estimator_unit.js +0 -2
  241. package/test/offline/indexeddb_storage_unit.js +0 -6
  242. package/test/offline/manifest_convert_unit.js +0 -8
  243. package/test/offline/offline_integration.js +1 -10
  244. package/test/offline/offline_manifest_parser_unit.js +0 -6
  245. package/test/offline/offline_scheme_unit.js +0 -8
  246. package/test/offline/offline_uri_unit.js +0 -2
  247. package/test/offline/storage_compatibility_unit.js +1 -14
  248. package/test/offline/storage_integration.js +1 -27
  249. package/test/player_external.js +2 -10
  250. package/test/player_integration.js +63 -36
  251. package/test/player_load_graph_integration.js +1 -6
  252. package/test/player_src_equals_external.js +3 -9
  253. package/test/player_src_equals_integration.js +41 -15
  254. package/test/player_unit.js +71 -46
  255. package/test/routing/walker_unit.js +0 -8
  256. package/test/test/assets/chapters.vtt +2 -2
  257. package/test/test/assets/chapters2.vtt +10 -0
  258. package/test/test/assets/large_file.mpd +1 -1
  259. package/test/test/boot.js +75 -22
  260. package/test/test/externs/jasmine.js +2 -2
  261. package/test/test/externs/karma.js +4 -0
  262. package/test/test/namespace.js +10 -0
  263. package/test/test/util/canned_idb.js +0 -8
  264. package/test/test/util/cea_utils.js +0 -6
  265. package/test/test/util/dash_parser_util.js +0 -13
  266. package/test/test/util/fake_ad.js +0 -3
  267. package/test/test/util/fake_ad_manager.js +0 -9
  268. package/test/test/util/fake_demo_main.js +0 -5
  269. package/test/test/util/fake_drm_engine.js +0 -6
  270. package/test/test/util/fake_media_source_engine.js +0 -7
  271. package/test/test/util/fake_networking_engine.js +0 -5
  272. package/test/test/util/fake_text_displayer.js +0 -5
  273. package/test/test/util/indexeddb_utils.js +1 -10
  274. package/test/test/util/jasmine_fetch.js +0 -1
  275. package/test/test/util/loader.js +0 -18
  276. package/test/test/util/manifest_generator.js +9 -14
  277. package/test/test/util/manifest_parser_util.js +0 -6
  278. package/test/test/util/offline_utils.js +0 -5
  279. package/test/test/util/simple_fakes.js +9 -26
  280. package/test/test/util/stream_generator.js +0 -14
  281. package/test/test/util/streaming_engine_util.js +0 -15
  282. package/test/test/util/test_scheme.js +1 -19
  283. package/test/test/util/ttml_utils.js +79 -0
  284. package/test/test/util/ui_utils.js +0 -9
  285. package/test/test/util/util.js +15 -26
  286. package/test/test/util/waiter.js +84 -43
  287. package/test/text/cue_integration.js +0 -4
  288. package/test/text/lrc_text_parser_unit.js +0 -4
  289. package/test/text/mp4_ttml_parser_unit.js +10 -23
  290. package/test/text/mp4_vtt_parser_unit.js +1 -7
  291. package/test/text/sbv_text_parser_unit.js +0 -4
  292. package/test/text/simple_text_displayer_unit.js +1 -8
  293. package/test/text/srt_text_parser_unit.js +0 -4
  294. package/test/text/ssa_text_parser_unit.js +0 -5
  295. package/test/text/text_engine_unit.js +2 -7
  296. package/test/text/text_track_integration.js +0 -2
  297. package/test/text/ttml_text_parser_unit.js +499 -239
  298. package/test/text/ui_text_displayer_unit.js +44 -41
  299. package/test/text/vtt_text_parser_unit.js +0 -9
  300. package/test/text/web_vtt_generator_unit.js +0 -3
  301. package/test/ui/ad_ui_unit.js +0 -11
  302. package/test/ui/localization_unit.js +0 -3
  303. package/test/ui/text_displayer_layout_unit.js +9 -19
  304. package/test/ui/ui_customization_unit.js +0 -6
  305. package/test/ui/ui_integration.js +0 -16
  306. package/test/ui/ui_unit.js +1 -17
  307. package/test/util/abortable_operation_unit.js +4 -9
  308. package/test/util/array_utils_unit.js +0 -2
  309. package/test/util/buffer_utils_unit.js +0 -2
  310. package/test/util/cmcd_manager_unit.js +29 -18
  311. package/test/util/data_view_reader_unit.js +0 -4
  312. package/test/util/ebml_parser_unit.js +0 -4
  313. package/test/util/event_manager_unit.js +0 -3
  314. package/test/util/fake_event_target_unit.js +0 -5
  315. package/test/util/functional_unit.js +1 -1
  316. package/test/util/iterables_unit.js +0 -64
  317. package/test/util/language_utils_unit.js +0 -3
  318. package/test/util/manifest_parser_utils_unit.js +0 -2
  319. package/test/util/mp4_box_parsers_unit.js +0 -5
  320. package/test/util/mp4_parser_unit.js +0 -4
  321. package/test/util/multi_map_unit.js +0 -3
  322. package/test/util/object_utils_unit.js +0 -2
  323. package/test/util/periods_unit.js +14 -7
  324. package/test/util/pssh_unit.js +0 -5
  325. package/test/util/state_history_unit.js +0 -2
  326. package/test/util/stream_utils_unit.js +39 -38
  327. package/test/util/string_utils_unit.js +0 -6
  328. package/test/util/text_parser_unit.js +0 -2
  329. package/test/util/xml_utils_unit.js +0 -4
  330. package/third_party/closure-uri/uri.js +21 -0
  331. package/ui/controls.js +3 -0
  332. package/ui/less/ad_controls.less +4 -4
  333. package/ui/less/buttons.less +5 -5
  334. package/ui/less/containers.less +9 -11
  335. package/ui/less/overflow_menu.less +4 -4
  336. package/ui/less/range_elements.less +5 -0
  337. package/ui/less/tooltip.less +1 -1
  338. package/ui/locales/sjn-translations.yaml +257 -0
  339. package/ui/locales/sjn.json +42 -0
  340. package/ui/localization.js +12 -36
  341. package/ui/text_selection.js +1 -0
  342. package/externs/media_capabilities.js +0 -16
  343. package/externs/svgelement.js +0 -18
  344. package/externs/webcrypto.js +0 -18
@@ -0,0 +1,20 @@
1
+ # Alpine was chosen by providing a node container less than 100mb
2
+ FROM node:17.7.1-alpine3.15
3
+
4
+ WORKDIR /usr/src/app
5
+
6
+ # Install dependencies
7
+ RUN apk add --update --no-cache openssh git python3 openjdk11-jre-headless
8
+ RUN ln -sf python3 /usr/bin/python
9
+
10
+ # Change to non-root user
11
+ USER node
12
+
13
+ # Prevent proxy timeout error (very slow connections)
14
+ RUN npm config set fetch-retry-mintimeout 20000
15
+ RUN npm config set fetch-retry-maxtimeout 120000
16
+ RUN npm config rm proxy
17
+ RUN npm config rm https-proxy
18
+
19
+ # Run compilation
20
+ CMD [ "python", "build/all.py" ]
@@ -0,0 +1,10 @@
1
+ version: '3'
2
+
3
+ services:
4
+ shaka-compiler:
5
+ build: ./
6
+ container_name: shaka-compiler
7
+ volumes:
8
+ - ../../:/usr/src/app
9
+
10
+ # Others services can be added here
package/build/gendeps.py CHANGED
@@ -24,17 +24,6 @@ import sys
24
24
  import shakaBuildHelpers
25
25
 
26
26
 
27
- # The relative path in each of these is relative to Closure's base.js, which
28
- # lives at node_modules/google-closure-library/closure/goog/base.js
29
- deps_args = [
30
- '--root_with_prefix=lib ../../../../lib',
31
- '--root_with_prefix=ui ../../../../ui',
32
- '--root_with_prefix=third_party ../../../../third_party',
33
- '--root_with_prefix=dist ../../../../dist',
34
- '--root_with_prefix=demo ../../../../demo',
35
- ]
36
-
37
-
38
27
  def main(_):
39
28
  """Generates the uncompiled dependencies files."""
40
29
  # Update node modules if needed.
@@ -50,13 +39,27 @@ def main(_):
50
39
  except OSError:
51
40
  pass
52
41
  os.chdir(base)
53
- deps_writer = os.path.join(
54
- 'node_modules', 'google-closure-library',
55
- 'closure', 'bin', 'build', 'depswriter.py')
42
+
43
+ make_deps = shakaBuildHelpers.get_node_binary(
44
+ 'google-closure-deps', 'closure-make-deps')
56
45
 
57
46
  try:
58
- cmd_line = [sys.executable or 'python', deps_writer] + deps_args
47
+ cmd_line = make_deps + [
48
+ # Folders to search for sources using goog.require/goog.provide
49
+ '-r', 'demo', 'lib', 'ui', 'third_party',
50
+ # Individual files to add to those
51
+ '-f', 'dist/locales.js',
52
+ # The path to the folder containing the Closure library's base.js
53
+ '--closure-path', 'node_modules/google-closure-library/closure/goog',
54
+ ]
59
55
  deps = shakaBuildHelpers.execute_get_output(cmd_line)
56
+
57
+ # This command doesn't use exit codes for some stupid reason.
58
+ # TODO: Remove when https://github.com/google/closure-library/issues/1162
59
+ # is resolved and we have upgraded.
60
+ if len(deps) == 0:
61
+ return 1
62
+
60
63
  with open(os.path.join(base, 'dist', 'deps.js'), 'wb') as f:
61
64
  f.write(deps)
62
65
  return 0
@@ -0,0 +1,163 @@
1
+ # Selenium grid config for the Shaka lab. This is the source of truth for the
2
+ # browsers and devices in the Shaka lab at Google.
3
+
4
+ # For syntax and general information, see docs/selenium-grid-config.md
5
+
6
+
7
+ # A set of variables to contain repeated configurations which can then be
8
+ # referenced below. The syntax for the variable is "name: &name", which
9
+ # generates an "anchor" with the given name. Later, you can inject the
10
+ # contents of the variable with "*name".
11
+ vars:
12
+ firefox_config: &firefox_config
13
+ moz:firefoxOptions:
14
+ # Override Firefox default preferences in the temporary profile created
15
+ # for each test run.
16
+ prefs:
17
+ # Overrides Selenium's explicit default setting, to allow Firefox to
18
+ # install the Widevine CDM on demand.
19
+ media.gmp-manager.updateEnabled: true
20
+ # Overrides Firefox's Linux-specific default setting to disable DRM.
21
+ media.eme.enabled: true
22
+
23
+ minimum_chrome_args: &minimum_chrome_args
24
+ # On Chrome m59+ we can test EME on platforms with pop-up prompts, such as
25
+ # Android and ChromeOS. Note that this flag does not take a port number
26
+ # (domain vs origin).
27
+ # This flag requires setting --user-data-dir as well, however, webdriver
28
+ # already takes care of that for us (except on Android).
29
+ - "--unsafely-allow-protected-media-identifier-for-domain=karma.shakalab.rocks"
30
+ # Normally, Chrome disallows autoplaying videos in many cases. Enable it
31
+ # for testing.
32
+ - "--autoplay-policy=no-user-gesture-required"
33
+
34
+ minimum_chrome_android_args: &minimum_chrome_android_args
35
+ # There is no way in YAML to natively merge arrays, so we start by
36
+ # duplicating the flags from minimum_chrome_args above.
37
+ - "--unsafely-allow-protected-media-identifier-for-domain=karma.shakalab.rocks"
38
+ - "--autoplay-policy=no-user-gesture-required"
39
+ # On Android we must set --user-data-dir. WebDriver does not do it for
40
+ # us as it does on other platforms. Without --user-data-dir,
41
+ # --unsafely-allow... does not work.
42
+ - "--user-data-dir=/data/data/com.android.chrome/cache"
43
+
44
+ minimum_chromeos_args: &minimum_chromeos_args
45
+ # There is no way in YAML to natively merge arrays, so we start by
46
+ # duplicating the flags from minimum_chrome_args above.
47
+ - "--unsafely-allow-protected-media-identifier-for-domain=karma.shakalab.rocks"
48
+ - "--autoplay-policy=no-user-gesture-required"
49
+ # Allow remote attestation even though the device may be in dev mode. This
50
+ # is critical for testing involving L1 content licenses.
51
+ - "--allow-ra-in-dev-mode"
52
+
53
+ chrome_config: &chrome_config
54
+ goog:chromeOptions:
55
+ args: *minimum_chrome_args
56
+
57
+ # Instruct chromedriver not to disable component updater. The
58
+ # component updater must run in order for the Widevine CDM to be
59
+ # available when using a new user-data-dir.
60
+ # TODO(http://crbug.com/613581): Remove once Chrome bug is fixed.
61
+ excludeSwitches:
62
+ - "disable-component-update"
63
+
64
+ chrome_android_config: &chrome_android_config
65
+ goog:chromeOptions:
66
+ args: *minimum_chrome_android_args
67
+
68
+ # Once the new session request reaches chromedriver, it will take
69
+ # the androidPackage option as a request to start Chrome through
70
+ # adb on the tethered device.
71
+ androidPackage: com.android.chrome
72
+
73
+ chromeos_config: &chromeos_config
74
+ # Pass these client-specified arguments through generic-webdriver-server.
75
+ # This array will be appended after "--" instead of being set through one
76
+ # specific flag. For example, with ["--foo", "--bar=baz"] in the args,
77
+ # this would generate a command like:
78
+ # chromeos-webdriver-server.js -- --foo --bar=baz
79
+ # Those parameters will be passed on to Chrome instead of used by the
80
+ # WebDriver server.
81
+ generic:args: *minimum_chromeos_args
82
+
83
+
84
+ ChromeMac:
85
+ browser: chrome
86
+ os: Mac
87
+ extra_config: *chrome_config
88
+
89
+ FirefoxMac:
90
+ browser: firefox
91
+ os: Mac
92
+ extra_config: *firefox_config
93
+
94
+ Safari:
95
+ browser: safari
96
+ os: Mac
97
+
98
+ SafariTP:
99
+ # TODO(b/152646297): Safari TP not launching as of Safari 15.4
100
+ disabled: true
101
+ browser: safari
102
+ os: Mac
103
+ extra_config:
104
+ safari.options:
105
+ technologyPreview: true
106
+
107
+ ChromeWindows:
108
+ browser: chrome
109
+ os: Windows
110
+ extra_config: *chrome_config
111
+
112
+ FirefoxWindows:
113
+ browser: firefox
114
+ os: Windows
115
+ extra_config: *firefox_config
116
+
117
+ IE11:
118
+ # IE11 support has been removed from the latest release branch.
119
+ disabled: true
120
+ browser: internet explorer
121
+ os: Windows
122
+ extra_config:
123
+ se:ieOptions:
124
+ # The zoom setting must be checked, or screenshot tests will be way off!
125
+ ignoreZoomSetting: false
126
+ ignoreProtectedModeSettings: true
127
+
128
+ Edge:
129
+ browser: msedge
130
+ os: Windows
131
+
132
+ ChromeLinux:
133
+ browser: chrome
134
+ os: Linux
135
+ extra_config: *chrome_config
136
+
137
+ FirefoxLinux:
138
+ browser: firefox
139
+ os: Linux
140
+ extra_config: *firefox_config
141
+
142
+ ChromeAndroid:
143
+ browser: chrome
144
+ os: Android
145
+ extra_config: *chrome_android_config
146
+
147
+ Chromecast:
148
+ browser: chromecast
149
+
150
+ Chromebook:
151
+ # TODO(b/145916766): Persistent license tests failing
152
+ disabled: true
153
+ browser: chromeos
154
+ version: Pixelbook
155
+ extra_config: *chromeos_config
156
+
157
+ Tizen:
158
+ # TODO(joeyparrish): Get Tizen TV mounted in the lab and connected
159
+ disabled: true
160
+ browser: tizen
161
+
162
+ XboxOne:
163
+ browser: xboxone
@@ -63,23 +63,6 @@ def _modules_need_update():
63
63
 
64
64
  return False
65
65
 
66
-
67
- def _parse_version(version):
68
- """Converts the given string version to a tuple of numbers."""
69
- # Handle any prerelease or build metadata, such as -beta or -g1234
70
- if '-' in version:
71
- version, trailer = version.split('-')
72
- else:
73
- # Versions without a trailer should sort later than those with a trailer.
74
- # For example, 2.5.0-beta comes before 2.5.0.
75
- # To accomplish this, we synthesize a trailer which sorts later than any
76
- # _reasonable_ alphanumeric version trailer would. These characters have a
77
- # high value in ASCII.
78
- trailer = '}}}'
79
- numeric_parts = [int(i) for i in version.split('.')]
80
- return tuple(numeric_parts + [trailer])
81
-
82
-
83
66
  def get_source_base():
84
67
  """Returns the absolute path to the source code base."""
85
68
  return os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
@@ -338,21 +321,13 @@ def update_node_modules():
338
321
 
339
322
  base = cygwin_safe_path(get_source_base())
340
323
 
341
- # Check the version of npm.
342
- version = execute_get_output(['npm', '-v']).decode('utf8')
343
-
344
- if _parse_version(version) < _parse_version('5.0.0'):
345
- logging.error('npm version is too old, please upgrade. e.g.:')
346
- logging.error(' npm install -g npm')
347
- return False
348
-
349
324
  # Update the modules.
350
325
  # Actually change directories instead of using npm --prefix.
351
- # See npm/npm#17027 and google/shaka-player#776 for more details.
326
+ # See npm/npm#17027 and shaka-project/shaka-player#776 for more details.
352
327
  with InDir(base):
353
- # npm update seems to be the wrong thing in npm v5, so use install.
354
- # See google/shaka-player#854 for more details.
355
- execute_get_output(['npm', 'install'])
328
+ # npm ci uses package-lock.json to get a stable, reproducible set of
329
+ # packages installed.
330
+ execute_get_output(['npm', 'ci'])
356
331
 
357
332
  # Update the timestamp of the file that tracks when we last updated.
358
333
  open(_node_modules_last_update_path(), 'wb').close()
package/build/test.py CHANGED
@@ -19,13 +19,22 @@
19
19
  import argparse
20
20
  import json
21
21
  import logging
22
+ import os
22
23
  import platform
24
+ import re
23
25
 
24
26
  import build
25
27
  import gendeps
26
28
  import shakaBuildHelpers
27
29
 
28
30
 
31
+ # Set a higher default for capture_timeout in grid mode. If the test gets
32
+ # queued by the grid, this may prevent Karma from killing the session while
33
+ # waiting.
34
+ LOCAL_CAPTURE_TIMEOUT = 1 * 60 * 1000 # 1m in ms
35
+ SELENIUM_CAPTURE_TIMEOUT = 10 * 60 * 1000 # 10m in ms
36
+
37
+
29
38
  class _HandleMixedListsAction(argparse.Action):
30
39
  '''Action to handle comma-separated and space-separated lists.
31
40
 
@@ -59,6 +68,21 @@ class _HandleKeyValuePairs(argparse.Action):
59
68
  merged[key] = value
60
69
  setattr(namespace, self.dest, merged)
61
70
 
71
+ def _KeyValueValidator(argument):
72
+ '''To validate the option has a key value pair format.
73
+
74
+ When you forget to provide the option in key=value format,
75
+ it reminds you by throwing an error before executing any tests.
76
+ '''
77
+
78
+ keyValuePair = [str for str in argument.split('=') if str != ''];
79
+
80
+ if len(keyValuePair) == 2:
81
+ return argument
82
+ else:
83
+ raise argparse.ArgumentTypeError(
84
+ 'Received %s but expecting format of key=value' % argument
85
+ )
62
86
 
63
87
  def _IntGreaterThanZero(x):
64
88
  i = int(x)
@@ -85,6 +109,8 @@ def _GetDefaultBrowsers():
85
109
  raise Error('Unrecognized system: %s' % platform.uname()[0])
86
110
 
87
111
 
112
+ # TODO(joeyparrish): When internal tools using this Launcher system are removed,
113
+ # simplify this whole mess.
88
114
  class Launcher:
89
115
  """A stateful object for parsing arguments and running Karma commands.
90
116
 
@@ -111,7 +137,7 @@ class Launcher:
111
137
 
112
138
  running_commands = self.parser.add_argument_group(
113
139
  'Running',
114
- 'These commands affect how tests are ran.')
140
+ 'These commands affect how tests are run.')
115
141
  logging_commands = self.parser.add_argument_group(
116
142
  'Logging',
117
143
  'These commands affect what gets logged and how the logs will appear.')
@@ -215,9 +241,9 @@ class Launcher:
215
241
  running_commands.add_argument(
216
242
  '--capture-timeout',
217
243
  help='Kill the browser if it does not capture in the given time [ms]. '
218
- '(default %(default)s)',
219
- type=int,
220
- default=60000)
244
+ '(default {} for local, {} for Selenium)'.format(
245
+ LOCAL_CAPTURE_TIMEOUT, SELENIUM_CAPTURE_TIMEOUT),
246
+ type=int)
221
247
  running_commands.add_argument(
222
248
  '--delay-tests',
223
249
  help='Insert an artificial delay between tests, in seconds. '
@@ -229,6 +255,11 @@ class Launcher:
229
255
  default=None,
230
256
  const=2,
231
257
  nargs='?')
258
+ running_commands.add_argument(
259
+ '--spec-hide-passed',
260
+ help='If provided, configure the spec reporter to hide passing tests.',
261
+ action='store_true',
262
+ default=False)
232
263
  running_commands.add_argument(
233
264
  '--test-custom-asset',
234
265
  help='Run asset playback tests on a custom manifest URI.',
@@ -239,7 +270,7 @@ class Launcher:
239
270
  help='Configure license servers for the custom asset playback test. '
240
271
  'May be specified multiple times to configure multiple key '
241
272
  'systems.',
242
- type=str,
273
+ type=_KeyValueValidator,
243
274
  metavar='KEY_SYSTEM_ID=LICENSE_SERVER_URI',
244
275
  action=_HandleKeyValuePairs)
245
276
  running_commands.add_argument(
@@ -253,6 +284,13 @@ class Launcher:
253
284
  help="Don't use Babel to convert ES6 to ES5.",
254
285
  dest='babel',
255
286
  action='store_false')
287
+ running_commands.add_argument(
288
+ '--grid-address',
289
+ help='Address (hostname:port) of a Selenium grid to run tests on.')
290
+ running_commands.add_argument(
291
+ '--grid-config',
292
+ help='Path to a yaml config defining Selenium grid browsers. '
293
+ '(See docs/selenium-grid-config.md)')
256
294
 
257
295
 
258
296
  logging_commands.add_argument(
@@ -308,6 +346,17 @@ class Launcher:
308
346
  help='Specify the hostname to be used when capturing browsers. This '
309
347
  'defaults to localhost.',
310
348
  default='localhost')
349
+ networking_commands.add_argument(
350
+ '--tls-key',
351
+ help='Specify a TLS key to serve tests over HTTPs.')
352
+ networking_commands.add_argument(
353
+ '--tls-cert',
354
+ help='Specify a TLS cert to serve tests over HTTPs.')
355
+ networking_commands.add_argument(
356
+ '--lets-encrypt-folder',
357
+ help="Specify a Let's Encrypt folder to search for the latest key and "
358
+ "cert, to serve tests over HTTPs. This overrides --tls-key and "
359
+ "--tls-cert.")
311
360
 
312
361
 
313
362
  pre_launch_commands.add_argument(
@@ -340,27 +389,36 @@ class Launcher:
340
389
  pass_through = [
341
390
  'auto_watch',
342
391
  'babel',
392
+ 'browsers',
343
393
  'capture_timeout',
344
394
  'colors',
395
+ 'delay_tests',
345
396
  'drm',
397
+ 'exclude_browsers',
346
398
  'external',
347
399
  'filter',
400
+ 'grid_address',
401
+ 'grid_config',
348
402
  'hostname',
349
403
  'html_coverage_report',
350
404
  'log_level',
351
405
  'logging',
406
+ 'no_browsers',
352
407
  'port',
353
408
  'quarantined',
354
409
  'quick',
355
410
  'random',
411
+ 'reporters',
356
412
  'report_slower_than',
357
413
  'seed',
358
414
  'single_run',
359
- 'uncompiled',
360
- 'delay_tests',
415
+ 'spec_hide_passed',
361
416
  'test_custom_asset',
362
417
  'test_custom_license_server',
363
418
  'test_timeout',
419
+ 'tls_key',
420
+ 'tls_cert',
421
+ 'uncompiled',
364
422
  ]
365
423
 
366
424
  # Check each value before setting it to avoid passing null values.
@@ -369,8 +427,33 @@ class Launcher:
369
427
  if value is not None:
370
428
  self.karma_config[name] = value
371
429
 
372
- if self.parsed_args.reporters:
373
- self.karma_config['reporters'] = self.parsed_args.reporters
430
+ if not self.parsed_args.capture_timeout:
431
+ # The default for capture_timeout depends on whether or not we are using
432
+ # a Selenium grid.
433
+ if self.parsed_args.grid_config:
434
+ self.karma_config['capture_timeout'] = SELENIUM_CAPTURE_TIMEOUT
435
+ else:
436
+ self.karma_config['capture_timeout'] = LOCAL_CAPTURE_TIMEOUT
437
+
438
+ self._HandleLetsEncryptConfig()
439
+
440
+ def _HandleLetsEncryptConfig(self):
441
+ folder = self.parsed_args.lets_encrypt_folder
442
+ if not folder:
443
+ return
444
+
445
+ max_serial_number = 0
446
+ # Go through the contents of the folder to find the latest key & cert.
447
+ for file_name in os.listdir(folder):
448
+ matches = re.match(r'(?:privkey|fullchain)(\d+).pem', file_name)
449
+ if matches:
450
+ serial_number = int(matches.group(1))
451
+ max_serial_number = max(max_serial_number, serial_number)
452
+
453
+ self.karma_config['tls_key'] = os.path.join(
454
+ folder, 'privkey{}.pem'.format(max_serial_number))
455
+ self.karma_config['tls_cert'] = os.path.join(
456
+ folder, 'fullchain{}.pem'.format(max_serial_number))
374
457
 
375
458
  def ResolveBrowsers(self, default_browsers):
376
459
  """Decide what browsers we should use.
@@ -379,25 +462,7 @@ class Launcher:
379
462
  additional logic to derive a browser list from the parsed arguments.
380
463
  """
381
464
  assert(default_browsers and len(default_browsers))
382
-
383
- if self.parsed_args.no_browsers:
384
- logging.warning('In this mode browsers must manually connect to karma.')
385
- elif self.parsed_args.browsers:
386
- self.karma_config['browsers'] = self.parsed_args.browsers
387
- else:
388
- logging.warning('Using default browsers: %s', default_browsers)
389
- self.karma_config['browsers'] = default_browsers
390
-
391
- # Check if there are any browsers that we should remove
392
- if self.parsed_args.exclude_browsers and 'browsers' in self.karma_config:
393
- all_browsers = set(self.karma_config['browsers'])
394
- bad_browsers = set(self.parsed_args.exclude_browsers)
395
- if bad_browsers - all_browsers:
396
- raise RuntimeError('Attempting to exclude unselected browsers: %s' %
397
- ','.join(bad_browsers - all_browsers))
398
-
399
- good_browsers = all_browsers - bad_browsers
400
- self.karma_config['browsers'] = list(good_browsers)
465
+ self.karma_config['default_browsers'] = default_browsers
401
466
 
402
467
  def RunCommand(self, karma_conf):
403
468
  """Build a command and send it to Karma for execution.
@@ -15,6 +15,7 @@
15
15
  +../../lib/polyfill/pip_webkit.js
16
16
  +../../lib/polyfill/random_uuid.js
17
17
  +../../lib/polyfill/storage_estimate.js
18
+ +../../lib/polyfill/symbol.js
18
19
  +../../lib/polyfill/video_play_promise.js
19
20
  +../../lib/polyfill/videoplaybackquality.js
20
21
  +../../lib/polyfill/vttcue.js
@@ -6,7 +6,7 @@
6
6
 
7
7
  (function() {
8
8
  // This is "window" in browsers and "global" in nodejs.
9
- // See https://github.com/google/shaka-player/issues/1445
9
+ // See https://github.com/shaka-project/shaka-player/issues/1445
10
10
  var innerGlobal = typeof window != 'undefined' ? window : global;
11
11
 
12
12
  // This is where our library exports things to. It is "this" in the wrapped
@@ -18,7 +18,7 @@
18
18
  // $jscomp.global, which will be "window", or "global", or "this", depending
19
19
  // on circumstances.
20
20
  // See https://github.com/google/closure-compiler/issues/2957 and
21
- // https://github.com/google/shaka-player/issues/1455#issuecomment-393250035
21
+ // https://github.com/shaka-project/shaka-player/issues/1455#issuecomment-393250035
22
22
 
23
23
  // We provide "global" for use by Closure, and "window" for use by the Shaka
24
24
  // library itself. Both point to "innerGlobal" above.
Binary file
@@ -4,11 +4,10 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
-
8
7
  goog.provide('shakaDemo.AssetCard');
9
8
 
10
-
11
9
  goog.require('goog.asserts');
10
+ goog.require('shakaAssets');
12
11
  goog.require('shakaDemo.MessageIds');
13
12
  goog.require('shakaDemo.Tooltips');
14
13
  goog.requireType('ShakaDemoAssetInfo');
@@ -63,7 +63,7 @@ UNCOMPILED_JS = [
63
63
  <script defer src="../load.js"></script>
64
64
  </head>
65
65
  <body>
66
- <div data-shaka-player-container id="videoContainer">
66
+ <div data-shaka-player-container id="video-container">
67
67
  <video autoplay data-shaka-player id="video"></video>
68
68
  </div>
69
69
  <!-- Covers everything else while idle -->
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- /* Experimentation has revealed that unless html, body, and videoContainer are
7
+ /* Experimentation has revealed that unless html, body, and video-container are
8
8
  * width and height 100%, video can force all its parents to grow larger than
9
9
  * window.innerHeight, causing things to be cut off for some content.
10
10
  */
@@ -25,7 +25,7 @@ body {
25
25
  color: white;
26
26
  }
27
27
 
28
- #videoContainer {
28
+ #video-container {
29
29
  width: 100%;
30
30
  height: 100%;
31
31
  }
@@ -83,29 +83,29 @@ body:after {
83
83
  height: 0;
84
84
  overflow: hidden;
85
85
  z-index: -1;
86
- content: url(idle1.jpg) url(idle2.jpg) url(idle3.jpg);
86
+ content: url("idle1.jpg") url("idle2.jpg") url("idle3.jpg");
87
87
  }
88
88
 
89
89
  @keyframes bg-change {
90
- 0% { background-image: url('idle1.jpg'); padding-left: 0; }
90
+ 0% { background-image: url("idle1.jpg"); padding-left: 0; }
91
91
 
92
- 32% { background-image: url('idle1.jpg'); padding-left: 0; }
92
+ 32% { background-image: url("idle1.jpg"); padding-left: 0; }
93
93
 
94
- 34% { background-image: url('idle2.jpg'); padding-left: 0; }
94
+ 34% { background-image: url("idle2.jpg"); padding-left: 0; }
95
95
 
96
- 49% { background-image: url('idle2.jpg'); padding-left: 0; }
96
+ 49% { background-image: url("idle2.jpg"); padding-left: 0; }
97
97
 
98
- 50% { background-image: url('idle2.jpg'); padding-left: 400px; }
98
+ 50% { background-image: url("idle2.jpg"); padding-left: 400px; }
99
99
 
100
- 65% { background-image: url('idle2.jpg'); padding-left: 400px; }
100
+ 65% { background-image: url("idle2.jpg"); padding-left: 400px; }
101
101
 
102
- 67% { background-image: url('idle3.jpg'); padding-left: 400px; }
102
+ 67% { background-image: url("idle3.jpg"); padding-left: 400px; }
103
103
 
104
- 87% { background-image: url('idle3.jpg'); padding-left: 400px; }
104
+ 87% { background-image: url("idle3.jpg"); padding-left: 400px; }
105
105
 
106
- 88% { background-image: url('idle3.jpg'); padding-left: 0; }
106
+ 88% { background-image: url("idle3.jpg"); padding-left: 0; }
107
107
 
108
- 98% { background-image: url('idle3.jpg'); padding-left: 0; }
108
+ 98% { background-image: url("idle3.jpg"); padding-left: 0; }
109
109
 
110
- 100% { background-image: url('idle1.jpg'); padding-left: 0; }
110
+ 100% { background-image: url("idle1.jpg"); padding-left: 0; }
111
111
  }
@@ -13,6 +13,8 @@
13
13
  goog.require('ShakaDemoAssetInfo');
14
14
  goog.require('shakaDemo.MessageIds');
15
15
 
16
+ goog.provide('shakaAssets');
17
+
16
18
 
17
19
  // Types and enums {{{
18
20
  /**
package/demo/config.js CHANGED
@@ -11,7 +11,6 @@ goog.require('goog.asserts');
11
11
  goog.require('shakaDemo.BoolInput');
12
12
  goog.require('shakaDemo.DatalistInput');
13
13
  goog.require('shakaDemo.InputContainer');
14
- goog.require('shakaDemo.Main');
15
14
  goog.require('shakaDemo.MessageIds');
16
15
  goog.require('shakaDemo.NumberInput');
17
16
  goog.require('shakaDemo.SelectInput');
package/demo/custom.js CHANGED
@@ -12,7 +12,6 @@ goog.require('ShakaDemoAssetInfo');
12
12
  goog.require('shakaDemo.AssetCard');
13
13
  goog.require('shakaDemo.Input');
14
14
  goog.require('shakaDemo.InputContainer');
15
- goog.require('shakaDemo.Main');
16
15
  goog.require('shakaDemo.MessageIds');
17
16
  goog.require('shakaDemo.TextInput');
18
17
 
@@ -4,5 +4,5 @@ of the asset you were playing at the time you pressed the bug report button.
4
4
  We have detected that you were playing a custom asset.
5
5
  If this asset's URL is confidential, you might instead want to fill out an issue
6
6
  template manually:
7
- https://github.com/google/shaka-player/issues/new/choose
8
- -->
7
+ https://github.com/shaka-project/shaka-player/issues/new/choose
8
+ -->