@micromag/element-video 0.3.580 → 0.3.582

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 +77 -48
  2. package/package.json +2 -2
package/es/index.js CHANGED
@@ -45,9 +45,11 @@ var propTypes = {
45
45
  onSuspend: PropTypes$1.func,
46
46
  onSuspended: PropTypes$1.func,
47
47
  onPlayError: PropTypes$1.func,
48
+ onQualityLevelChange: PropTypes$1.func,
48
49
  focusable: PropTypes$1.bool,
49
50
  withPoster: PropTypes$1.bool,
50
- withLoading: PropTypes$1.bool
51
+ withLoading: PropTypes$1.bool,
52
+ qualityStartLevel: PropTypes$1.number
51
53
  };
52
54
  var defaultProps = {
53
55
  media: null,
@@ -79,9 +81,11 @@ var defaultProps = {
79
81
  onSuspend: null,
80
82
  onSuspended: null,
81
83
  onPlayError: null,
84
+ onQualityLevelChange: null,
82
85
  focusable: true,
83
86
  withPoster: false,
84
- withLoading: false
87
+ withLoading: false,
88
+ qualityStartLevel: -1
85
89
  };
86
90
  var Video = function Video(_ref) {
87
91
  var media = _ref.media,
@@ -111,11 +115,13 @@ var Video = function Video(_ref) {
111
115
  customOnSuspend = _ref.onSuspend,
112
116
  onSuspended = _ref.onSuspended,
113
117
  onPlayError = _ref.onPlayError,
118
+ onQualityLevelChange = _ref.onQualityLevelChange,
114
119
  focusable = _ref.focusable,
115
120
  withPoster = _ref.withPoster,
116
121
  withLoading = _ref.withLoading,
117
122
  disablePictureInPicture = _ref.disablePictureInPicture,
118
- disableHls = _ref.disableHls;
123
+ disableHls = _ref.disableHls,
124
+ qualityStartLevel = _ref.qualityStartLevel;
119
125
  var _ref2 = media || {},
120
126
  _ref2$url = _ref2.url,
121
127
  mediaUrl = _ref2$url === void 0 ? null : _ref2$url,
@@ -134,19 +140,19 @@ var Video = function Video(_ref) {
134
140
  return getMediaFilesAsArray(files);
135
141
  }, [files]);
136
142
  var finalThumbnail = useMediaThumbnail(media, thumbnail);
137
- var _ref14 = useRef(null);
138
- var currentTime = useMediaCurrentTime(_ref14.current, {
143
+ var _ref15 = useRef(null);
144
+ var currentTime = useMediaCurrentTime(_ref15.current, {
139
145
  id: mediaUrl,
140
146
  disabled: paused || onProgressStep === null
141
147
  });
142
- var duration = useMediaDuration(_ref14.current, {
148
+ var duration = useMediaDuration(_ref15.current, {
143
149
  id: mediaUrl
144
150
  });
145
151
  var _useState = useState(false),
146
152
  _useState2 = _slicedToArray(_useState, 2),
147
153
  showLoading = _useState2[0],
148
154
  setShowLoading = _useState2[1];
149
- var ready = useMediaReady(_ref14.current, {
155
+ var ready = useMediaReady(_ref15.current, {
150
156
  id: mediaUrl
151
157
  });
152
158
  useEffect(function () {
@@ -180,39 +186,40 @@ var Video = function Video(_ref) {
180
186
  _useState4 = _slicedToArray(_useState3, 2),
181
187
  hlsJs = _useState4[0],
182
188
  setHlsJs = _useState4[1];
183
- useEffect(function () {
184
- if (hlsJs !== null && _ref14.current !== null) {
185
- hlsJs.attachMedia(_ref14.current);
186
- }
187
- return function () {
188
- if (hlsJs !== null) {
189
- hlsJs.detachMedia();
190
- hlsJs.destroy();
191
- }
192
- };
193
- }, [hlsJs, _ref14.current]);
194
189
  var _useState5 = useState(0),
195
- _useState6 = _slicedToArray(_useState5, 2);
196
- _useState6[0];
197
- var setHlsTsOffset = _useState6[1];
190
+ _useState6 = _slicedToArray(_useState5, 2),
191
+ hlsTsOffset = _useState6[0],
192
+ setHlsTsOffset = _useState6[1];
193
+
194
+ // initialize hls instance if an hls source is provided
198
195
  useEffect(function () {
199
- if (_ref14.current === null || !hlsIsSupported) {
196
+ if (_ref15.current === null || !hlsIsSupported) {
200
197
  return;
201
198
  }
202
- if (hlsSources !== null && hlsSources.length > 0) {
203
- setHlsTsOffset(0);
204
- var hls = new Hls();
205
- var _onHlsBufferAppended = function onHlsBufferAppended(eventName, _ref5) {
206
- var frag = _ref5.frag;
199
+ setHlsTsOffset(0);
200
+ if (shouldLoad && hlsSources !== null && hlsSources.length > 0) {
201
+ var hls = new Hls({
202
+ startLevel: qualityStartLevel
203
+ });
204
+ hls.on(Hls.Events.LEVEL_SWITCHED, function (_, _ref5) {
205
+ var level = _ref5.level;
206
+ if (onQualityLevelChange !== null) {
207
+ onQualityLevelChange(level);
208
+ }
209
+ });
210
+
211
+ // compute hls timestamp offset when we get the first video fragment
212
+ var _onHlsBufferAppended = function onHlsBufferAppended(_, _ref6) {
213
+ var frag = _ref6.frag;
207
214
  var fragStart = frag.start,
208
215
  fragType = frag.type,
209
216
  _frag$sn = frag.sn,
210
217
  fragSn = _frag$sn === void 0 ? null : _frag$sn,
211
218
  _frag$elementaryStrea = frag.elementaryStreams.video,
212
219
  videoStream = _frag$elementaryStrea === void 0 ? null : _frag$elementaryStrea;
213
- var _ref6 = videoStream || {},
214
- _ref6$startPTS = _ref6.startPTS,
215
- videoStartPTS = _ref6$startPTS === void 0 ? null : _ref6$startPTS;
220
+ var _ref7 = videoStream || {},
221
+ _ref7$startPTS = _ref7.startPTS,
222
+ videoStartPTS = _ref7$startPTS === void 0 ? null : _ref7$startPTS;
216
223
  if (fragType === 'main' && fragSn !== 'initSegment' && videoStartPTS !== null) {
217
224
  var tOffset = videoStartPTS - fragStart;
218
225
  hls.off(Hls.Events.BUFFER_APPENDED, _onHlsBufferAppended);
@@ -223,7 +230,27 @@ var Video = function Video(_ref) {
223
230
  hls.loadSource(hlsSources[0].url);
224
231
  setHlsJs(hls);
225
232
  }
226
- }, [hlsIsSupported, hlsSources, _ref14]);
233
+ }, [shouldLoad, hlsIsSupported, hlsSources, _ref15]);
234
+
235
+ // attach hls.js when the <video> ref is ready
236
+ useEffect(function () {
237
+ if (hlsJs !== null && _ref15.current !== null) {
238
+ hlsJs.attachMedia(_ref15.current);
239
+ }
240
+ return function () {
241
+ if (hlsJs !== null) {
242
+ hlsJs.detachMedia();
243
+ hlsJs.destroy();
244
+ }
245
+ };
246
+ }, [hlsJs, _ref15.current]);
247
+
248
+ // handle changes of qualityStartLevel when an hls.js instance exists
249
+ useEffect(function () {
250
+ if (hlsJs !== null) {
251
+ hlsJs.startLevel = qualityStartLevel;
252
+ }
253
+ }, [qualityStartLevel]);
227
254
  var sourceFiles = useMemo(function () {
228
255
  if (filesArray.length === 0 || hlsSources !== null && hlsSources.length > 0) {
229
256
  return null;
@@ -242,11 +269,11 @@ var Video = function Video(_ref) {
242
269
  var _file$mime2 = file.mime,
243
270
  mime = _file$mime2 === void 0 ? "video/".concat(fileHandle === 'h264' ? 'mp4' : fileHandle) : _file$mime2;
244
271
  var currentMimeFile = filesMap[mime] || null;
245
- var _ref7 = currentMimeFile || {},
246
- _ref7$id = _ref7.id,
247
- currentId = _ref7$id === void 0 ? null : _ref7$id,
248
- _ref7$handle = _ref7.handle,
249
- currentHandle = _ref7$handle === void 0 ? null : _ref7$handle;
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;
250
277
  var currentMimeHandle = currentHandle || currentId;
251
278
  return currentMimeFile === null || currentMimeHandle === 'original' ? _objectSpread(_objectSpread({}, filesMap), {}, _defineProperty({}, mime, file)) : filesMap;
252
279
  }, {});
@@ -256,14 +283,14 @@ var Video = function Video(_ref) {
256
283
  }, [filesArray, hlsSources]);
257
284
 
258
285
  // @NOTE: Media is an animated image and doesn't have source files in video formats
259
- var _ref8 = filesArray.find(function (_ref9) {
260
- var handle = _ref9.handle;
286
+ var _ref9 = filesArray.find(function (_ref10) {
287
+ var handle = _ref10.handle;
261
288
  return handle === 'original';
262
289
  }) || {},
263
- _ref8$type = _ref8.type,
264
- originalType = _ref8$type === void 0 ? null : _ref8$type,
265
- _ref8$mime = _ref8.mime,
266
- originalMime = _ref8$mime === void 0 ? mediaMime : _ref8$mime;
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;
267
294
  var originalFileIsImage = originalType === 'image' || originalMime !== null && originalMime.indexOf('image/') === 0;
268
295
  var isImageWithoutSourceFile = originalFileIsImage && (sourceFiles === null || sourceFiles.length === 0);
269
296
  var withSize = width !== null && height !== null;
@@ -273,7 +300,7 @@ var Video = function Video(_ref) {
273
300
  }
274
301
  }, [duration, customOnDurationChange]);
275
302
  var onVolumeChange = useCallback(function () {
276
- var _ref$current = _ref14.current,
303
+ var _ref$current = _ref15.current,
277
304
  element = _ref$current === void 0 ? null : _ref$current;
278
305
  if (element === null) {
279
306
  return;
@@ -318,7 +345,7 @@ var Video = function Video(_ref) {
318
345
  }
319
346
  }, [ready, onReady]);
320
347
  useEffect(function () {
321
- var _ref$current2 = _ref14.current,
348
+ var _ref$current2 = _ref15.current,
322
349
  element = _ref$current2 === void 0 ? null : _ref$current2;
323
350
  if (element === null) {
324
351
  return;
@@ -355,7 +382,7 @@ var Video = function Video(_ref) {
355
382
  }) : null, !isImageWithoutSourceFile ? /*#__PURE__*/React.createElement("video", {
356
383
  key: mediaUrl,
357
384
  ref: function ref(newRef) {
358
- _ref14.current = newRef;
385
+ _ref15.current = newRef;
359
386
  if (mediaRef !== null && isFunction(mediaRef)) {
360
387
  mediaRef(newRef);
361
388
  } else if (mediaRef !== null) {
@@ -383,10 +410,12 @@ var Video = function Video(_ref) {
383
410
  onSuspend: onSuspend,
384
411
  "data-has-audio": hasAudio,
385
412
  "data-is-suspended": isSuspended,
413
+ "data-hls": hlsJs !== null,
414
+ "data-ts-offset": hlsTsOffset,
386
415
  "aria-hidden": true
387
- }, (sourceFiles || []).map(function (_ref13) {
388
- var sourceUrl = _ref13.url,
389
- sourceMime = _ref13.mime;
416
+ }, (sourceFiles || []).map(function (_ref14) {
417
+ var sourceUrl = _ref14.url,
418
+ sourceMime = _ref14.mime;
390
419
  return /*#__PURE__*/React.createElement("source", {
391
420
  key: "".concat(sourceUrl, "-").concat(sourceMime),
392
421
  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.580",
3
+ "version": "0.3.582",
4
4
  "private": false,
5
5
  "description": "",
6
6
  "keywords": [
@@ -72,5 +72,5 @@
72
72
  "access": "public",
73
73
  "registry": "https://registry.npmjs.org/"
74
74
  },
75
- "gitHead": "8534b331c1ddf17be6cb2bb33dc32f6ed31cf391"
75
+ "gitHead": "95704cba6bce8f9329171fbcb06acba2543decc0"
76
76
  }