shaka-player 2.5.1 → 2.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/.csslintrc +13 -0
  2. package/AUTHORS +3 -0
  3. package/CHANGELOG.md +156 -0
  4. package/CONTRIBUTORS +3 -0
  5. package/README.md +3 -0
  6. package/build/README.md +5 -5
  7. package/build/apps.py +3 -1
  8. package/build/build.py +5 -2
  9. package/build/check.py +17 -0
  10. package/build/compiler.py +49 -0
  11. package/build/conformance.textproto +1 -0
  12. package/build/docs.py +0 -6
  13. package/build/generateExterns.js +72 -20
  14. package/build/install-linux-prereqs.sh +4 -4
  15. package/build/shakaBuildHelpers.py +7 -8
  16. package/build/test.py +21 -9
  17. package/build/types/core +1 -0
  18. package/build/types/ui +6 -1
  19. package/demo/asset_card.js +129 -41
  20. package/demo/cast_receiver/receiver_app.css +27 -13
  21. package/demo/close_button.js +10 -15
  22. package/demo/common/asset.js +6 -6
  23. package/demo/common/assets.js +72 -14
  24. package/demo/config.js +28 -25
  25. package/demo/custom.js +20 -16
  26. package/demo/demo.less +107 -16
  27. package/demo/demo_uncompiled.js +33 -0
  28. package/demo/demo_utils.js +4 -3
  29. package/demo/front.js +12 -8
  30. package/demo/index.html +14 -17
  31. package/demo/input.js +30 -23
  32. package/demo/input_container.js +15 -11
  33. package/demo/load.js +5 -7
  34. package/demo/main.js +138 -49
  35. package/demo/search.js +40 -36
  36. package/demo/service_worker.js +1 -1
  37. package/demo/tooltip.js +16 -24
  38. package/dist/.csslintstamp +0 -0
  39. package/dist/controls.css +1 -1
  40. package/dist/controls.css.map +1 -1
  41. package/dist/demo.compiled.debug.js +165 -152
  42. package/dist/demo.compiled.debug.map +4 -4
  43. package/dist/demo.compiled.js +165 -152
  44. package/dist/demo.compiled.map +4 -4
  45. package/dist/demo.css +1 -1
  46. package/dist/demo.css.map +1 -1
  47. package/dist/deps.js +28 -11
  48. package/dist/receiver.compiled.debug.js +11 -11
  49. package/dist/receiver.compiled.debug.map +3 -3
  50. package/dist/receiver.compiled.js +11 -11
  51. package/dist/receiver.compiled.map +3 -3
  52. package/dist/shaka-player.compiled.debug.externs.js +232 -102
  53. package/dist/shaka-player.compiled.debug.js +189 -165
  54. package/dist/shaka-player.compiled.debug.map +4 -4
  55. package/dist/shaka-player.compiled.externs.js +232 -102
  56. package/dist/shaka-player.compiled.js +567 -553
  57. package/dist/shaka-player.compiled.map +4 -4
  58. package/dist/shaka-player.ui.debug.externs.js +338 -113
  59. package/dist/shaka-player.ui.debug.js +296 -276
  60. package/dist/shaka-player.ui.debug.map +4 -4
  61. package/dist/shaka-player.ui.externs.js +338 -113
  62. package/dist/shaka-player.ui.js +685 -671
  63. package/dist/shaka-player.ui.map +4 -4
  64. package/docs/tutorials/drm-config.md +1 -0
  65. package/docs/tutorials/fairplay.md +77 -0
  66. package/docs/tutorials/index.json +1 -0
  67. package/docs/tutorials/manifest-parser.md +1 -1
  68. package/docs/tutorials/ui-customization.md +5 -2
  69. package/docs/tutorials/ui.md +10 -4
  70. package/docs/tutorials/welcome.md +2 -2
  71. package/externs/mediasession.js +16 -1
  72. package/externs/shaka/net.js +14 -4
  73. package/externs/shaka/player.js +136 -90
  74. package/externs/tippy.js +30 -0
  75. package/externs/webkitmediakeys.js +4 -0
  76. package/karma.conf.js +30 -24
  77. package/lib/cast/cast_proxy.js +94 -23
  78. package/lib/cast/cast_receiver.js +8 -1
  79. package/lib/dash/content_protection.js +33 -1
  80. package/lib/dash/dash_parser.js +13 -5
  81. package/lib/hls/hls_parser.js +20 -4
  82. package/lib/media/drm_engine.js +29 -2
  83. package/lib/media/media_source_engine.js +9 -6
  84. package/lib/media/play_rate_controller.js +14 -3
  85. package/lib/media/playhead.js +8 -3
  86. package/lib/media/streaming_engine.js +68 -20
  87. package/lib/media/transmuxer.js +2 -2
  88. package/lib/media/video_wrapper.js +8 -3
  89. package/lib/net/data_uri_plugin.js +5 -2
  90. package/lib/net/http_fetch_plugin.js +3 -3
  91. package/lib/net/http_plugin_utils.js +2 -4
  92. package/lib/net/http_xhr_plugin.js +2 -2
  93. package/lib/net/networking_engine.js +1 -0
  94. package/lib/offline/offline_scheme.js +7 -2
  95. package/lib/player.js +18 -8
  96. package/lib/polyfill/input_event.js +7 -11
  97. package/lib/polyfill/mediasource.js +1 -1
  98. package/lib/polyfill/patchedmediakeys_apple.js +2 -72
  99. package/lib/text/cue.js +1 -1
  100. package/lib/text/ttml_text_parser.js +1 -1
  101. package/lib/util/config_utils.js +1 -0
  102. package/lib/util/error.js +45 -11
  103. package/lib/util/event_manager.js +211 -100
  104. package/lib/util/fairplay_utils.js +122 -0
  105. package/lib/util/i_releasable.js +1 -0
  106. package/lib/util/player_configuration.js +7 -0
  107. package/lib/util/pssh.js +41 -0
  108. package/lib/util/string_utils.js +42 -6
  109. package/lib/util/timer.js +1 -1
  110. package/package.json +33 -33
  111. package/roadmap.md +96 -0
  112. package/shaka-player.uncompiled.js +5 -1
  113. package/test/dash/dash_parser_content_protection_unit.js +35 -1
  114. package/test/dash/dash_parser_manifest_unit.js +60 -0
  115. package/test/hls/hls_live_unit.js +7 -1
  116. package/test/hls/hls_parser_unit.js +50 -0
  117. package/test/media/drm_engine_unit.js +10 -4
  118. package/test/media/media_source_engine_integration.js +12 -0
  119. package/test/media/media_source_engine_unit.js +3 -1
  120. package/test/media/playhead_unit.js +7 -5
  121. package/test/media/streaming_engine_unit.js +46 -1
  122. package/test/media/transmuxer_integration.js +13 -0
  123. package/test/net/data_uri_plugin_unit.js +13 -2
  124. package/test/net/http_plugin_unit.js +17 -12
  125. package/test/net/networking_engine_unit.js +17 -8
  126. package/test/offline/offline_scheme_unit.js +18 -8
  127. package/test/player_external.js +3 -2
  128. package/test/player_integration.js +94 -3
  129. package/test/player_src_equals_integration.js +2 -2
  130. package/test/player_unit.js +21 -8
  131. package/test/test/boot.js +20 -5
  132. package/test/test/externs/jasmine.js +48 -0
  133. package/test/test/util/expect_async_polyfill.js +145 -0
  134. package/test/test/util/fake_networking_engine.js +1 -0
  135. package/test/test/util/manifest_generator.js +2 -1
  136. package/test/test/util/test_scheme.js +34 -2
  137. package/test/test/util/ui_utils.js +41 -0
  138. package/test/test/util/util.js +16 -8
  139. package/test/ui/ui_unit.js +130 -4
  140. package/ui/audio_language_selection.js +17 -96
  141. package/ui/big_play_button.js +61 -0
  142. package/ui/controls.js +226 -335
  143. package/ui/controls.less +3 -5
  144. package/ui/element.js +24 -6
  145. package/ui/externs/ui.js +62 -9
  146. package/ui/fullscreen_button.js +2 -52
  147. package/ui/less/buttons.less +10 -16
  148. package/ui/less/containers.less +75 -20
  149. package/ui/less/general.less +18 -2
  150. package/ui/less/other_elements.less +2 -1
  151. package/ui/less/overflow_menu.less +11 -10
  152. package/ui/less/range_elements.less +12 -10
  153. package/ui/less/spinner.less +2 -0
  154. package/ui/overflow_menu.js +1 -1
  155. package/ui/pip_button.js +1 -1
  156. package/ui/{play_pause_button.js → play_button.js} +17 -47
  157. package/ui/presentation_time.js +17 -12
  158. package/ui/range_element.js +176 -0
  159. package/ui/resolution_selection.js +43 -106
  160. package/ui/seek_bar.js +204 -0
  161. package/ui/settings_menu.js +113 -0
  162. package/ui/small_play_button.js +73 -0
  163. package/ui/text_displayer.js +17 -14
  164. package/ui/text_selection.js +42 -107
  165. package/ui/ui.js +17 -40
  166. package/ui/volume_bar.js +40 -68
@@ -160,3 +160,4 @@ values for other key systems are not known to us at this time.
160
160
  #### Continue the Tutorials
161
161
 
162
162
  Next, check out {@tutorial license-server-auth}.
163
+ Or check out {@tutorial fairplay}.
@@ -0,0 +1,77 @@
1
+ # FairPlay Support
2
+
3
+ When using native `src=` playback, we support using FairPlay on Safari.
4
+ Adding FairPlay support involves a bit more work than other key systems.
5
+
6
+
7
+ ## Server certificate
8
+
9
+ All FairPlay content requires setting a server certificate. This is set in the
10
+ Player configuration:
11
+
12
+ ```js
13
+ const req = await fetch('https://example.com/cert.der');
14
+ const cert = await req.arrayBuffer();
15
+
16
+ player.configure('drm.advanced.com\\.apple\\.fps\\.1_0.serverCertificate',
17
+ new Uint8Array(cert));
18
+ ```
19
+
20
+
21
+ ## Content ID
22
+
23
+ Some FairPlay content use custom signaling for the content ID. The content ID
24
+ is used by the browser to generate the license request. If you don't use the
25
+ default content ID derivation, you need to specify a custom init data transform:
26
+
27
+ ```js
28
+ player.configure('drm.initDataTransform', (initData) => {
29
+ const contentId = getMyContentId(initData);
30
+ const cert = player.drmInfo().serverCertificate;
31
+ return shaka.util.FairPlayUtils.initDataTransform(initData, contentId, cert);
32
+ });
33
+ ```
34
+
35
+ ## License wrapping
36
+
37
+ For v2.5.x, we provide a default license request/response filter that mirrors
38
+ the FairPlay examples. You can remove these by setting the
39
+ `drm.fairPlayTransform` configuration to `false`.
40
+
41
+ Some FairPlay servers need to accept the license request in a different format
42
+ or give the response in a different format. For more info, see the general
43
+ {@tutorial license-wrapping} tutorial:
44
+
45
+ ```js
46
+ player.getNetworkingEngine().registerRequestFilter((type, request) => {
47
+ if (type != shaka.net.NetworkingEngine.RequestType.LICENSE) {
48
+ return;
49
+ }
50
+
51
+ const originalPayload = new Uint8Array(request.body);
52
+ const base64Payload =
53
+ shaka.util.Uint8ArrayUtils.toStandardBase64(originalPayload);
54
+ const params = 'spc=' + base64Payload;
55
+ request.headers['Content-Type'] = 'application/x-www-form-urlencoded';
56
+ request.body = shaka.util.StringUtils.toUTF8(encodeURIComponent(params));
57
+ });
58
+
59
+ player.getNetworkingEngine().registerResponseFilter((type, request) => {
60
+ if (type != shaka.net.NetworkingEngine.RequestType.LICENSE) {
61
+ return;
62
+ }
63
+
64
+ let responseText = shaka.util.StringUtils.fromUTF8(response.data);
65
+ // Trim whitespace.
66
+ responseText = responseText.trim();
67
+
68
+ // Look for <ckc> wrapper and remove it.
69
+ if (responseText.substr(0, 5) === '<ckc>' &&
70
+ responseText.substr(-6) === '</ckc>') {
71
+ responseText = responseText.slice(5, -6);
72
+ }
73
+
74
+ // Decode the base64-encoded data into the format the browser expects.
75
+ response.data = shaka.util.Uint8ArrayUtils.fromBase64(responseText).buffer;
76
+ });
77
+ ```
@@ -15,6 +15,7 @@
15
15
  { "architecture": { "title": "Architecture Diagrams" } },
16
16
  { "service-worker": { "title": "Service Worker Caching" } },
17
17
  { "offline": { "title": "Offline Storage and Playback" } },
18
+ { "fairplay": { "title": "FairPlay support" } },
18
19
  { "faq": { "title": "Frequently Asked Questions" } },
19
20
  { "upgrade": {
20
21
  "title": "Upgrade Guide",
@@ -216,7 +216,7 @@ In order to support Live content, the manifest may need to be updated. In the
216
216
  `setInterval`) to update the manifest. Then it should re-parse the manifest
217
217
  periodically. To add new segments to the streams, simply add them to the
218
218
  segment index. Because the original manifest object is modified in-place,
219
- adding them to the index will allow the Player to use them. You *cannnot* add
219
+ adding them to the index will allow the Player to use them. You *cannot* add
220
220
  new Variants or text streams to an existing Period.
221
221
 
222
222
  To add a new Period, you must first call `filterNewPeriod`. This will filter out
@@ -68,6 +68,9 @@ The following buttons can be added to the overflow menu:
68
68
  that support it. Button is invisible on other browsers.
69
69
  <!-- TODO: If we add more buttons that can be put in the order this way, list them here. -->
70
70
 
71
+ The presense of the seek bar and the big play button in the center of the video element can be
72
+ customized with `addSeekBar` and `addBigPlayButton` booleans in the config.
73
+
71
74
  UI layout can be reconfigured at any point after it's been created.
72
75
  Please note that custom layouts might need CSS adjustments to look good.
73
76
 
@@ -75,8 +78,8 @@ Please note that custom layouts might need CSS adjustments to look good.
75
78
  <!-- TODO: Is there a better way to do this? (The actual thing, not the tutorial) -->
76
79
  The seek bar consists of three segments: past (already played part of the presentation),
77
80
  future-buffered and future-unbuffered. The segments colors are set when the seek bar is created.
78
- To customize the colors, change the values of `shaka.ui.Controls.SEEK_BAR_BASE_COLOR_` ,
79
- `shaka.ui.Controls.SEEK_BAR_PLAYED_COLOR_`, and `shaka.ui.Controls.SEEK_BAR_BUFFERED_COLOR_` in ui/controls.js
81
+ To customize the colors, change the values of `shaka.ui.Constants.SEEK_BAR_BASE_COLOR` ,
82
+ `shaka.ui.Constants.SEEK_BAR_PLAYED_COLOR`, and `shaka.ui.Constants.SEEK_BAR_BUFFERED_COLOR` in ui/controls.js
80
83
 
81
84
 
82
85
  #### Creating custom elements and adding them to the UI
@@ -19,6 +19,8 @@ Set up controls with HTML data attributes:
19
19
  <script src="dist/shaka-player.ui.js"></script>
20
20
  <!-- Shaka Player ui compiled library default CSS: -->
21
21
  <link rel="stylesheet" type="text/css" href="dist/controls.css">
22
+ <!-- Chromecast SDK (if you want Chromecast support for your app): -->
23
+ <script defer src="https://www.gstatic.com/cv/js/sender/v1/cast_sender.js"></script>
22
24
  <!-- Your application source: -->
23
25
  <script src="myapp.js"></script>
24
26
  </head>
@@ -27,7 +29,7 @@ Set up controls with HTML data attributes:
27
29
  The data-shaka-player-cast-receiver-id tag allows you to provide a Cast Application ID that
28
30
  the cast button will cast to; the value provided here is the sample cast receiver. -->
29
31
  <div data-shaka-player-container style="max-width:40em"
30
- data-shaka-player-cast-receiver-id="A15A181D">
32
+ data-shaka-player-cast-receiver-id="7B25EC44">
31
33
  <!-- The data-shaka-player tag will make the UI library use this video element.
32
34
  If no video is provided, the UI will automatically make one inside the container div. -->
33
35
  <video autoplay data-shaka-player id="video" style="width:100%;height:100%"></video>
@@ -60,7 +62,7 @@ async function init() {
60
62
  // This runs if the asynchronous load is successful.
61
63
  console.log('The video has now been loaded!');
62
64
  } catch (error) {
63
- onError(error);
65
+ onPlayerError(error);
64
66
  }
65
67
  }
66
68
 
@@ -71,21 +73,24 @@ function onPlayerErrorEvent(errorEvent) {
71
73
 
72
74
  function onPlayerError(error) {
73
75
  // Handle player error
76
+ console.error('Error code', error.code, 'object', error);
74
77
  }
75
78
 
76
79
  function onUIErrorEvent(errorEvent) {
77
- // Handle UI error
80
+ // Extract the shaka.util.Error object from the event.
81
+ onPlayerError(event.detail);
78
82
  }
79
83
 
80
84
  function initFailed() {
81
85
  // Handle the failure to load
86
+ console.error('Unable to load the UI library!');
82
87
  }
83
88
 
84
89
  // Listen to the custom shaka-ui-loaded event, to wait until the UI is loaded.
85
90
  document.addEventListener('shaka-ui-loaded', init);
86
91
  // Listen to the custom shaka-ui-load-failed event, in case Shaka Player fails
87
92
  // to load (e.g. due to lack of browser support).
88
- document.addEventListener('shaka-ui-load-failed, initFailed);
93
+ document.addEventListener('shaka-ui-load-failed', initFailed);
89
94
 
90
95
  ```
91
96
 
@@ -116,6 +121,7 @@ Next, let's add a listener to the 'caststatuschanged' event in myapp.js:
116
121
  function onCastStatusChanged(event) {
117
122
  const newCastStatus = event['newStatus'];
118
123
  // Handle cast status change
124
+ console.log('The new cast status is: ' + newCastStatus);
119
125
  }
120
126
 
121
127
  ```
@@ -28,9 +28,9 @@ externs have been generated.
28
28
  You can build Shaka on Linux, Windows, or Mac.
29
29
  To get the sources and compile the library, you will need:
30
30
  * {@link https://git-scm.com/downloads Git v1.9+}
31
- * {@link https://www.python.org/downloads/ Python v2.7}
31
+ * {@link https://www.python.org/downloads/ Python v2.7 or v3.5+}
32
32
  * {@link https://java.com/en/download/ Java Runtime Environment v8+}
33
- * {@link https://nodejs.org/en/download/ NodeJS v6+}
33
+ * {@link https://nodejs.org/en/download/ NodeJS v8+}
34
34
  * A local web server, such as {@link https://httpd.apache.org/ Apache}
35
35
  * _NOTE: A local web server is required because browsers place restrictions
36
36
  on applications from file:/// URLs._
@@ -34,5 +34,20 @@ var MediaMetadata = function(options) {};
34
34
  MediaMetadata.prototype.title;
35
35
 
36
36
 
37
- /** @type {MediaMetadata} */
37
+ /** @type {string} */
38
+ MediaMetadata.prototype.artist;
39
+
40
+
41
+ /** @type {string} */
42
+ MediaMetadata.prototype.artwork;
43
+
44
+
45
+ /** @constructor */
46
+ var MediaSession = function() {};
47
+
48
+ /** @type {?MediaMetadata} */
49
+ MediaSession.prototype.metadata;
50
+
51
+
52
+ /** @type {MediaSession} */
38
53
  Navigator.prototype.mediaSession;
@@ -60,7 +60,8 @@ shaka.extern.RetryParameters;
60
60
  * headers: !Object.<string, string>,
61
61
  * allowCrossSiteCredentials: boolean,
62
62
  * retryParameters: !shaka.extern.RetryParameters,
63
- * licenseRequestType: ?string
63
+ * licenseRequestType: ?string,
64
+ * sessionId: ?string
64
65
  * }}
65
66
  *
66
67
  * @description
@@ -87,6 +88,9 @@ shaka.extern.RetryParameters;
87
88
  * request it is (not the type of license). This is the |messageType| field
88
89
  * of the EME message. For example, this could be 'license-request' or
89
90
  * 'license-renewal'.
91
+ * @property {?string} sessionId
92
+ * If this is a LICENSE request, this field contains the session ID of the
93
+ * EME session that made the request.
90
94
  *
91
95
  * @exportDoc
92
96
  */
@@ -110,6 +114,9 @@ shaka.extern.Request;
110
114
  * @property {string} uri
111
115
  * The URI which was loaded. Request filters and server redirects can cause
112
116
  * this to be different from the original request URIs.
117
+ * @property {string} originalUri
118
+ * The original URI passed to the browser for networking. This is before any
119
+ * redirects, but after request filters are executed.
113
120
  * @property {ArrayBuffer} data
114
121
  * The body of the response.
115
122
  * @property {!Object.<string, string>} headers
@@ -132,13 +139,16 @@ shaka.extern.Response;
132
139
  * @typedef {!function(string,
133
140
  * shaka.extern.Request,
134
141
  * shaka.net.NetworkingEngine.RequestType,
135
- * shaka.extern.ProgressUpdated=):
142
+ * shaka.extern.ProgressUpdated):
136
143
  * !shaka.extern.IAbortableOperation.<shaka.extern.Response>}
137
144
  * @description
138
145
  * Defines a plugin that handles a specific scheme.
146
+ *
139
147
  * The functions accepts four parameters, uri string, request, request type,
140
- * and an optional progressUpdated function.
141
-
148
+ * and a progressUpdated function. The progressUpdated function can be ignored
149
+ * by plugins that do not have this information, but it will always be provided
150
+ * by NetworkingEngine.
151
+ *
142
152
  * @exportDoc
143
153
  */
144
154
  shaka.extern.SchemePlugin;