@micromag/element-video 0.3.582 → 0.3.583

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 +70 -50
  2. package/package.json +4 -4
package/es/index.js CHANGED
@@ -140,19 +140,19 @@ var Video = function Video(_ref) {
140
140
  return getMediaFilesAsArray(files);
141
141
  }, [files]);
142
142
  var finalThumbnail = useMediaThumbnail(media, thumbnail);
143
- var _ref15 = useRef(null);
144
- var currentTime = useMediaCurrentTime(_ref15.current, {
143
+ var _ref16 = useRef(null);
144
+ var currentTime = useMediaCurrentTime(_ref16.current, {
145
145
  id: mediaUrl,
146
146
  disabled: paused || onProgressStep === null
147
147
  });
148
- var duration = useMediaDuration(_ref15.current, {
148
+ var duration = useMediaDuration(_ref16.current, {
149
149
  id: mediaUrl
150
150
  });
151
151
  var _useState = useState(false),
152
152
  _useState2 = _slicedToArray(_useState, 2),
153
153
  showLoading = _useState2[0],
154
154
  setShowLoading = _useState2[1];
155
- var ready = useMediaReady(_ref15.current, {
155
+ var ready = useMediaReady(_ref16.current, {
156
156
  id: mediaUrl
157
157
  });
158
158
  useEffect(function () {
@@ -167,11 +167,12 @@ var Video = function Video(_ref) {
167
167
  clearTimeout(id);
168
168
  };
169
169
  }, [mediaUrl, withLoading]);
170
- var hlsIsSupported = useMemo(function () {
171
- return Hls.isSupported();
172
- }, [Hls]);
170
+ var _useState3 = useState(false),
171
+ _useState4 = _slicedToArray(_useState3, 2),
172
+ hlsFailed = _useState4[0],
173
+ setHlsFailed = _useState4[1];
173
174
  var hlsSources = useMemo(function () {
174
- if (filesArray.length === 0 || disableHls) {
175
+ if (filesArray.length === 0 || disableHls || !Hls.isSupported() || hlsFailed) {
175
176
  return null;
176
177
  }
177
178
  return filesArray.filter(function (_ref4) {
@@ -181,24 +182,24 @@ var Video = function Video(_ref) {
181
182
  name = _ref4$name === void 0 ? null : _ref4$name;
182
183
  return mime === 'application/vnd.apple.mpegurl' || (name || '').endsWith('.m3u8');
183
184
  });
184
- }, [filesArray, hlsIsSupported, disableHls]);
185
- var _useState3 = useState(null),
186
- _useState4 = _slicedToArray(_useState3, 2),
187
- hlsJs = _useState4[0],
188
- setHlsJs = _useState4[1];
189
- var _useState5 = useState(0),
185
+ }, [filesArray, disableHls, hlsFailed]);
186
+ var _useState5 = useState(null),
190
187
  _useState6 = _slicedToArray(_useState5, 2),
191
- hlsTsOffset = _useState6[0],
192
- setHlsTsOffset = _useState6[1];
188
+ hlsJs = _useState6[0],
189
+ setHlsJs = _useState6[1];
190
+ var _useState7 = useState(0),
191
+ _useState8 = _slicedToArray(_useState7, 2),
192
+ hlsTsOffset = _useState8[0],
193
+ setHlsTsOffset = _useState8[1];
193
194
 
194
195
  // initialize hls instance if an hls source is provided
195
196
  useEffect(function () {
196
- if (_ref15.current === null || !hlsIsSupported) {
197
- return;
198
- }
199
197
  setHlsTsOffset(0);
200
- if (shouldLoad && hlsSources !== null && hlsSources.length > 0) {
198
+ setHlsFailed(false);
199
+ if (shouldLoad && _ref16.current !== null && hlsSources !== null && hlsSources.length > 0) {
201
200
  var hls = new Hls({
201
+ maxBufferLength: 15,
202
+ // seconds. prevents loading too much per screen.
202
203
  startLevel: qualityStartLevel
203
204
  });
204
205
  hls.on(Hls.Events.LEVEL_SWITCHED, function (_, _ref5) {
@@ -207,19 +208,36 @@ var Video = function Video(_ref) {
207
208
  onQualityLevelChange(level);
208
209
  }
209
210
  });
211
+ hls.on(Hls.Events.ERROR, function (_, _ref6) {
212
+ var isFatal = _ref6.fatal,
213
+ errorType = _ref6.type;
214
+ if (isFatal) {
215
+ switch (errorType) {
216
+ case Hls.ErrorTypes.MEDIA_ERROR:
217
+ // automatically try to recover from media errors
218
+ hls.recoverMediaError();
219
+ break;
220
+ case Hls.ErrorTypes.NETWORK_ERROR:
221
+ // happens when all retries and media options have been exhausted. in that case, fallback to mp4/webm playback
222
+ setHlsJs(null);
223
+ setHlsFailed(true);
224
+ break;
225
+ }
226
+ }
227
+ });
210
228
 
211
229
  // compute hls timestamp offset when we get the first video fragment
212
- var _onHlsBufferAppended = function onHlsBufferAppended(_, _ref6) {
213
- var frag = _ref6.frag;
230
+ var _onHlsBufferAppended = function onHlsBufferAppended(_, _ref7) {
231
+ var frag = _ref7.frag;
214
232
  var fragStart = frag.start,
215
233
  fragType = frag.type,
216
234
  _frag$sn = frag.sn,
217
235
  fragSn = _frag$sn === void 0 ? null : _frag$sn,
218
236
  _frag$elementaryStrea = frag.elementaryStreams.video,
219
237
  videoStream = _frag$elementaryStrea === void 0 ? null : _frag$elementaryStrea;
220
- var _ref7 = videoStream || {},
221
- _ref7$startPTS = _ref7.startPTS,
222
- videoStartPTS = _ref7$startPTS === void 0 ? null : _ref7$startPTS;
238
+ var _ref8 = videoStream || {},
239
+ _ref8$startPTS = _ref8.startPTS,
240
+ videoStartPTS = _ref8$startPTS === void 0 ? null : _ref8$startPTS;
223
241
  if (fragType === 'main' && fragSn !== 'initSegment' && videoStartPTS !== null) {
224
242
  var tOffset = videoStartPTS - fragStart;
225
243
  hls.off(Hls.Events.BUFFER_APPENDED, _onHlsBufferAppended);
@@ -229,13 +247,15 @@ var Video = function Video(_ref) {
229
247
  hls.on(Hls.Events.BUFFER_APPENDED, _onHlsBufferAppended);
230
248
  hls.loadSource(hlsSources[0].url);
231
249
  setHlsJs(hls);
250
+ } else {
251
+ setHlsJs(null);
232
252
  }
233
- }, [shouldLoad, hlsIsSupported, hlsSources, _ref15]);
253
+ }, [shouldLoad, hlsSources, _ref16]);
234
254
 
235
255
  // attach hls.js when the <video> ref is ready
236
256
  useEffect(function () {
237
- if (hlsJs !== null && _ref15.current !== null) {
238
- hlsJs.attachMedia(_ref15.current);
257
+ if (hlsJs !== null && _ref16.current !== null) {
258
+ hlsJs.attachMedia(_ref16.current);
239
259
  }
240
260
  return function () {
241
261
  if (hlsJs !== null) {
@@ -243,7 +263,7 @@ var Video = function Video(_ref) {
243
263
  hlsJs.destroy();
244
264
  }
245
265
  };
246
- }, [hlsJs, _ref15.current]);
266
+ }, [hlsJs, _ref16.current]);
247
267
 
248
268
  // handle changes of qualityStartLevel when an hls.js instance exists
249
269
  useEffect(function () {
@@ -269,11 +289,11 @@ var Video = function Video(_ref) {
269
289
  var _file$mime2 = file.mime,
270
290
  mime = _file$mime2 === void 0 ? "video/".concat(fileHandle === 'h264' ? 'mp4' : fileHandle) : _file$mime2;
271
291
  var currentMimeFile = filesMap[mime] || null;
272
- var _ref8 = currentMimeFile || {},
273
- _ref8$id = _ref8.id,
274
- currentId = _ref8$id === void 0 ? null : _ref8$id,
275
- _ref8$handle = _ref8.handle,
276
- currentHandle = _ref8$handle === void 0 ? null : _ref8$handle;
292
+ var _ref9 = currentMimeFile || {},
293
+ _ref9$id = _ref9.id,
294
+ currentId = _ref9$id === void 0 ? null : _ref9$id,
295
+ _ref9$handle = _ref9.handle,
296
+ currentHandle = _ref9$handle === void 0 ? null : _ref9$handle;
277
297
  var currentMimeHandle = currentHandle || currentId;
278
298
  return currentMimeFile === null || currentMimeHandle === 'original' ? _objectSpread(_objectSpread({}, filesMap), {}, _defineProperty({}, mime, file)) : filesMap;
279
299
  }, {});
@@ -283,14 +303,14 @@ var Video = function Video(_ref) {
283
303
  }, [filesArray, hlsSources]);
284
304
 
285
305
  // @NOTE: Media is an animated image and doesn't have source files in video formats
286
- var _ref9 = filesArray.find(function (_ref10) {
287
- var handle = _ref10.handle;
306
+ var _ref10 = filesArray.find(function (_ref11) {
307
+ var handle = _ref11.handle;
288
308
  return handle === 'original';
289
309
  }) || {},
290
- _ref9$type = _ref9.type,
291
- originalType = _ref9$type === void 0 ? null : _ref9$type,
292
- _ref9$mime = _ref9.mime,
293
- originalMime = _ref9$mime === void 0 ? mediaMime : _ref9$mime;
310
+ _ref10$type = _ref10.type,
311
+ originalType = _ref10$type === void 0 ? null : _ref10$type,
312
+ _ref10$mime = _ref10.mime,
313
+ originalMime = _ref10$mime === void 0 ? mediaMime : _ref10$mime;
294
314
  var originalFileIsImage = originalType === 'image' || originalMime !== null && originalMime.indexOf('image/') === 0;
295
315
  var isImageWithoutSourceFile = originalFileIsImage && (sourceFiles === null || sourceFiles.length === 0);
296
316
  var withSize = width !== null && height !== null;
@@ -300,7 +320,7 @@ var Video = function Video(_ref) {
300
320
  }
301
321
  }, [duration, customOnDurationChange]);
302
322
  var onVolumeChange = useCallback(function () {
303
- var _ref$current = _ref15.current,
323
+ var _ref$current = _ref16.current,
304
324
  element = _ref$current === void 0 ? null : _ref$current;
305
325
  if (element === null) {
306
326
  return;
@@ -311,10 +331,10 @@ var Video = function Video(_ref) {
311
331
  }, [customOnVolumeChange]);
312
332
 
313
333
  // Manage suspend
314
- var _useState7 = useState(false),
315
- _useState8 = _slicedToArray(_useState7, 2),
316
- isSuspended = _useState8[0],
317
- setIsSuspended = _useState8[1];
334
+ var _useState9 = useState(false),
335
+ _useState10 = _slicedToArray(_useState9, 2),
336
+ isSuspended = _useState10[0],
337
+ setIsSuspended = _useState10[1];
318
338
  var onPlay = useCallback(function (e) {
319
339
  if (isSuspended) {
320
340
  setIsSuspended(false);
@@ -345,7 +365,7 @@ var Video = function Video(_ref) {
345
365
  }
346
366
  }, [ready, onReady]);
347
367
  useEffect(function () {
348
- var _ref$current2 = _ref15.current,
368
+ var _ref$current2 = _ref16.current,
349
369
  element = _ref$current2 === void 0 ? null : _ref$current2;
350
370
  if (element === null) {
351
371
  return;
@@ -382,7 +402,7 @@ var Video = function Video(_ref) {
382
402
  }) : null, !isImageWithoutSourceFile ? /*#__PURE__*/React.createElement("video", {
383
403
  key: mediaUrl,
384
404
  ref: function ref(newRef) {
385
- _ref15.current = newRef;
405
+ _ref16.current = newRef;
386
406
  if (mediaRef !== null && isFunction(mediaRef)) {
387
407
  mediaRef(newRef);
388
408
  } else if (mediaRef !== null) {
@@ -413,9 +433,9 @@ var Video = function Video(_ref) {
413
433
  "data-hls": hlsJs !== null,
414
434
  "data-ts-offset": hlsTsOffset,
415
435
  "aria-hidden": true
416
- }, (sourceFiles || []).map(function (_ref14) {
417
- var sourceUrl = _ref14.url,
418
- sourceMime = _ref14.mime;
436
+ }, (sourceFiles || []).map(function (_ref15) {
437
+ var sourceUrl = _ref15.url,
438
+ sourceMime = _ref15.mime;
419
439
  return /*#__PURE__*/React.createElement("source", {
420
440
  key: "".concat(sourceUrl, "-").concat(sourceMime),
421
441
  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.582",
3
+ "version": "0.3.583",
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.578",
63
- "@micromag/element-closed-captions": "^0.3.578",
62
+ "@micromag/core": "^0.3.583",
63
+ "@micromag/element-closed-captions": "^0.3.583",
64
64
  "classnames": "^2.2.6",
65
65
  "hls.js": "^1.5.15",
66
66
  "lodash": "^4.17.21",
@@ -72,5 +72,5 @@
72
72
  "access": "public",
73
73
  "registry": "https://registry.npmjs.org/"
74
74
  },
75
- "gitHead": "95704cba6bce8f9329171fbcb06acba2543decc0"
75
+ "gitHead": "d899cc28ac1f5b552114d8bfcd668a9bb8ab651c"
76
76
  }