@micromag/element-video 0.3.576 → 0.3.578

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 (2) hide show
  1. package/es/index.js +60 -26
  2. package/package.json +4 -4
package/es/index.js CHANGED
@@ -9,6 +9,7 @@ import { PropTypes } from '@micromag/core';
9
9
  import { Spinner } from '@micromag/core/components';
10
10
  import { useMediaThumbnail, useMediaCurrentTime, useMediaDuration, useMediaReady, useProgressSteps } from '@micromag/core/hooks';
11
11
  import { getMediaFilesAsArray, getVideoSupportedMimes } from '@micromag/core/utils';
12
+ import Hls from 'hls.js';
12
13
 
13
14
  var styles = {"container":"micromag-element-video-container","withSize":"micromag-element-video-withSize","media":"micromag-element-video-media","spinner":"micromag-element-video-spinner"};
14
15
 
@@ -27,6 +28,7 @@ var propTypes = {
27
28
  playsInline: PropTypes$1.bool,
28
29
  preload: PropTypes$1.oneOf(['auto', 'metadata', 'none', null]),
29
30
  disablePictureInPicture: PropTypes$1.bool,
31
+ disableHls: PropTypes$1.bool,
30
32
  shouldLoad: PropTypes$1.bool,
31
33
  withoutCors: PropTypes$1.bool,
32
34
  className: PropTypes$1.string,
@@ -60,6 +62,7 @@ var defaultProps = {
60
62
  playsInline: true,
61
63
  preload: 'auto',
62
64
  disablePictureInPicture: true,
65
+ disableHls: false,
63
66
  shouldLoad: true,
64
67
  withoutCors: false,
65
68
  className: null,
@@ -111,7 +114,8 @@ var Video = function Video(_ref) {
111
114
  focusable = _ref.focusable,
112
115
  withPoster = _ref.withPoster,
113
116
  withLoading = _ref.withLoading,
114
- disablePictureInPicture = _ref.disablePictureInPicture;
117
+ disablePictureInPicture = _ref.disablePictureInPicture,
118
+ disableHls = _ref.disableHls;
115
119
  var _ref2 = media || {},
116
120
  _ref2$url = _ref2.url,
117
121
  mediaUrl = _ref2$url === void 0 ? null : _ref2$url,
@@ -130,19 +134,19 @@ var Video = function Video(_ref) {
130
134
  return getMediaFilesAsArray(files);
131
135
  }, [files]);
132
136
  var finalThumbnail = useMediaThumbnail(media, thumbnail);
133
- var _ref11 = useRef(null);
134
- var currentTime = useMediaCurrentTime(_ref11.current, {
137
+ var _ref12 = useRef(null);
138
+ var currentTime = useMediaCurrentTime(_ref12.current, {
135
139
  id: mediaUrl,
136
140
  disabled: paused || onProgressStep === null
137
141
  });
138
- var duration = useMediaDuration(_ref11.current, {
142
+ var duration = useMediaDuration(_ref12.current, {
139
143
  id: mediaUrl
140
144
  });
141
145
  var _useState = useState(false),
142
146
  _useState2 = _slicedToArray(_useState, 2),
143
147
  showLoading = _useState2[0],
144
148
  setShowLoading = _useState2[1];
145
- var ready = useMediaReady(_ref11.current, {
149
+ var ready = useMediaReady(_ref12.current, {
146
150
  id: mediaUrl
147
151
  });
148
152
  useEffect(function () {
@@ -157,8 +161,33 @@ var Video = function Video(_ref) {
157
161
  clearTimeout(id);
158
162
  };
159
163
  }, [mediaUrl, withLoading]);
164
+ var hlsIsSupported = useMemo(function () {
165
+ return Hls.isSupported();
166
+ }, [Hls]);
167
+ var hlsSources = useMemo(function () {
168
+ if (filesArray.length === 0 || disableHls) {
169
+ return null;
170
+ }
171
+ return filesArray.filter(function (_ref4) {
172
+ var _ref4$mime = _ref4.mime,
173
+ mime = _ref4$mime === void 0 ? null : _ref4$mime,
174
+ _ref4$name = _ref4.name,
175
+ name = _ref4$name === void 0 ? null : _ref4$name;
176
+ return mime === 'application/vnd.apple.mpegurl' || (name || '').endsWith('.m3u8');
177
+ });
178
+ }, [filesArray, hlsIsSupported, disableHls]);
179
+ useEffect(function () {
180
+ if (_ref12.current === null || !hlsIsSupported) {
181
+ return;
182
+ }
183
+ if (hlsSources !== null && hlsSources.length > 0) {
184
+ var hls = new Hls();
185
+ hls.loadSource(hlsSources[0].url);
186
+ hls.attachMedia(_ref12.current);
187
+ }
188
+ }, [hlsIsSupported, hlsSources, _ref12]);
160
189
  var sourceFiles = useMemo(function () {
161
- if (filesArray.length === 0) {
190
+ if (filesArray.length === 0 || hlsSources !== null && hlsSources.length > 0) {
162
191
  return null;
163
192
  }
164
193
  var supportedMimes = getVideoSupportedMimes();
@@ -166,32 +195,37 @@ var Video = function Video(_ref) {
166
195
  return null;
167
196
  }
168
197
  var sourceFilesMap = filesArray.filter(function (file) {
198
+ var fileHandle = file.handle || file.id;
169
199
  var _file$mime = file.mime,
170
- mime = _file$mime === void 0 ? "video/".concat(file.id === 'h264' ? 'mp4' : file.id) : _file$mime;
200
+ mime = _file$mime === void 0 ? "video/".concat(fileHandle === 'h264' ? 'mp4' : fileHandle) : _file$mime;
171
201
  return supportedMimes.indexOf(mime) !== -1;
172
202
  }).reduce(function (filesMap, file) {
203
+ var fileHandle = file.handle || file.id;
173
204
  var _file$mime2 = file.mime,
174
- mime = _file$mime2 === void 0 ? "video/".concat(file.id === 'h264' ? 'mp4' : file.id) : _file$mime2;
205
+ mime = _file$mime2 === void 0 ? "video/".concat(fileHandle === 'h264' ? 'mp4' : fileHandle) : _file$mime2;
175
206
  var currentMimeFile = filesMap[mime] || null;
176
- var _ref4 = currentMimeFile || {},
177
- _ref4$id = _ref4.id,
178
- currentMimeId = _ref4$id === void 0 ? null : _ref4$id;
179
- return currentMimeFile === null || currentMimeId !== 'original' ? _objectSpread(_objectSpread({}, filesMap), {}, _defineProperty({}, mime, file)) : filesMap;
207
+ var _ref5 = currentMimeFile || {},
208
+ _ref5$id = _ref5.id,
209
+ currentId = _ref5$id === void 0 ? null : _ref5$id,
210
+ _ref5$handle = _ref5.handle,
211
+ currentHandle = _ref5$handle === void 0 ? null : _ref5$handle;
212
+ var currentMimeHandle = currentHandle || currentId;
213
+ return currentMimeFile === null || currentMimeHandle === 'original' ? _objectSpread(_objectSpread({}, filesMap), {}, _defineProperty({}, mime, file)) : filesMap;
180
214
  }, {});
181
215
  return Object.keys(sourceFilesMap).map(function (mime) {
182
216
  return sourceFilesMap[mime];
183
217
  });
184
- }, [filesArray]);
218
+ }, [filesArray, hlsSources]);
185
219
 
186
220
  // @NOTE: Media is an animated image and doesn't have source files in video formats
187
- var _ref5 = filesArray.find(function (_ref6) {
188
- var handle = _ref6.handle;
221
+ var _ref6 = filesArray.find(function (_ref7) {
222
+ var handle = _ref7.handle;
189
223
  return handle === 'original';
190
224
  }) || {},
191
- _ref5$type = _ref5.type,
192
- originalType = _ref5$type === void 0 ? null : _ref5$type,
193
- _ref5$mime = _ref5.mime,
194
- originalMime = _ref5$mime === void 0 ? mediaMime : _ref5$mime;
225
+ _ref6$type = _ref6.type,
226
+ originalType = _ref6$type === void 0 ? null : _ref6$type,
227
+ _ref6$mime = _ref6.mime,
228
+ originalMime = _ref6$mime === void 0 ? mediaMime : _ref6$mime;
195
229
  var originalFileIsImage = originalType === 'image' || originalMime !== null && originalMime.indexOf('image/') === 0;
196
230
  var isImageWithoutSourceFile = originalFileIsImage && (sourceFiles === null || sourceFiles.length === 0);
197
231
  var withSize = width !== null && height !== null;
@@ -201,7 +235,7 @@ var Video = function Video(_ref) {
201
235
  }
202
236
  }, [duration, customOnDurationChange]);
203
237
  var onVolumeChange = useCallback(function () {
204
- var _ref$current = _ref11.current,
238
+ var _ref$current = _ref12.current,
205
239
  element = _ref$current === void 0 ? null : _ref$current;
206
240
  if (element === null) {
207
241
  return;
@@ -246,7 +280,7 @@ var Video = function Video(_ref) {
246
280
  }
247
281
  }, [ready, onReady]);
248
282
  useEffect(function () {
249
- var _ref$current2 = _ref11.current,
283
+ var _ref$current2 = _ref12.current,
250
284
  element = _ref$current2 === void 0 ? null : _ref$current2;
251
285
  if (element === null) {
252
286
  return;
@@ -283,14 +317,14 @@ var Video = function Video(_ref) {
283
317
  }) : null, !isImageWithoutSourceFile ? /*#__PURE__*/React.createElement("video", {
284
318
  key: mediaUrl,
285
319
  ref: function ref(newRef) {
286
- _ref11.current = newRef;
320
+ _ref12.current = newRef;
287
321
  if (mediaRef !== null && isFunction(mediaRef)) {
288
322
  mediaRef(newRef);
289
323
  } else if (mediaRef !== null) {
290
324
  mediaRef.current = newRef;
291
325
  }
292
326
  },
293
- src: sourceFiles === null || sourceFiles.length === 0 ? "".concat(mediaUrl, "#t=0.001") : null,
327
+ src: (sourceFiles === null || sourceFiles.length === 0) && (hlsSources === null || hlsSources.length === 0) ? "".concat(mediaUrl, "#t=0.001") : null,
294
328
  autoPlay: autoPlay && !paused,
295
329
  loop: loop,
296
330
  muted: muted,
@@ -312,9 +346,9 @@ var Video = function Video(_ref) {
312
346
  "data-has-audio": hasAudio,
313
347
  "data-is-suspended": isSuspended,
314
348
  "aria-hidden": true
315
- }, (sourceFiles || []).map(function (_ref10) {
316
- var sourceUrl = _ref10.url,
317
- sourceMime = _ref10.mime;
349
+ }, (sourceFiles || []).map(function (_ref11) {
350
+ var sourceUrl = _ref11.url,
351
+ sourceMime = _ref11.mime;
318
352
  return /*#__PURE__*/React.createElement("source", {
319
353
  key: "".concat(sourceUrl, "-").concat(sourceMime),
320
354
  src: sourceUrl !== null ? "".concat(sourceUrl, "#t=0.001") : null,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@micromag/element-video",
3
- "version": "0.3.576",
3
+ "version": "0.3.578",
4
4
  "private": false,
5
5
  "description": "",
6
6
  "keywords": [
@@ -59,8 +59,8 @@
59
59
  },
60
60
  "dependencies": {
61
61
  "@babel/runtime": "^7.13.10",
62
- "@micromag/core": "^0.3.576",
63
- "@micromag/element-closed-captions": "^0.3.576",
62
+ "@micromag/core": "^0.3.578",
63
+ "@micromag/element-closed-captions": "^0.3.578",
64
64
  "classnames": "^2.2.6",
65
65
  "lodash": "^4.17.21",
66
66
  "prop-types": "^15.7.2",
@@ -71,5 +71,5 @@
71
71
  "access": "public",
72
72
  "registry": "https://registry.npmjs.org/"
73
73
  },
74
- "gitHead": "fa6ef8f8ed78d40e2a96e669c9cd794a50269c4b"
74
+ "gitHead": "924e621e3cf56f4d46abed790ef7f1f13ec29fb1"
75
75
  }