@micromag/element-video 0.3.582 → 0.3.585
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.
- package/es/index.js +78 -54
- package/package.json +4 -4
package/es/index.js
CHANGED
|
@@ -85,7 +85,7 @@ var defaultProps = {
|
|
|
85
85
|
focusable: true,
|
|
86
86
|
withPoster: false,
|
|
87
87
|
withLoading: false,
|
|
88
|
-
qualityStartLevel:
|
|
88
|
+
qualityStartLevel: null
|
|
89
89
|
};
|
|
90
90
|
var Video = function Video(_ref) {
|
|
91
91
|
var media = _ref.media,
|
|
@@ -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
|
|
144
|
-
var currentTime = useMediaCurrentTime(
|
|
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(
|
|
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(
|
|
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
|
|
171
|
-
|
|
172
|
-
|
|
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,45 +182,62 @@ 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,
|
|
185
|
-
var
|
|
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
|
-
|
|
192
|
-
|
|
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
|
-
|
|
198
|
+
setHlsFailed(false);
|
|
199
|
+
if (shouldLoad && _ref16.current !== null && hlsSources !== null && hlsSources.length > 0) {
|
|
201
200
|
var hls = new Hls({
|
|
202
|
-
|
|
201
|
+
maxBufferLength: 15,
|
|
202
|
+
// seconds. prevents loading too much per screen.
|
|
203
|
+
startLevel: qualityStartLevel !== null ? qualityStartLevel : -1
|
|
203
204
|
});
|
|
204
205
|
hls.on(Hls.Events.LEVEL_SWITCHED, function (_, _ref5) {
|
|
205
206
|
var level = _ref5.level;
|
|
206
207
|
if (onQualityLevelChange !== null) {
|
|
207
|
-
onQualityLevelChange(level);
|
|
208
|
+
onQualityLevelChange(level, _ref16.current);
|
|
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
|
+
}
|
|
208
226
|
}
|
|
209
227
|
});
|
|
210
228
|
|
|
211
229
|
// compute hls timestamp offset when we get the first video fragment
|
|
212
|
-
var _onHlsBufferAppended = function onHlsBufferAppended(_,
|
|
213
|
-
var 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
|
|
221
|
-
|
|
222
|
-
videoStartPTS =
|
|
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,
|
|
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 &&
|
|
238
|
-
hlsJs.attachMedia(
|
|
257
|
+
if (hlsJs !== null && _ref16.current !== null) {
|
|
258
|
+
hlsJs.attachMedia(_ref16.current);
|
|
239
259
|
}
|
|
240
260
|
return function () {
|
|
241
261
|
if (hlsJs !== null) {
|
|
@@ -243,12 +263,16 @@ var Video = function Video(_ref) {
|
|
|
243
263
|
hlsJs.destroy();
|
|
244
264
|
}
|
|
245
265
|
};
|
|
246
|
-
}, [hlsJs,
|
|
266
|
+
}, [hlsJs, _ref16.current]);
|
|
247
267
|
|
|
248
268
|
// handle changes of qualityStartLevel when an hls.js instance exists
|
|
249
269
|
useEffect(function () {
|
|
250
270
|
if (hlsJs !== null) {
|
|
251
|
-
|
|
271
|
+
var qualityLevel = qualityStartLevel !== null ? qualityStartLevel : -1;
|
|
272
|
+
hlsJs.startLevel = qualityLevel;
|
|
273
|
+
if (_ref16.current !== null && _ref16.current.paused) {
|
|
274
|
+
hlsJs.currentLevel = qualityLevel;
|
|
275
|
+
}
|
|
252
276
|
}
|
|
253
277
|
}, [qualityStartLevel]);
|
|
254
278
|
var sourceFiles = useMemo(function () {
|
|
@@ -269,11 +293,11 @@ var Video = function Video(_ref) {
|
|
|
269
293
|
var _file$mime2 = file.mime,
|
|
270
294
|
mime = _file$mime2 === void 0 ? "video/".concat(fileHandle === 'h264' ? 'mp4' : fileHandle) : _file$mime2;
|
|
271
295
|
var currentMimeFile = filesMap[mime] || null;
|
|
272
|
-
var
|
|
273
|
-
|
|
274
|
-
currentId =
|
|
275
|
-
|
|
276
|
-
currentHandle =
|
|
296
|
+
var _ref9 = currentMimeFile || {},
|
|
297
|
+
_ref9$id = _ref9.id,
|
|
298
|
+
currentId = _ref9$id === void 0 ? null : _ref9$id,
|
|
299
|
+
_ref9$handle = _ref9.handle,
|
|
300
|
+
currentHandle = _ref9$handle === void 0 ? null : _ref9$handle;
|
|
277
301
|
var currentMimeHandle = currentHandle || currentId;
|
|
278
302
|
return currentMimeFile === null || currentMimeHandle === 'original' ? _objectSpread(_objectSpread({}, filesMap), {}, _defineProperty({}, mime, file)) : filesMap;
|
|
279
303
|
}, {});
|
|
@@ -283,14 +307,14 @@ var Video = function Video(_ref) {
|
|
|
283
307
|
}, [filesArray, hlsSources]);
|
|
284
308
|
|
|
285
309
|
// @NOTE: Media is an animated image and doesn't have source files in video formats
|
|
286
|
-
var
|
|
287
|
-
var handle =
|
|
310
|
+
var _ref10 = filesArray.find(function (_ref11) {
|
|
311
|
+
var handle = _ref11.handle;
|
|
288
312
|
return handle === 'original';
|
|
289
313
|
}) || {},
|
|
290
|
-
|
|
291
|
-
originalType =
|
|
292
|
-
|
|
293
|
-
originalMime =
|
|
314
|
+
_ref10$type = _ref10.type,
|
|
315
|
+
originalType = _ref10$type === void 0 ? null : _ref10$type,
|
|
316
|
+
_ref10$mime = _ref10.mime,
|
|
317
|
+
originalMime = _ref10$mime === void 0 ? mediaMime : _ref10$mime;
|
|
294
318
|
var originalFileIsImage = originalType === 'image' || originalMime !== null && originalMime.indexOf('image/') === 0;
|
|
295
319
|
var isImageWithoutSourceFile = originalFileIsImage && (sourceFiles === null || sourceFiles.length === 0);
|
|
296
320
|
var withSize = width !== null && height !== null;
|
|
@@ -300,7 +324,7 @@ var Video = function Video(_ref) {
|
|
|
300
324
|
}
|
|
301
325
|
}, [duration, customOnDurationChange]);
|
|
302
326
|
var onVolumeChange = useCallback(function () {
|
|
303
|
-
var _ref$current =
|
|
327
|
+
var _ref$current = _ref16.current,
|
|
304
328
|
element = _ref$current === void 0 ? null : _ref$current;
|
|
305
329
|
if (element === null) {
|
|
306
330
|
return;
|
|
@@ -311,10 +335,10 @@ var Video = function Video(_ref) {
|
|
|
311
335
|
}, [customOnVolumeChange]);
|
|
312
336
|
|
|
313
337
|
// Manage suspend
|
|
314
|
-
var
|
|
315
|
-
|
|
316
|
-
isSuspended =
|
|
317
|
-
setIsSuspended =
|
|
338
|
+
var _useState9 = useState(false),
|
|
339
|
+
_useState10 = _slicedToArray(_useState9, 2),
|
|
340
|
+
isSuspended = _useState10[0],
|
|
341
|
+
setIsSuspended = _useState10[1];
|
|
318
342
|
var onPlay = useCallback(function (e) {
|
|
319
343
|
if (isSuspended) {
|
|
320
344
|
setIsSuspended(false);
|
|
@@ -345,7 +369,7 @@ var Video = function Video(_ref) {
|
|
|
345
369
|
}
|
|
346
370
|
}, [ready, onReady]);
|
|
347
371
|
useEffect(function () {
|
|
348
|
-
var _ref$current2 =
|
|
372
|
+
var _ref$current2 = _ref16.current,
|
|
349
373
|
element = _ref$current2 === void 0 ? null : _ref$current2;
|
|
350
374
|
if (element === null) {
|
|
351
375
|
return;
|
|
@@ -382,7 +406,7 @@ var Video = function Video(_ref) {
|
|
|
382
406
|
}) : null, !isImageWithoutSourceFile ? /*#__PURE__*/React.createElement("video", {
|
|
383
407
|
key: mediaUrl,
|
|
384
408
|
ref: function ref(newRef) {
|
|
385
|
-
|
|
409
|
+
_ref16.current = newRef;
|
|
386
410
|
if (mediaRef !== null && isFunction(mediaRef)) {
|
|
387
411
|
mediaRef(newRef);
|
|
388
412
|
} else if (mediaRef !== null) {
|
|
@@ -413,9 +437,9 @@ var Video = function Video(_ref) {
|
|
|
413
437
|
"data-hls": hlsJs !== null,
|
|
414
438
|
"data-ts-offset": hlsTsOffset,
|
|
415
439
|
"aria-hidden": true
|
|
416
|
-
}, (sourceFiles || []).map(function (
|
|
417
|
-
var sourceUrl =
|
|
418
|
-
sourceMime =
|
|
440
|
+
}, (sourceFiles || []).map(function (_ref15) {
|
|
441
|
+
var sourceUrl = _ref15.url,
|
|
442
|
+
sourceMime = _ref15.mime;
|
|
419
443
|
return /*#__PURE__*/React.createElement("source", {
|
|
420
444
|
key: "".concat(sourceUrl, "-").concat(sourceMime),
|
|
421
445
|
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.
|
|
3
|
+
"version": "0.3.585",
|
|
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.
|
|
63
|
-
"@micromag/element-closed-captions": "^0.3.
|
|
62
|
+
"@micromag/core": "^0.3.585",
|
|
63
|
+
"@micromag/element-closed-captions": "^0.3.585",
|
|
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": "
|
|
75
|
+
"gitHead": "f8c2902ea472fcb2d1cdd3fe5d6054afd0cc766b"
|
|
76
76
|
}
|