sanity-plugin-mux-input 1.1.0

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 (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +86 -0
  3. package/build/actions/assets.js +37 -0
  4. package/build/actions/assets.js.map +1 -0
  5. package/build/actions/secrets.js +125 -0
  6. package/build/actions/secrets.js.map +1 -0
  7. package/build/actions/upload.js +280 -0
  8. package/build/actions/upload.js.map +1 -0
  9. package/build/clients/SanityClient.js +19 -0
  10. package/build/clients/SanityClient.js.map +1 -0
  11. package/build/clients/upChunkObservable.js +66 -0
  12. package/build/clients/upChunkObservable.js.map +1 -0
  13. package/build/components/FileInputButton.js +84 -0
  14. package/build/components/FileInputButton.js.map +1 -0
  15. package/build/components/Input.css +30 -0
  16. package/build/components/Input.js +823 -0
  17. package/build/components/Input.js.map +1 -0
  18. package/build/components/MuxLogo.js +19 -0
  19. package/build/components/MuxLogo.js.map +1 -0
  20. package/build/components/Preview.css +16 -0
  21. package/build/components/Preview.js +95 -0
  22. package/build/components/Preview.js.map +1 -0
  23. package/build/components/SelectAsset.css +56 -0
  24. package/build/components/SelectAsset.js +162 -0
  25. package/build/components/SelectAsset.js.map +1 -0
  26. package/build/components/Setup.css +7 -0
  27. package/build/components/Setup.js +311 -0
  28. package/build/components/Setup.js.map +1 -0
  29. package/build/components/UploadPlaceholder.css +81 -0
  30. package/build/components/UploadPlaceholder.js +92 -0
  31. package/build/components/UploadPlaceholder.js.map +1 -0
  32. package/build/components/Uploader.css +28 -0
  33. package/build/components/Uploader.js +534 -0
  34. package/build/components/Uploader.js.map +1 -0
  35. package/build/components/Video.css +21 -0
  36. package/build/components/Video.js +360 -0
  37. package/build/components/Video.js.map +1 -0
  38. package/build/config.js +17 -0
  39. package/build/config.js.map +1 -0
  40. package/build/index.js +22 -0
  41. package/build/index.js.map +1 -0
  42. package/build/schema/mux.video.js +41 -0
  43. package/build/schema/mux.video.js.map +1 -0
  44. package/build/schema/mux.videoAsset.js +29 -0
  45. package/build/schema/mux.videoAsset.js.map +1 -0
  46. package/build/util/extractFiles.js +70 -0
  47. package/build/util/extractFiles.js.map +1 -0
  48. package/build/util/formatTime.js +28 -0
  49. package/build/util/formatTime.js.map +1 -0
  50. package/build/util/generateJwt.js +30 -0
  51. package/build/util/generateJwt.js.map +1 -0
  52. package/build/util/getPosterSrc.js +46 -0
  53. package/build/util/getPosterSrc.js.map +1 -0
  54. package/build/util/getStoryboardSrc.js +26 -0
  55. package/build/util/getStoryboardSrc.js.map +1 -0
  56. package/build/util/getVideoSrc.js +23 -0
  57. package/build/util/getVideoSrc.js.map +1 -0
  58. package/config.dist.json +3 -0
  59. package/package.json +85 -0
  60. package/sanity.json +16 -0
@@ -0,0 +1,360 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _ui = require("@sanity/ui");
9
+
10
+ var _hls = _interopRequireDefault(require("hls.js"));
11
+
12
+ require("media-chrome");
13
+
14
+ var _default2 = _interopRequireDefault(require("part:@sanity/components/buttons/default"));
15
+
16
+ var _bar = _interopRequireDefault(require("part:@sanity/components/progress/bar"));
17
+
18
+ var _propTypes = _interopRequireDefault(require("prop-types"));
19
+
20
+ var _react = _interopRequireWildcard(require("react"));
21
+
22
+ var _assets = require("../actions/assets");
23
+
24
+ var _secrets = require("../actions/secrets");
25
+
26
+ var _getPosterSrc = _interopRequireDefault(require("../util/getPosterSrc"));
27
+
28
+ var _getStoryboardSrc = _interopRequireDefault(require("../util/getStoryboardSrc"));
29
+
30
+ var _getVideoSrc = _interopRequireDefault(require("../util/getVideoSrc"));
31
+
32
+ var _Video = _interopRequireDefault(require("./Video.css"));
33
+
34
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
35
+
36
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
37
+
38
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
39
+
40
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
41
+
42
+ var NOOP = () => {
43
+ /* intentional noop */
44
+ };
45
+
46
+ var propTypes = {
47
+ // eslint-disable-next-line react/forbid-prop-types
48
+ assetDocument: _propTypes.default.object.isRequired,
49
+ autoload: _propTypes.default.bool,
50
+ onCancel: _propTypes.default.func,
51
+ onReady: _propTypes.default.func
52
+ };
53
+
54
+ class MuxVideo extends _react.Component {
55
+ constructor(props) {
56
+ super(props);
57
+
58
+ _defineProperty(this, "videoContainer", /*#__PURE__*/_react.default.createRef());
59
+
60
+ _defineProperty(this, "hls", null);
61
+
62
+ _defineProperty(this, "handleVideoClick", event => {
63
+ this.setState({
64
+ showControls: true
65
+ });
66
+ this.hls.startLoad(0);
67
+
68
+ if (this.props.onReady) {
69
+ this.props.onReady(event);
70
+ }
71
+ });
72
+
73
+ _defineProperty(this, "handleCancelButtonClicked", event => {
74
+ if (this.props.onCancel) {
75
+ this.props.onCancel(event);
76
+ }
77
+ });
78
+
79
+ this.state = {
80
+ storyboardUrl: null,
81
+ posterUrl: null,
82
+ source: null,
83
+ isLoading: true,
84
+ error: null,
85
+ isDeletedOnMux: false,
86
+ isPreparingStaticRenditions: false,
87
+ secrets: null
88
+ };
89
+ this.playRef = /*#__PURE__*/_react.default.createRef();
90
+ this.muteRef = /*#__PURE__*/_react.default.createRef();
91
+ } // eslint-disable-next-line complexity
92
+
93
+
94
+ static getDerivedStateFromProps(nextProps) {
95
+ var _assetDocument$data, _assetDocument$data$s, _assetDocument$data2, _assetDocument$data2$;
96
+
97
+ var isLoading = true;
98
+ var isPreparingStaticRenditions = false;
99
+ var assetDocument = nextProps.assetDocument;
100
+
101
+ if (assetDocument && assetDocument.status === 'preparing') {
102
+ isLoading = 'Preparing the video';
103
+ }
104
+
105
+ if (assetDocument && assetDocument.status === 'waiting_for_upload') {
106
+ isLoading = 'Waiting for upload to start';
107
+ }
108
+
109
+ if (assetDocument && assetDocument.status === 'waiting') {
110
+ isLoading = 'Processing upload';
111
+ }
112
+
113
+ if (assetDocument && assetDocument.status === 'ready') {
114
+ isLoading = false;
115
+ }
116
+
117
+ if (assetDocument && typeof assetDocument.status === 'undefined') {
118
+ isLoading = false;
119
+ }
120
+
121
+ if ((assetDocument === null || assetDocument === void 0 ? void 0 : (_assetDocument$data = assetDocument.data) === null || _assetDocument$data === void 0 ? void 0 : (_assetDocument$data$s = _assetDocument$data.static_renditions) === null || _assetDocument$data$s === void 0 ? void 0 : _assetDocument$data$s.status) === 'preparing') {
122
+ isPreparingStaticRenditions = true;
123
+ }
124
+
125
+ if ((assetDocument === null || assetDocument === void 0 ? void 0 : (_assetDocument$data2 = assetDocument.data) === null || _assetDocument$data2 === void 0 ? void 0 : (_assetDocument$data2$ = _assetDocument$data2.static_renditions) === null || _assetDocument$data2$ === void 0 ? void 0 : _assetDocument$data2$.status) === 'ready') {
126
+ isPreparingStaticRenditions = false;
127
+ }
128
+
129
+ return {
130
+ isLoading,
131
+ isPreparingStaticRenditions
132
+ };
133
+ }
134
+
135
+ componentDidMount() {
136
+ var _this$playRef, _this$playRef$current, _this$muteRef, _this$muteRef$current;
137
+
138
+ this.video = /*#__PURE__*/_react.default.createRef();
139
+ var style = document.createElement('style');
140
+ style.innerHTML = 'button svg { vertical-align: middle; }';
141
+
142
+ if ((_this$playRef = this.playRef) !== null && _this$playRef !== void 0 && (_this$playRef$current = _this$playRef.current) !== null && _this$playRef$current !== void 0 && _this$playRef$current.shadowRoot) {
143
+ this.playRef.current.shadowRoot.appendChild(style);
144
+ }
145
+
146
+ if ((_this$muteRef = this.muteRef) !== null && _this$muteRef !== void 0 && (_this$muteRef$current = _this$muteRef.current) !== null && _this$muteRef$current !== void 0 && _this$muteRef$current.shadowRoot) {
147
+ this.muteRef.current.shadowRoot.appendChild(style.cloneNode(true));
148
+ }
149
+
150
+ this.setState(MuxVideo.getDerivedStateFromProps(this.props));
151
+ (0, _secrets.fetchSecrets)().then(_ref => {
152
+ var secrets = _ref.secrets;
153
+ return this.setState({
154
+ secrets
155
+ });
156
+ });
157
+ }
158
+
159
+ componentDidUpdate(prevProps, prevState) {
160
+ var previousVideo = prevProps.assetDocument.playbackId;
161
+ var newVideo = this.props.assetDocument.playbackId;
162
+
163
+ if (!this.state.isLoading && this.state.secrets && (this.state.source === null || previousVideo !== newVideo)) {
164
+ this.resolveSourceAndPoster(this.props.assetDocument);
165
+ }
166
+
167
+ if (this.state.source !== null && this.video.current && !this.video.current.src) {
168
+ // eslint-disable-next-line react/no-did-update-set-state
169
+ this.setState({
170
+ error: null
171
+ });
172
+ this.attachVideo();
173
+ }
174
+
175
+ if (this.state.source !== null && this.state.source !== prevState.source) {
176
+ // eslint-disable-next-line react/no-did-update-set-state
177
+ this.setState({
178
+ error: null,
179
+ showControls: false
180
+ });
181
+
182
+ if (this.hls) {
183
+ this.hls.destroy();
184
+ }
185
+
186
+ this.attachVideo();
187
+ }
188
+ }
189
+
190
+ resolveSourceAndPoster(assetDocument) {
191
+ var playbackId = assetDocument.playbackId;
192
+ var options = {
193
+ isSigned: assetDocument.data.playback_ids[0].policy === 'signed',
194
+ signingKeyId: this.state.secrets.signingKeyId || null,
195
+ signingKeyPrivate: this.state.secrets.signingKeyPrivate || null
196
+ };
197
+ var source = (0, _getVideoSrc.default)(playbackId, options);
198
+ var posterUrl = (0, _getPosterSrc.default)(playbackId, options);
199
+ var storyboardUrl = (0, _getStoryboardSrc.default)(playbackId, options);
200
+ this.setState({
201
+ source,
202
+ posterUrl,
203
+ storyboardUrl
204
+ });
205
+ }
206
+
207
+ getVideoElement() {
208
+ return this.video && this.video.current;
209
+ }
210
+
211
+ attachVideo() {
212
+ var _this$props = this.props,
213
+ assetDocument = _this$props.assetDocument,
214
+ autoload = _this$props.autoload;
215
+
216
+ if (_hls.default.isSupported()) {
217
+ this.hls = new _hls.default({
218
+ autoStartLoad: autoload
219
+ });
220
+ this.hls.loadSource(this.state.source);
221
+ this.hls.attachMedia(this.video.current);
222
+ this.hls.on(_hls.default.Events.MANIFEST_PARSED, e => {
223
+ if (this.videoContainer.current) {
224
+ this.videoContainer.current.style.display = 'block';
225
+ }
226
+
227
+ if (this.props.onReady) {
228
+ this.props.onReady();
229
+ }
230
+ });
231
+ this.hls.on(_hls.default.Events.ERROR, (event, data) => {
232
+ switch (data.type) {
233
+ case _hls.default.ErrorTypes.NETWORK_ERROR:
234
+ if (this.videoContainer.current) {
235
+ this.videoContainer.current.style.display = 'none';
236
+ }
237
+
238
+ this.setState({
239
+ error: data
240
+ });
241
+ (0, _assets.getAsset)(assetDocument.assetId).then(response => {
242
+ this.setState({
243
+ isDeletedOnMux: false
244
+ });
245
+ }).catch(err => {
246
+ if (err.message.match(/404/)) {
247
+ this.setState({
248
+ isDeletedOnMux: true
249
+ });
250
+ return;
251
+ }
252
+
253
+ console.error(data, err); // eslint-disable-line no-console
254
+ });
255
+ break;
256
+
257
+ default:
258
+ console.error(data);
259
+ // eslint-disable-line no-console
260
+ }
261
+ });
262
+ } else if (this.video.current.canPlayType('application/vnd.apple.mpegurl')) {
263
+ this.video.current.src = this.state.source;
264
+ this.video.current.addEventListener('loadedmetadata', () => {
265
+ this.hls.loadSource(this.state.source);
266
+ this.hls.attachMedia(this.video.current);
267
+ });
268
+ }
269
+ }
270
+
271
+ // eslint-disable-next-line complexity
272
+ render() {
273
+ var _this$state = this.state,
274
+ posterUrl = _this$state.posterUrl,
275
+ isLoading = _this$state.isLoading,
276
+ error = _this$state.error;
277
+ var _this$props2 = this.props,
278
+ assetDocument = _this$props2.assetDocument,
279
+ autoload = _this$props2.autoload;
280
+
281
+ if (!assetDocument || !assetDocument.status) {
282
+ return null;
283
+ }
284
+
285
+ if (isLoading) {
286
+ return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
287
+ className: _Video.default.progressBar
288
+ }, /*#__PURE__*/_react.default.createElement(_bar.default, {
289
+ percent: 100,
290
+ text: isLoading !== true && isLoading || 'Waiting for Mux to complete the file',
291
+ isInProgress: true,
292
+ showPercent: true,
293
+ animation: true,
294
+ color: "primary"
295
+ })), /*#__PURE__*/_react.default.createElement("div", {
296
+ className: _Video.default.uploadCancelButton
297
+ }, /*#__PURE__*/_react.default.createElement(_default2.default, {
298
+ onClick: this.handleCancelButtonClicked
299
+ }, "Cancel")));
300
+ }
301
+
302
+ var showControls = autoload || this.state.showControls;
303
+ return /*#__PURE__*/_react.default.createElement("div", {
304
+ ref: this.videoContainer,
305
+ className: _Video.default.videoContainer
306
+ }, /*#__PURE__*/_react.default.createElement("media-controller", null, /*#__PURE__*/_react.default.createElement("video", {
307
+ onClick: autoload ? NOOP : this.handleVideoClick,
308
+ ref: this.video,
309
+ poster: posterUrl,
310
+ slot: "media",
311
+ crossOrigin: "anonomous"
312
+ }, this.state.storyboardUrl && /*#__PURE__*/_react.default.createElement("track", {
313
+ label: "thumbnails",
314
+ default: true,
315
+ kind: "metadata",
316
+ src: this.state.storyboardUrl
317
+ })), showControls && /*#__PURE__*/_react.default.createElement("media-control-bar", null, /*#__PURE__*/_react.default.createElement("media-play-button", {
318
+ ref: this.playRef
319
+ }), /*#__PURE__*/_react.default.createElement("media-mute-button", {
320
+ ref: this.muteRef
321
+ }), /*#__PURE__*/_react.default.createElement("media-progress-range", null))), error && /*#__PURE__*/_react.default.createElement(_ui.Card, {
322
+ padding: 3,
323
+ radius: 2,
324
+ shadow: 1,
325
+ tone: "critical",
326
+ marginTop: 2
327
+ }, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
328
+ space: 2
329
+ }, /*#__PURE__*/_react.default.createElement(_ui.Text, {
330
+ size: 1
331
+ }, "There was an error loading this video (", error.type, ")."), this.state.isDeletedOnMux && /*#__PURE__*/_react.default.createElement(_ui.Text, {
332
+ size: 1
333
+ }, "The video is deleted on Mux"))), this.state.isPreparingStaticRenditions && /*#__PURE__*/_react.default.createElement(_ui.Card, {
334
+ padding: 2,
335
+ radius: 1,
336
+ style: {
337
+ background: 'var(--card-fg-color)',
338
+ position: 'absolute',
339
+ top: '0.5em',
340
+ left: '0.5em'
341
+ }
342
+ }, /*#__PURE__*/_react.default.createElement(_ui.Text, {
343
+ size: 1,
344
+ style: {
345
+ color: 'var(--card-bg-color)'
346
+ }
347
+ }, "MUX is preparing static renditions, please stand by")));
348
+ }
349
+
350
+ }
351
+
352
+ MuxVideo.propTypes = propTypes;
353
+ MuxVideo.defaultProps = {
354
+ autoload: true,
355
+ onCancel: undefined,
356
+ onReady: undefined
357
+ };
358
+ var _default = MuxVideo;
359
+ exports.default = _default;
360
+ //# sourceMappingURL=Video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/Video.js"],"names":["NOOP","propTypes","assetDocument","PropTypes","object","isRequired","autoload","bool","onCancel","func","onReady","MuxVideo","Component","constructor","props","React","createRef","event","setState","showControls","hls","startLoad","state","storyboardUrl","posterUrl","source","isLoading","error","isDeletedOnMux","isPreparingStaticRenditions","secrets","playRef","muteRef","getDerivedStateFromProps","nextProps","status","data","static_renditions","componentDidMount","video","style","document","createElement","innerHTML","current","shadowRoot","appendChild","cloneNode","then","componentDidUpdate","prevProps","prevState","previousVideo","playbackId","newVideo","resolveSourceAndPoster","src","attachVideo","destroy","options","isSigned","playback_ids","policy","signingKeyId","signingKeyPrivate","getVideoElement","Hls","isSupported","autoStartLoad","loadSource","attachMedia","on","Events","MANIFEST_PARSED","e","videoContainer","display","ERROR","type","ErrorTypes","NETWORK_ERROR","assetId","response","catch","err","message","match","console","canPlayType","addEventListener","render","styles","progressBar","uploadCancelButton","handleCancelButtonClicked","handleVideoClick","background","position","top","left","color","defaultProps","undefined"],"mappings":"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","sourcesContent":["import {Box, Card, Stack, Text} from '@sanity/ui'\r\nimport Hls from 'hls.js'\r\nimport 'media-chrome'\r\nimport Button from 'part:@sanity/components/buttons/default'\r\nimport ProgressBar from 'part:@sanity/components/progress/bar'\r\nimport PropTypes from 'prop-types'\r\nimport React, {Component} from 'react'\r\nimport {getAsset} from '../actions/assets'\r\nimport {fetchSecrets} from '../actions/secrets'\r\nimport getPosterSrc from '../util/getPosterSrc'\r\nimport getStoryboardSrc from '../util/getStoryboardSrc'\r\nimport getVideoSrc from '../util/getVideoSrc'\r\nimport styles from './Video.css'\r\n\r\nconst NOOP = () => {\r\n /* intentional noop */\r\n}\r\n\r\nconst propTypes = {\r\n // eslint-disable-next-line react/forbid-prop-types\r\n assetDocument: PropTypes.object.isRequired,\r\n autoload: PropTypes.bool,\r\n onCancel: PropTypes.func,\r\n onReady: PropTypes.func,\r\n}\r\n\r\nclass MuxVideo extends Component {\r\n videoContainer = React.createRef()\r\n hls = null\r\n\r\n constructor(props) {\r\n super(props)\r\n this.state = {\r\n storyboardUrl: null,\r\n posterUrl: null,\r\n source: null,\r\n isLoading: true,\r\n error: null,\r\n isDeletedOnMux: false,\r\n isPreparingStaticRenditions: false,\r\n secrets: null,\r\n }\r\n this.playRef = React.createRef()\r\n this.muteRef = React.createRef()\r\n }\r\n\r\n // eslint-disable-next-line complexity\r\n static getDerivedStateFromProps(nextProps) {\r\n let isLoading = true\r\n let isPreparingStaticRenditions = false\r\n const {assetDocument} = nextProps\r\n\r\n if (assetDocument && assetDocument.status === 'preparing') {\r\n isLoading = 'Preparing the video'\r\n }\r\n if (assetDocument && assetDocument.status === 'waiting_for_upload') {\r\n isLoading = 'Waiting for upload to start'\r\n }\r\n if (assetDocument && assetDocument.status === 'waiting') {\r\n isLoading = 'Processing upload'\r\n }\r\n if (assetDocument && assetDocument.status === 'ready') {\r\n isLoading = false\r\n }\r\n if (assetDocument && typeof assetDocument.status === 'undefined') {\r\n isLoading = false\r\n }\r\n if (assetDocument?.data?.static_renditions?.status === 'preparing') {\r\n isPreparingStaticRenditions = true\r\n }\r\n if (assetDocument?.data?.static_renditions?.status === 'ready') {\r\n isPreparingStaticRenditions = false\r\n }\r\n return {\r\n isLoading,\r\n isPreparingStaticRenditions,\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n this.video = React.createRef()\r\n\r\n const style = document.createElement('style')\r\n style.innerHTML = 'button svg { vertical-align: middle; }'\r\n\r\n if (this.playRef?.current?.shadowRoot) {\r\n this.playRef.current.shadowRoot.appendChild(style)\r\n }\r\n if (this.muteRef?.current?.shadowRoot) {\r\n this.muteRef.current.shadowRoot.appendChild(style.cloneNode(true))\r\n }\r\n\r\n this.setState(MuxVideo.getDerivedStateFromProps(this.props))\r\n fetchSecrets().then(({secrets}) => this.setState({secrets}))\r\n }\r\n\r\n componentDidUpdate(prevProps, prevState) {\r\n const previousVideo = prevProps.assetDocument.playbackId\r\n const newVideo = this.props.assetDocument.playbackId\r\n\r\n if (\r\n !this.state.isLoading &&\r\n this.state.secrets &&\r\n (this.state.source === null || previousVideo !== newVideo)\r\n ) {\r\n this.resolveSourceAndPoster(this.props.assetDocument)\r\n }\r\n\r\n if (this.state.source !== null && this.video.current && !this.video.current.src) {\r\n // eslint-disable-next-line react/no-did-update-set-state\r\n this.setState({error: null})\r\n this.attachVideo()\r\n }\r\n\r\n if (this.state.source !== null && this.state.source !== prevState.source) {\r\n // eslint-disable-next-line react/no-did-update-set-state\r\n this.setState({error: null, showControls: false})\r\n if (this.hls) {\r\n this.hls.destroy()\r\n }\r\n this.attachVideo()\r\n }\r\n }\r\n\r\n resolveSourceAndPoster(assetDocument) {\r\n const playbackId = assetDocument.playbackId\r\n const options = {\r\n isSigned: assetDocument.data.playback_ids[0].policy === 'signed',\r\n signingKeyId: this.state.secrets.signingKeyId || null,\r\n signingKeyPrivate: this.state.secrets.signingKeyPrivate || null,\r\n }\r\n\r\n const source = getVideoSrc(playbackId, options)\r\n const posterUrl = getPosterSrc(playbackId, options)\r\n const storyboardUrl = getStoryboardSrc(playbackId, options)\r\n this.setState({source, posterUrl, storyboardUrl})\r\n }\r\n\r\n getVideoElement() {\r\n return this.video && this.video.current\r\n }\r\n\r\n attachVideo() {\r\n const {assetDocument, autoload} = this.props\r\n\r\n if (Hls.isSupported()) {\r\n this.hls = new Hls({autoStartLoad: autoload})\r\n this.hls.loadSource(this.state.source)\r\n this.hls.attachMedia(this.video.current)\r\n this.hls.on(Hls.Events.MANIFEST_PARSED, (e) => {\r\n if (this.videoContainer.current) {\r\n this.videoContainer.current.style.display = 'block'\r\n }\r\n if (this.props.onReady) {\r\n this.props.onReady()\r\n }\r\n })\r\n this.hls.on(Hls.Events.ERROR, (event, data) => {\r\n switch (data.type) {\r\n case Hls.ErrorTypes.NETWORK_ERROR:\r\n if (this.videoContainer.current) {\r\n this.videoContainer.current.style.display = 'none'\r\n }\r\n this.setState({error: data})\r\n getAsset(assetDocument.assetId)\r\n .then((response) => {\r\n this.setState({isDeletedOnMux: false})\r\n })\r\n .catch((err) => {\r\n if (err.message.match(/404/)) {\r\n this.setState({isDeletedOnMux: true})\r\n return\r\n }\r\n console.error(data, err) // eslint-disable-line no-console\r\n })\r\n break\r\n default:\r\n console.error(data) // eslint-disable-line no-console\r\n }\r\n })\r\n } else if (this.video.current.canPlayType('application/vnd.apple.mpegurl')) {\r\n this.video.current.src = this.state.source\r\n this.video.current.addEventListener('loadedmetadata', () => {\r\n this.hls.loadSource(this.state.source)\r\n this.hls.attachMedia(this.video.current)\r\n })\r\n }\r\n }\r\n\r\n handleVideoClick = (event) => {\r\n this.setState({showControls: true})\r\n this.hls.startLoad(0)\r\n if (this.props.onReady) {\r\n this.props.onReady(event)\r\n }\r\n }\r\n\r\n handleCancelButtonClicked = (event) => {\r\n if (this.props.onCancel) {\r\n this.props.onCancel(event)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line complexity\r\n render() {\r\n const {posterUrl, isLoading, error} = this.state\r\n const {assetDocument, autoload} = this.props\r\n if (!assetDocument || !assetDocument.status) {\r\n return null\r\n }\r\n\r\n if (isLoading) {\r\n return (\r\n <div>\r\n <div className={styles.progressBar}>\r\n <ProgressBar\r\n percent={100}\r\n text={(isLoading !== true && isLoading) || 'Waiting for Mux to complete the file'}\r\n isInProgress\r\n showPercent\r\n animation\r\n color=\"primary\"\r\n />\r\n </div>\r\n <div className={styles.uploadCancelButton}>\r\n <Button onClick={this.handleCancelButtonClicked}>Cancel</Button>\r\n </div>\r\n </div>\r\n )\r\n }\r\n\r\n const showControls = autoload || this.state.showControls\r\n\r\n return (\r\n <div ref={this.videoContainer} className={styles.videoContainer}>\r\n <media-controller>\r\n <video\r\n onClick={autoload ? NOOP : this.handleVideoClick}\r\n ref={this.video}\r\n poster={posterUrl}\r\n slot=\"media\"\r\n crossOrigin=\"anonomous\"\r\n >\r\n {this.state.storyboardUrl && (\r\n <track label=\"thumbnails\" default kind=\"metadata\" src={this.state.storyboardUrl} />\r\n )}\r\n </video>\r\n\r\n {showControls && (\r\n <media-control-bar>\r\n <media-play-button ref={this.playRef} />\r\n <media-mute-button ref={this.muteRef} />\r\n {/* The media volume range is causing an error to be logged in the studio: Failed to construct 'CustomElement': The result must not have attributes */}\r\n {/* <media-volume-range /> */}\r\n <media-progress-range />\r\n </media-control-bar>\r\n )}\r\n </media-controller>\r\n {error && (\r\n <Card padding={3} radius={2} shadow={1} tone=\"critical\" marginTop={2}>\r\n <Stack space={2}>\r\n <Text size={1}>There was an error loading this video ({error.type}).</Text>\r\n {this.state.isDeletedOnMux && <Text size={1}>The video is deleted on Mux</Text>}\r\n </Stack>\r\n </Card>\r\n )}\r\n\r\n {this.state.isPreparingStaticRenditions && (\r\n <Card\r\n padding={2}\r\n radius={1}\r\n style={{\r\n background: 'var(--card-fg-color)',\r\n position: 'absolute',\r\n top: '0.5em',\r\n left: '0.5em',\r\n }}\r\n >\r\n <Text size={1} style={{color: 'var(--card-bg-color)'}}>\r\n MUX is preparing static renditions, please stand by\r\n </Text>\r\n </Card>\r\n )}\r\n </div>\r\n )\r\n }\r\n}\r\n\r\nMuxVideo.propTypes = propTypes\r\n\r\nMuxVideo.defaultProps = {\r\n autoload: true,\r\n onCancel: undefined,\r\n onReady: undefined,\r\n}\r\n\r\nexport default MuxVideo\r\n"],"file":"Video.js"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _configMuxInput = _interopRequireDefault(require("config:mux-input"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ /* eslint-disable camelcase */
13
+ var _default = {
14
+ mp4_support: (_configMuxInput.default === null || _configMuxInput.default === void 0 ? void 0 : _configMuxInput.default.mp4_support) || 'none'
15
+ };
16
+ exports.default = _default;
17
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.js"],"names":["mp4_support"],"mappings":";;;;;;;AACA;;;;AADA;eAGe;AACbA,EAAAA,WAAW,EAAE,2GAAQA,WAAR,KAAuB;AADvB,C","sourcesContent":["/* eslint-disable camelcase */\r\nimport config from 'config:mux-input'\r\n\r\nexport default {\r\n mp4_support: config?.mp4_support || 'none',\r\n}\r\n"],"file":"config.js"}
package/build/index.js ADDED
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _Input = _interopRequireDefault(require("./components/Input"));
9
+
10
+ var _Preview = _interopRequireDefault(require("./components/Preview"));
11
+
12
+ var _Video = _interopRequireDefault(require("./components/Video"));
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ var _default = {
17
+ Input: _Input.default,
18
+ Preview: _Preview.default,
19
+ Player: _Video.default
20
+ };
21
+ exports.default = _default;
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.js"],"names":["Input","Preview","Player"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;;;eACe;AACbA,EAAAA,KAAK,EAALA,cADa;AAEbC,EAAAA,OAAO,EAAPA,gBAFa;AAGbC,EAAAA,MAAM,EAANA;AAHa,C","sourcesContent":["import Input from './components/Input'\r\nimport Preview from './components/Preview'\r\nimport Player from './components/Video'\r\nexport default {\r\n Input,\r\n Preview,\r\n Player,\r\n}\r\n"],"file":"index.js"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _Input = _interopRequireDefault(require("../components/Input"));
9
+
10
+ var _Preview = _interopRequireDefault(require("../components/Preview"));
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ var _default = {
15
+ name: 'mux.video',
16
+ type: 'object',
17
+ title: 'Video asset reference',
18
+ fields: [{
19
+ title: 'Video',
20
+ name: 'asset',
21
+ type: 'reference',
22
+ weak: true,
23
+ to: [{
24
+ type: 'mux.videoAsset'
25
+ }]
26
+ }],
27
+ inputComponent: _Input.default,
28
+ preview: {
29
+ select: {
30
+ playbackId: 'asset.playbackId',
31
+ status: 'asset.status',
32
+ duration: 'asset.data.duration',
33
+ thumbTime: 'asset.thumbTime',
34
+ filename: 'asset.filename',
35
+ playbackIds: 'asset.data.playback_ids'
36
+ },
37
+ component: _Preview.default
38
+ }
39
+ };
40
+ exports.default = _default;
41
+ //# sourceMappingURL=mux.video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/schema/mux.video.js"],"names":["name","type","title","fields","weak","to","inputComponent","Input","preview","select","playbackId","status","duration","thumbTime","filename","playbackIds","component","Preview"],"mappings":";;;;;;;AAAA;;AACA;;;;eAEe;AACbA,EAAAA,IAAI,EAAE,WADO;AAEbC,EAAAA,IAAI,EAAE,QAFO;AAGbC,EAAAA,KAAK,EAAE,uBAHM;AAIbC,EAAAA,MAAM,EAAE,CACN;AACED,IAAAA,KAAK,EAAE,OADT;AAEEF,IAAAA,IAAI,EAAE,OAFR;AAGEC,IAAAA,IAAI,EAAE,WAHR;AAIEG,IAAAA,IAAI,EAAE,IAJR;AAKEC,IAAAA,EAAE,EAAE,CAAC;AAACJ,MAAAA,IAAI,EAAE;AAAP,KAAD;AALN,GADM,CAJK;AAabK,EAAAA,cAAc,EAAEC,cAbH;AAcbC,EAAAA,OAAO,EAAE;AACPC,IAAAA,MAAM,EAAE;AACNC,MAAAA,UAAU,EAAE,kBADN;AAENC,MAAAA,MAAM,EAAE,cAFF;AAGNC,MAAAA,QAAQ,EAAE,qBAHJ;AAINC,MAAAA,SAAS,EAAE,iBAJL;AAKNC,MAAAA,QAAQ,EAAE,gBALJ;AAMNC,MAAAA,WAAW,EAAE;AANP,KADD;AASPC,IAAAA,SAAS,EAAEC;AATJ;AAdI,C","sourcesContent":["import Input from '../components/Input'\r\nimport Preview from '../components/Preview'\r\n\r\nexport default {\r\n name: 'mux.video',\r\n type: 'object',\r\n title: 'Video asset reference',\r\n fields: [\r\n {\r\n title: 'Video',\r\n name: 'asset',\r\n type: 'reference',\r\n weak: true,\r\n to: [{type: 'mux.videoAsset'}]\r\n }\r\n ],\r\n inputComponent: Input,\r\n preview: {\r\n select: {\r\n playbackId: 'asset.playbackId',\r\n status: 'asset.status',\r\n duration: 'asset.data.duration',\r\n thumbTime: 'asset.thumbTime',\r\n filename: 'asset.filename',\r\n playbackIds: 'asset.data.playback_ids'\r\n },\r\n component: Preview\r\n }\r\n}\r\n"],"file":"mux.video.js"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _default = {
8
+ name: 'mux.videoAsset',
9
+ type: 'object',
10
+ title: 'Video asset',
11
+ fields: [{
12
+ type: 'string',
13
+ name: 'status'
14
+ }, {
15
+ type: 'string',
16
+ name: 'assetId'
17
+ }, {
18
+ type: 'string',
19
+ name: 'playbackId'
20
+ }, {
21
+ type: 'string',
22
+ name: 'filename'
23
+ }, {
24
+ type: 'number',
25
+ name: 'thumbTime'
26
+ }]
27
+ };
28
+ exports.default = _default;
29
+ //# sourceMappingURL=mux.videoAsset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/schema/mux.videoAsset.js"],"names":["name","type","title","fields"],"mappings":";;;;;;eAAe;AACbA,EAAAA,IAAI,EAAE,gBADO;AAEbC,EAAAA,IAAI,EAAE,QAFO;AAGbC,EAAAA,KAAK,EAAE,aAHM;AAIbC,EAAAA,MAAM,EAAE,CACN;AACEF,IAAAA,IAAI,EAAE,QADR;AAEED,IAAAA,IAAI,EAAE;AAFR,GADM,EAKN;AACEC,IAAAA,IAAI,EAAE,QADR;AAEED,IAAAA,IAAI,EAAE;AAFR,GALM,EASN;AACEC,IAAAA,IAAI,EAAE,QADR;AAEED,IAAAA,IAAI,EAAE;AAFR,GATM,EAaN;AACEC,IAAAA,IAAI,EAAE,QADR;AAEED,IAAAA,IAAI,EAAE;AAFR,GAbM,EAiBN;AACEC,IAAAA,IAAI,EAAE,QADR;AAEED,IAAAA,IAAI,EAAE;AAFR,GAjBM;AAJK,C","sourcesContent":["export default {\r\n name: 'mux.videoAsset',\r\n type: 'object',\r\n title: 'Video asset',\r\n fields: [\r\n {\r\n type: 'string',\r\n name: 'status',\r\n },\r\n {\r\n type: 'string',\r\n name: 'assetId',\r\n },\r\n {\r\n type: 'string',\r\n name: 'playbackId',\r\n },\r\n {\r\n type: 'string',\r\n name: 'filename',\r\n },\r\n {\r\n type: 'number',\r\n name: 'thumbTime',\r\n },\r\n ],\r\n}\r\n"],"file":"mux.videoAsset.js"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.extractDroppedFiles = extractDroppedFiles;
7
+
8
+ var _lodash = require("lodash");
9
+
10
+ /**
11
+ * Utilities for extracting files from dataTransfer in a predictable cross-browser fashion.
12
+ * Also recursively extracts files from a directory
13
+ * Inspired by https://github.com/component/normalized-upload
14
+ */
15
+ function extractDroppedFiles(dataTransfer) {
16
+ var files = Array.from(dataTransfer.files || []);
17
+ var items = Array.from(dataTransfer.items || []);
18
+
19
+ if (files && files.length > 0) {
20
+ return Promise.resolve(files);
21
+ }
22
+
23
+ return normalizeItems(items).then(_lodash.flatten);
24
+ }
25
+
26
+ function normalizeItems(items) {
27
+ return Promise.all(items.map(item => {
28
+ // directory
29
+ if (item.kind === 'file' && item.webkitGetAsEntry) {
30
+ var entry; // Edge throws
31
+
32
+ try {
33
+ entry = item.webkitGetAsEntry();
34
+ } catch (err) {
35
+ return [item.getAsFile()];
36
+ }
37
+
38
+ if (!entry) {
39
+ return [];
40
+ }
41
+
42
+ return entry.isDirectory ? walk(entry) : [item.getAsFile()];
43
+ } // file
44
+
45
+
46
+ if (item.kind === 'file') {
47
+ var file = item.getAsFile();
48
+ return Promise.resolve(file ? [file] : []);
49
+ } // others
50
+
51
+
52
+ return new Promise(resolve => item.getAsString(resolve)).then(str => str ? [new File([str], 'unknown.txt', {
53
+ type: item.type
54
+ })] : []);
55
+ }));
56
+ }
57
+
58
+ function walk(entry) {
59
+ if (entry.isFile) {
60
+ return new Promise(resolve => entry.file(resolve)).then(file => [file]);
61
+ }
62
+
63
+ if (entry.isDirectory) {
64
+ var dir = entry.createReader();
65
+ return new Promise(resolve => dir.readEntries(resolve)).then(entries => entries.filter(entr => !entr.name.startsWith('.'))).then(entries => Promise.all(entries.map(walk)).then(_lodash.flatten));
66
+ }
67
+
68
+ return Promise.resolve([]);
69
+ }
70
+ //# sourceMappingURL=extractFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/util/extractFiles.js"],"names":["extractDroppedFiles","dataTransfer","files","Array","from","items","length","Promise","resolve","normalizeItems","then","flatten","all","map","item","kind","webkitGetAsEntry","entry","err","getAsFile","isDirectory","walk","file","getAsString","str","File","type","isFile","dir","createReader","readEntries","entries","filter","entr","name","startsWith"],"mappings":"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","sourcesContent":["/**\r\n * Utilities for extracting files from dataTransfer in a predictable cross-browser fashion.\r\n * Also recursively extracts files from a directory\r\n * Inspired by https://github.com/component/normalized-upload\r\n */\r\n\r\nimport {flatten} from 'lodash'\r\n\r\nexport function extractDroppedFiles(dataTransfer) {\r\n const files = Array.from(dataTransfer.files || [])\r\n const items = Array.from(dataTransfer.items || [])\r\n if (files && files.length > 0) {\r\n return Promise.resolve(files)\r\n }\r\n return normalizeItems(items).then(flatten)\r\n}\r\n\r\nfunction normalizeItems(items) {\r\n return Promise.all(\r\n items.map((item) => {\r\n // directory\r\n if (item.kind === 'file' && item.webkitGetAsEntry) {\r\n let entry\r\n // Edge throws\r\n try {\r\n entry = item.webkitGetAsEntry()\r\n } catch (err) {\r\n return [item.getAsFile()]\r\n }\r\n if (!entry) {\r\n return []\r\n }\r\n return entry.isDirectory ? walk(entry) : [item.getAsFile()]\r\n }\r\n\r\n // file\r\n if (item.kind === 'file') {\r\n const file = item.getAsFile()\r\n return Promise.resolve(file ? [file] : [])\r\n }\r\n\r\n // others\r\n return new Promise((resolve) => item.getAsString(resolve)).then((str) =>\r\n str ? [new File([str], 'unknown.txt', {type: item.type})] : []\r\n )\r\n })\r\n )\r\n}\r\n\r\nfunction walk(entry) {\r\n if (entry.isFile) {\r\n return new Promise((resolve) => entry.file(resolve)).then((file) => [file])\r\n }\r\n\r\n if (entry.isDirectory) {\r\n const dir = entry.createReader()\r\n return new Promise((resolve) => dir.readEntries(resolve))\r\n .then((entries) => entries.filter((entr) => !entr.name.startsWith('.')))\r\n .then((entries) => Promise.all(entries.map(walk)).then(flatten))\r\n }\r\n return Promise.resolve([])\r\n}\r\n"],"file":"extractFiles.js"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = formatTime;
7
+
8
+ function formatTime(duration) {
9
+ var secNum = parseInt(duration, 10);
10
+ var hours = Math.floor(secNum / 3600);
11
+ var minutes = Math.floor((secNum - hours * 3600) / 60);
12
+ var seconds = secNum - hours * 3600 - minutes * 60;
13
+
14
+ if (hours < 10) {
15
+ hours = "0".concat(hours);
16
+ }
17
+
18
+ if (minutes < 10) {
19
+ minutes = "0".concat(minutes);
20
+ }
21
+
22
+ if (seconds < 10) {
23
+ seconds = "0".concat(seconds);
24
+ }
25
+
26
+ return "".concat(hours, ":").concat(minutes, ":").concat(seconds);
27
+ }
28
+ //# sourceMappingURL=formatTime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/util/formatTime.js"],"names":["formatTime","duration","secNum","parseInt","hours","Math","floor","minutes","seconds"],"mappings":";;;;;;;AAAe,SAASA,UAAT,CAAoBC,QAApB,EAA8B;AAC3C,MAAMC,MAAM,GAAGC,QAAQ,CAACF,QAAD,EAAW,EAAX,CAAvB;AACA,MAAIG,KAAK,GAAGC,IAAI,CAACC,KAAL,CAAWJ,MAAM,GAAG,IAApB,CAAZ;AACA,MAAIK,OAAO,GAAGF,IAAI,CAACC,KAAL,CAAW,CAACJ,MAAM,GAAGE,KAAK,GAAG,IAAlB,IAA0B,EAArC,CAAd;AACA,MAAII,OAAO,GAAGN,MAAM,GAAGE,KAAK,GAAG,IAAjB,GAAwBG,OAAO,GAAG,EAAhD;;AAEA,MAAIH,KAAK,GAAG,EAAZ,EAAgB;AACdA,IAAAA,KAAK,cAAOA,KAAP,CAAL;AACD;;AACD,MAAIG,OAAO,GAAG,EAAd,EAAkB;AAChBA,IAAAA,OAAO,cAAOA,OAAP,CAAP;AACD;;AACD,MAAIC,OAAO,GAAG,EAAd,EAAkB;AAChBA,IAAAA,OAAO,cAAOA,OAAP,CAAP;AACD;;AACD,mBAAUJ,KAAV,cAAmBG,OAAnB,cAA8BC,OAA9B;AACD","sourcesContent":["export default function formatTime(duration) {\r\n const secNum = parseInt(duration, 10)\r\n let hours = Math.floor(secNum / 3600)\r\n let minutes = Math.floor((secNum - hours * 3600) / 60)\r\n let seconds = secNum - hours * 3600 - minutes * 60\r\n\r\n if (hours < 10) {\r\n hours = `0${hours}`\r\n }\r\n if (minutes < 10) {\r\n minutes = `0${minutes}`\r\n }\r\n if (seconds < 10) {\r\n seconds = `0${seconds}`\r\n }\r\n return `${hours}:${minutes}:${seconds}`\r\n}\r\n"],"file":"formatTime.js"}