@volcengine/veplayer 2.0.0-rc.1 → 2.1.0-rc.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 (38) hide show
  1. package/README.md +14 -1
  2. package/esm/index.d.ts +2055 -285
  3. package/esm/veplayer.biz.live.development.js +206 -46
  4. package/esm/veplayer.biz.live.production.js +1 -1
  5. package/esm/veplayer.d.ts +4468 -791
  6. package/esm/veplayer.development.css +1 -1
  7. package/esm/veplayer.development.js +884 -288
  8. package/esm/veplayer.live.d.ts +4534 -858
  9. package/esm/veplayer.live.development.css +1 -1
  10. package/esm/veplayer.live.development.js +884 -288
  11. package/esm/veplayer.live.production.css +1 -1
  12. package/esm/veplayer.live.production.js +4 -4
  13. package/esm/veplayer.production.css +1 -1
  14. package/esm/veplayer.production.js +4 -4
  15. package/esm/veplayer.vod.d.ts +2055 -285
  16. package/esm/veplayer.vod.development.css +1 -1
  17. package/esm/veplayer.vod.development.js +653 -213
  18. package/esm/veplayer.vod.production.css +1 -1
  19. package/esm/veplayer.vod.production.js +4 -4
  20. package/package.json +2 -1
  21. package/umd/index.d.ts +2055 -285
  22. package/umd/veplayer.biz.live.development.js +206 -46
  23. package/umd/veplayer.biz.live.production.js +1 -1
  24. package/umd/veplayer.d.ts +4468 -791
  25. package/umd/veplayer.development.css +1 -1
  26. package/umd/veplayer.development.js +884 -288
  27. package/umd/veplayer.live.d.ts +4534 -858
  28. package/umd/veplayer.live.development.css +1 -1
  29. package/umd/veplayer.live.development.js +882 -286
  30. package/umd/veplayer.live.production.css +1 -1
  31. package/umd/veplayer.live.production.js +1 -1
  32. package/umd/veplayer.production.css +1 -1
  33. package/umd/veplayer.production.js +1 -1
  34. package/umd/veplayer.vod.d.ts +2055 -285
  35. package/umd/veplayer.vod.development.css +1 -1
  36. package/umd/veplayer.vod.development.js +653 -213
  37. package/umd/veplayer.vod.production.css +1 -1
  38. package/umd/veplayer.vod.production.js +1 -1
@@ -8,6 +8,21 @@ var __publicField = (obj, key, value) => {
8
8
  return value;
9
9
  };
10
10
 
11
+ var Codec = /* @__PURE__ */ ((Codec2) => {
12
+ Codec2["H265"] = "h265";
13
+ Codec2["H264"] = "h264";
14
+ return Codec2;
15
+ })(Codec || {});
16
+ var Degradation = /* @__PURE__ */ ((Degradation2) => {
17
+ Degradation2["SoftFirst"] = "soft-first";
18
+ Degradation2["H264First"] = "h264-first";
19
+ return Degradation2;
20
+ })(Degradation || {});
21
+ var DecodeType = /* @__PURE__ */ ((DecodeType2) => {
22
+ DecodeType2["Software"] = "software";
23
+ DecodeType2["Hardware"] = "hardware";
24
+ return DecodeType2;
25
+ })(DecodeType || {});
11
26
  function ownKeys$1(object, enumerableOnly) {
12
27
  var keys = Object.keys(object);
13
28
  if (Object.getOwnPropertySymbols) {
@@ -1004,6 +1019,9 @@ var __publicField = (obj, key, value) => {
1004
1019
  }
1005
1020
  return /^blob/.test(video.currentSrc) || /^blob/.test(video.src);
1006
1021
  };
1022
+ util$1.isBlob = function(url) {
1023
+ return /^blob/.test(url);
1024
+ };
1007
1025
  util$1.generateSessionId = function() {
1008
1026
  var did = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0;
1009
1027
  var d2 = (/* @__PURE__ */ new Date()).getTime();
@@ -1064,6 +1082,69 @@ var __publicField = (obj, key, value) => {
1064
1082
  }
1065
1083
  return val % 360;
1066
1084
  };
1085
+ util$1.getIndexByTime = function(time, segments) {
1086
+ var _len = segments.length;
1087
+ var _index = -1;
1088
+ if (_len < 1) {
1089
+ return _index;
1090
+ }
1091
+ if (time <= segments[0].end || _len < 2) {
1092
+ _index = 0;
1093
+ } else if (time > segments[_len - 1].end) {
1094
+ _index = _len - 1;
1095
+ } else {
1096
+ for (var i2 = 1; i2 < _len; i2++) {
1097
+ if (time > segments[i2 - 1].end && time <= segments[i2].end) {
1098
+ _index = i2;
1099
+ break;
1100
+ }
1101
+ }
1102
+ }
1103
+ return _index;
1104
+ };
1105
+ util$1.getOffsetCurrentTime = function(currentTime, segments) {
1106
+ var index = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : -1;
1107
+ var _index = -1;
1108
+ if (index >= 0 && index < segments.length) {
1109
+ _index = index;
1110
+ } else {
1111
+ _index = util$1.getIndexByTime(currentTime, segments);
1112
+ }
1113
+ if (_index < 0) {
1114
+ return -1;
1115
+ }
1116
+ var _len = segments.length;
1117
+ var _segments$_index = segments[_index], start = _segments$_index.start, end = _segments$_index.end, cTime = _segments$_index.cTime, offset = _segments$_index.offset;
1118
+ if (currentTime < start) {
1119
+ return cTime;
1120
+ } else if (currentTime >= start && currentTime <= end) {
1121
+ return currentTime - offset;
1122
+ } else if (currentTime > end && _index >= _len - 1) {
1123
+ return end;
1124
+ }
1125
+ return -1;
1126
+ };
1127
+ util$1.getCurrentTimeByOffset = function(offsetTime, segments) {
1128
+ var _index = -1;
1129
+ if (!segments || segments.length < 0) {
1130
+ return offsetTime;
1131
+ }
1132
+ for (var i2 = 0; i2 < segments.length; i2++) {
1133
+ if (offsetTime <= segments[i2].duration) {
1134
+ _index = i2;
1135
+ break;
1136
+ }
1137
+ }
1138
+ if (_index !== -1) {
1139
+ var start = segments[_index].start;
1140
+ if (_index - 1 < 0) {
1141
+ return start + offsetTime;
1142
+ } else {
1143
+ return start + (offsetTime - segments[_index - 1].duration);
1144
+ }
1145
+ }
1146
+ return offsetTime;
1147
+ };
1067
1148
  function isObject$1(value) {
1068
1149
  var type = _typeof(value);
1069
1150
  return value !== null && (type === "object" || type === "function");
@@ -1153,7 +1234,7 @@ var __publicField = (obj, key, value) => {
1153
1234
  function debounced() {
1154
1235
  var time = Date.now();
1155
1236
  var isInvoking = shouldInvoke(time);
1156
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
1237
+ for (var _len2 = arguments.length, args = new Array(_len2), _key = 0; _key < _len2; _key++) {
1157
1238
  args[_key] = arguments[_key];
1158
1239
  }
1159
1240
  lastArgs = args;
@@ -1360,7 +1441,7 @@ var __publicField = (obj, key, value) => {
1360
1441
  }
1361
1442
  }
1362
1443
  };
1363
- var version = "3.0.7";
1444
+ var version = "3.0.10-alpha.4";
1364
1445
  var ERROR_TYPE_MAP = {
1365
1446
  1: "media",
1366
1447
  2: "media",
@@ -1446,6 +1527,7 @@ var __publicField = (obj, key, value) => {
1446
1527
  var DURATION_CHANGE = "durationchange";
1447
1528
  var VOLUME_CHANGE = "volumechange";
1448
1529
  var LOADED_DATA = "loadeddata";
1530
+ var LOADED_METADATA = "loadedmetadata";
1449
1531
  var RATE_CHANGE = "ratechange";
1450
1532
  var PROGRESS = "progress";
1451
1533
  var LOAD_START = "loadstart";
@@ -1485,7 +1567,7 @@ var __publicField = (obj, key, value) => {
1485
1567
  var SOURCE_ERROR = "source_error";
1486
1568
  var SOURCE_SUCCESS = "source_success";
1487
1569
  var SWITCH_SUBTITLE = "switch_subtitle";
1488
- var VIDEO_EVENTS = ["play", "playing", "ended", "pause", "error", "seeking", "seeked", "timeupdate", "waiting", "canplay", "canplaythrough", "durationchange", "volumechange", "loadeddata", "ratechange", "progress", "loadstart", "emptied", "stalled", "suspend", "abort", "lowdecode"];
1570
+ var VIDEO_EVENTS = ["play", "playing", "ended", "pause", "error", "seeking", "seeked", "timeupdate", "waiting", "canplay", "canplaythrough", "durationchange", "volumechange", "loadeddata", "loadedmetadata", "ratechange", "progress", "loadstart", "emptied", "stalled", "suspend", "abort", "lowdecode"];
1489
1571
  var STATS_EVENTS = {
1490
1572
  STATS_INFO: "stats_info",
1491
1573
  STATS_DOWNLOAD: "stats_download",
@@ -1514,6 +1596,7 @@ var __publicField = (obj, key, value) => {
1514
1596
  FPS_STUCK,
1515
1597
  FULLSCREEN_CHANGE,
1516
1598
  LOADED_DATA,
1599
+ LOADED_METADATA,
1517
1600
  LOAD_START,
1518
1601
  MINI_STATE_CHANGE,
1519
1602
  PAUSE,
@@ -1651,6 +1734,9 @@ var __publicField = (obj, key, value) => {
1651
1734
  if (options.loop) {
1652
1735
  _this.mediaConfig.loop = "loop";
1653
1736
  }
1737
+ if (options.autoplayMuted && !Object.prototype.hasOwnProperty.call(_this.mediaConfig, "muted")) {
1738
+ _this.mediaConfig.muted = true;
1739
+ }
1654
1740
  _this.media = util$1.createDom(_this.mediaConfig.mediaType, "", _this.mediaConfig, "");
1655
1741
  if (options.defaultPlaybackRate) {
1656
1742
  _this.media.defaultPlaybackRate = _this.media.playbackRate = options.defaultPlaybackRate;
@@ -1729,10 +1815,11 @@ var __publicField = (obj, key, value) => {
1729
1815
  var _this6 = this;
1730
1816
  video.removeAttribute("src");
1731
1817
  video.load();
1732
- urls.forEach(function(item) {
1818
+ urls.forEach(function(item, index) {
1733
1819
  _this6.media.appendChild(util$1.createDom("source", "", {
1734
1820
  src: "".concat(item.src),
1735
- type: "".concat(item.type || "")
1821
+ type: "".concat(item.type || ""),
1822
+ "data-index": index + 1
1736
1823
  }));
1737
1824
  });
1738
1825
  var _c = video.children;
@@ -1740,6 +1827,7 @@ var __publicField = (obj, key, value) => {
1740
1827
  return;
1741
1828
  }
1742
1829
  this._videoSourceCount = _c.length;
1830
+ this._videoSourceIndex = _c.length;
1743
1831
  this._vLoadeddata = function(e2) {
1744
1832
  _this6.emit(SOURCE_SUCCESS, {
1745
1833
  src: e2.target.currentSrc,
@@ -1754,8 +1842,9 @@ var __publicField = (obj, key, value) => {
1754
1842
  }
1755
1843
  }
1756
1844
  !this._sourceError && (this._sourceError = function(e2) {
1757
- _this6._videoSourceCount--;
1758
- if (_this6._videoSourceCount === 0) {
1845
+ var _dIndex = parseInt(e2.target.getAttribute("data-index"), 10);
1846
+ _this6._videoSourceIndex--;
1847
+ if (_this6._videoSourceIndex === 0 || _dIndex >= _this6._videoSourceCount) {
1759
1848
  var _err = {
1760
1849
  code: 4,
1761
1850
  message: "sources_load_error"
@@ -2082,7 +2171,7 @@ var __publicField = (obj, key, value) => {
2082
2171
  this.emit(WAITING);
2083
2172
  this._currentTime = 0;
2084
2173
  this._duration = 0;
2085
- if (/^blob/.test(this.media.currentSrc) || /^blob/.test(this.media.src)) {
2174
+ if (util$1.isMSE(this.media)) {
2086
2175
  this.onWaiting();
2087
2176
  return;
2088
2177
  }
@@ -3790,6 +3879,7 @@ var __publicField = (obj, key, value) => {
3790
3879
  },
3791
3880
  enableSwipeHandler: function enableSwipeHandler() {
3792
3881
  },
3882
+ preProcessUrl: null,
3793
3883
  ignores: [],
3794
3884
  whitelist: [],
3795
3885
  inactive: 3e3,
@@ -3871,7 +3961,7 @@ var __publicField = (obj, key, value) => {
3871
3961
  autoHide: false
3872
3962
  });
3873
3963
  });
3874
- _defineProperty$1(_assertThisInitialized(_this), "onMouseLeave", function() {
3964
+ _defineProperty$1(_assertThisInitialized(_this), "onMouseLeave", function(e2) {
3875
3965
  var _assertThisInitialize2 = _assertThisInitialized(_this), player = _assertThisInitialize2.player;
3876
3966
  player.focus();
3877
3967
  });
@@ -3949,12 +4039,13 @@ var __publicField = (obj, key, value) => {
3949
4039
  }, {
3950
4040
  key: "show",
3951
4041
  value: function show() {
3952
- util$1.addClass(this.root, "show");
4042
+ this.root.style.display = "";
4043
+ this.player.focus();
3953
4044
  }
3954
4045
  }, {
3955
4046
  key: "hide",
3956
4047
  value: function hide() {
3957
- util$1.removeClass(this.root, "show");
4048
+ this.root.style.display = "none";
3958
4049
  }
3959
4050
  }, {
3960
4051
  key: "mode",
@@ -4356,6 +4447,7 @@ var __publicField = (obj, key, value) => {
4356
4447
  _this.cssfullscreen = false;
4357
4448
  _this.isRotateFullscreen = false;
4358
4449
  _this._fullscreenEl = null;
4450
+ _this.timeSegments = [];
4359
4451
  _this._cssfullscreenEl = null;
4360
4452
  _this.curDefinition = null;
4361
4453
  _this._orgCss = "";
@@ -4365,7 +4457,7 @@ var __publicField = (obj, key, value) => {
4365
4457
  _this.videoPos = {
4366
4458
  pi: 1,
4367
4459
  scale: 0,
4368
- rotate: 0,
4460
+ rotate: -1,
4369
4461
  x: 0,
4370
4462
  y: 0,
4371
4463
  h: -1,
@@ -4373,11 +4465,21 @@ var __publicField = (obj, key, value) => {
4373
4465
  vy: 0,
4374
4466
  vx: 0
4375
4467
  };
4468
+ _this.sizeInfo = {
4469
+ width: 0,
4470
+ height: 0,
4471
+ left: 0,
4472
+ top: 0
4473
+ };
4376
4474
  _this._accPlayed = {
4377
4475
  t: 0,
4378
4476
  acc: 0,
4379
4477
  loopAcc: 0
4380
4478
  };
4479
+ _this._offsetInfo = {
4480
+ currentTime: -1,
4481
+ duration: 0
4482
+ };
4381
4483
  _this.innerContainer = null;
4382
4484
  _this.controls = null;
4383
4485
  _this.topBar = null;
@@ -4390,6 +4492,9 @@ var __publicField = (obj, key, value) => {
4390
4492
  _this.isUserActive = false;
4391
4493
  _this._onceSeekCanplay = null;
4392
4494
  _this._isPauseBeforeSeek = 0;
4495
+ _this.innerStates = {
4496
+ isActiveLocked: false
4497
+ };
4393
4498
  var rootInit = _this._initDOM();
4394
4499
  if (!rootInit) {
4395
4500
  console.error(new Error("can't find the dom which id is ".concat(_this.config.id, " or this.config.el does not exist")));
@@ -4475,16 +4580,16 @@ var __publicField = (obj, key, value) => {
4475
4580
  this.addClass(STATE_CLASS.NO_START);
4476
4581
  }
4477
4582
  if (this.config.fluid) {
4478
- var _this$config3 = this.config, width = _this$config3.width, height = _this$config3.height;
4479
- if (typeof width !== "number" || typeof height !== "number") {
4480
- width = 600;
4481
- height = 337.5;
4583
+ var _this$config3 = this.config, _width = _this$config3.width, _height = _this$config3.height;
4584
+ if (typeof _width !== "number" || typeof _height !== "number") {
4585
+ _width = 600;
4586
+ _height = 337.5;
4482
4587
  }
4483
4588
  var style = {
4484
4589
  width: "100%",
4485
4590
  height: "0",
4486
4591
  "max-width": "100%",
4487
- "padding-top": "".concat(height * 100 / width, "%")
4592
+ "padding-top": "".concat(_height * 100 / _width, "%")
4488
4593
  };
4489
4594
  Object.keys(style).forEach(function(key) {
4490
4595
  _this2.root.style[key] = style[key];
@@ -4500,6 +4605,11 @@ var __publicField = (obj, key, value) => {
4500
4605
  }
4501
4606
  });
4502
4607
  }
4608
+ var _this$root$getBoundin = this.root.getBoundingClientRect(), width = _this$root$getBoundin.width, height = _this$root$getBoundin.height, left = _this$root$getBoundin.left, top = _this$root$getBoundin.top;
4609
+ this.sizeInfo.width = width;
4610
+ this.sizeInfo.height = height;
4611
+ this.sizeInfo.left = left;
4612
+ this.sizeInfo.top = top;
4503
4613
  return true;
4504
4614
  }
4505
4615
  }, {
@@ -4583,7 +4693,7 @@ var __publicField = (obj, key, value) => {
4583
4693
  var readyState = this.media.readyState;
4584
4694
  XG_DEBUG.logInfo("_startInit readyState", readyState);
4585
4695
  if (this.config.autoplay) {
4586
- !(/^blob/.test(this.media.currentSrc) || /^blob/.test(this.media.src)) && this.load();
4696
+ !util$1.isMSE(this.media) && this.load();
4587
4697
  (sniffer$1.os.isIpad || sniffer$1.os.isPhone) && this.mediaPlay();
4588
4698
  }
4589
4699
  if (readyState >= 2) {
@@ -4811,7 +4921,8 @@ var __publicField = (obj, key, value) => {
4811
4921
  if (!url) {
4812
4922
  url = _this8.url || _this8.config.url;
4813
4923
  }
4814
- var ret = _this8._startInit(url);
4924
+ var _furl = _this8.preProcessUrl(url);
4925
+ var ret = _this8._startInit(_furl.url);
4815
4926
  return ret;
4816
4927
  }).catch(function(e2) {
4817
4928
  e2.fileName = "player";
@@ -4828,6 +4939,7 @@ var __publicField = (obj, key, value) => {
4828
4939
  if (util$1.typeOf(url) === "Object") {
4829
4940
  _src = url.url;
4830
4941
  }
4942
+ _src = this.preProcessUrl(_src).url;
4831
4943
  var curTime = this.currentTime;
4832
4944
  var isPaused = this.paused && !this.isError;
4833
4945
  this.src = _src;
@@ -5166,7 +5278,11 @@ var __publicField = (obj, key, value) => {
5166
5278
  this.addClass(STATE_CLASS.LOADING);
5167
5279
  runHooks(this, "retry", function() {
5168
5280
  var cur = _this20.currentTime;
5169
- _this20.src = _this20.config.url;
5281
+ var url = _this20.config.url;
5282
+ var _srcRet = !util$1.isMSE(_this20.media) ? _this20.preProcessUrl(url) : {
5283
+ url
5284
+ };
5285
+ _this20.src = _srcRet.url;
5170
5286
  !_this20.config.isLive && (_this20.currentTime = cur);
5171
5287
  _this20.once(CANPLAY, function() {
5172
5288
  _this20.mediaPlay();
@@ -5227,7 +5343,7 @@ var __publicField = (obj, key, value) => {
5227
5343
  var fullEl = util$1.getFullScreenEl();
5228
5344
  if (fullEl === this._fullscreenEl) {
5229
5345
  this.onFullscreenChange();
5230
- return;
5346
+ return Promise.resolve();
5231
5347
  }
5232
5348
  try {
5233
5349
  for (var i2 = 0; i2 < GET_FULLSCREEN_API.length; i2++) {
@@ -5400,30 +5516,38 @@ var __publicField = (obj, key, value) => {
5400
5516
  key: "onFocus",
5401
5517
  value: function onFocus() {
5402
5518
  var _this21 = this;
5403
- var _ref = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, _ref$autoHide = _ref.autoHide, autoHide = _ref$autoHide === void 0 ? !this.config.closePlayerBlur : _ref$autoHide, _ref$delay = _ref.delay, delay = _ref$delay === void 0 ? this.config.inactive : _ref$delay;
5519
+ var data = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {
5520
+ autoHide: true,
5521
+ delay: 3e3
5522
+ };
5523
+ var innerStates = this.innerStates;
5404
5524
  this.isActive = true;
5405
5525
  this.removeClass(STATE_CLASS.INACTIVE);
5406
5526
  if (this.userTimer) {
5407
5527
  util$1.clearTimeout(this, this.userTimer);
5408
5528
  this.userTimer = null;
5409
5529
  }
5410
- if (!autoHide) {
5530
+ if (data.isLock !== void 0) {
5531
+ innerStates.isActiveLocked = data.isLock;
5532
+ }
5533
+ if (data.autoHide === false || data.isLock === true || innerStates.isActiveLocked) {
5411
5534
  if (this.userTimer) {
5412
5535
  util$1.clearTimeout(this, this.userTimer);
5413
5536
  this.userTimer = null;
5414
5537
  }
5415
5538
  return;
5416
5539
  }
5540
+ var time = data && data.delay ? data.delay : this.config.inactive;
5417
5541
  this.userTimer = util$1.setTimeout(this, function() {
5418
5542
  _this21.userTimer = null;
5419
5543
  _this21.blur();
5420
- }, delay);
5544
+ }, time);
5421
5545
  }
5422
5546
  }, {
5423
5547
  key: "onBlur",
5424
5548
  value: function onBlur() {
5425
- var _ref2 = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, _ref2$ignorePaused = _ref2.ignorePaused, ignorePaused = _ref2$ignorePaused === void 0 ? false : _ref2$ignorePaused;
5426
- if (!this.isActive) {
5549
+ var _ref = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, _ref$ignorePaused = _ref.ignorePaused, ignorePaused = _ref$ignorePaused === void 0 ? false : _ref$ignorePaused;
5550
+ if (!this.isActive || this.innerStates.isActiveLocked) {
5427
5551
  return;
5428
5552
  }
5429
5553
  var closePauseVideoFocus = this.config.closePauseVideoFocus;
@@ -5546,7 +5670,7 @@ var __publicField = (obj, key, value) => {
5546
5670
  }, {
5547
5671
  key: "onTimeupdate",
5548
5672
  value: function onTimeupdate() {
5549
- !this._videoHeight && this.resize();
5673
+ !this._videoHeight && this.media.videoHeight && this.resize();
5550
5674
  if ((this.waitTimer || this.hasClass(STATE_CLASS.LOADING)) && this.media.readyState > 2) {
5551
5675
  this.removeClass(STATE_CLASS.LOADING);
5552
5676
  util$1.clearTimeout(this, this.waitTimer);
@@ -5621,8 +5745,11 @@ var __publicField = (obj, key, value) => {
5621
5745
  key: "resizePosition",
5622
5746
  value: function resizePosition() {
5623
5747
  var _this$videoPos = this.videoPos, rotate = _this$videoPos.rotate, vy = _this$videoPos.vy, vx = _this$videoPos.vx, h2 = _this$videoPos.h, w2 = _this$videoPos.w;
5748
+ if (rotate < 0 && !vy && !vx) {
5749
+ return;
5750
+ }
5624
5751
  var _pi = this.videoPos._pi;
5625
- if (!_pi) {
5752
+ if (!_pi && this.media.videoHeight) {
5626
5753
  _pi = this.media.videoWidth / this.media.videoHeight * 100;
5627
5754
  }
5628
5755
  if (!_pi) {
@@ -5722,9 +5849,14 @@ var __publicField = (obj, key, value) => {
5722
5849
  if (!this.media) {
5723
5850
  return;
5724
5851
  }
5852
+ var containerSize = this.root.getBoundingClientRect();
5853
+ this.sizeInfo.width = containerSize.width;
5854
+ this.sizeInfo.height = containerSize.height;
5855
+ this.sizeInfo.left = containerSize.left;
5856
+ this.sizeInfo.top = containerSize.top;
5725
5857
  var _this$media = this.media, videoWidth = _this$media.videoWidth, videoHeight = _this$media.videoHeight;
5726
5858
  var _this$config6 = this.config, fitVideoSize = _this$config6.fitVideoSize, videoFillMode = _this$config6.videoFillMode;
5727
- if (videoFillMode === "fill" || videoFillMode === "cover") {
5859
+ if (videoFillMode === "fill" || videoFillMode === "cover" || videoFillMode === "contain") {
5728
5860
  this.setAttribute("data-xgfill", videoFillMode);
5729
5861
  }
5730
5862
  if (!videoHeight || !videoWidth) {
@@ -5732,7 +5864,6 @@ var __publicField = (obj, key, value) => {
5732
5864
  }
5733
5865
  this._videoHeight = videoHeight;
5734
5866
  this._videoWidth = videoWidth;
5735
- var containerSize = this.root.getBoundingClientRect();
5736
5867
  var controlsHeight = this.controls && this.innerContainer ? this.controls.root.getBoundingClientRect().height : 0;
5737
5868
  var width = containerSize.width;
5738
5869
  var height = containerSize.height - controlsHeight;
@@ -5787,6 +5918,14 @@ var __publicField = (obj, key, value) => {
5787
5918
  XG_DEBUG.logInfo("setState", "state from:".concat(STATE_ARRAY[this.state], " to:").concat(STATE_ARRAY[newState]));
5788
5919
  this._state = newState;
5789
5920
  }
5921
+ }, {
5922
+ key: "preProcessUrl",
5923
+ value: function preProcessUrl(url, ext) {
5924
+ var preProcessUrl2 = this.config.preProcessUrl;
5925
+ return !util$1.isBlob(url) && preProcessUrl2 && typeof preProcessUrl2 === "function" ? preProcessUrl2(url, ext) : {
5926
+ url
5927
+ };
5928
+ }
5790
5929
  }, {
5791
5930
  key: "state",
5792
5931
  get: function get() {
@@ -5960,9 +6099,8 @@ var __publicField = (obj, key, value) => {
5960
6099
  }, {
5961
6100
  key: "cumulateTime",
5962
6101
  get: function get() {
5963
- var _accPlayed = this._accPlayed;
5964
- this.updateAcc("get");
5965
- return _accPlayed.acc;
6102
+ var _this$_accPlayed = this._accPlayed, acc = _this$_accPlayed.acc, t2 = _this$_accPlayed.t;
6103
+ return t2 ? (/* @__PURE__ */ new Date()).getTime() - t2 + acc : acc;
5966
6104
  }
5967
6105
  }, {
5968
6106
  key: "zoom",
@@ -6001,6 +6139,22 @@ var __publicField = (obj, key, value) => {
6001
6139
  set: function set(val) {
6002
6140
  REAL_TIME_SPEED = val;
6003
6141
  }
6142
+ }, {
6143
+ key: "offsetCurrentTime",
6144
+ get: function get() {
6145
+ return this._offsetInfo.currentTime || 0;
6146
+ },
6147
+ set: function set(val) {
6148
+ this._offsetInfo.currentTime = val;
6149
+ }
6150
+ }, {
6151
+ key: "offsetDuration",
6152
+ get: function get() {
6153
+ return this._offsetInfo.duration || 0;
6154
+ },
6155
+ set: function set(val) {
6156
+ this._offsetInfo.duration = val || 0;
6157
+ }
6004
6158
  }, {
6005
6159
  key: "hook",
6006
6160
  value: function hook$1(hookName, handler) {
@@ -6131,7 +6285,7 @@ var __publicField = (obj, key, value) => {
6131
6285
  ErrorCode2[ErrorCode2["RUNTIME_NO_CANPLAY_ERROR"] = 9001] = "RUNTIME_NO_CANPLAY_ERROR";
6132
6286
  ErrorCode2[ErrorCode2["RUNTIME_BUFFERBREAK_ERROR"] = 9002] = "RUNTIME_BUFFERBREAK_ERROR";
6133
6287
  ErrorCode2[ErrorCode2["RUNTIME_BWAITING_TIMEOUT_ERROR"] = 9002] = "RUNTIME_BWAITING_TIMEOUT_ERROR";
6134
- ErrorCode2[ErrorCode2["MODULE_LOAD_ERROR"] = 100] = "MODULE_LOAD_ERROR";
6288
+ ErrorCode2[ErrorCode2["MODULE_LOAD_ERROR"] = 110] = "MODULE_LOAD_ERROR";
6135
6289
  ErrorCode2["UNKNOWN"] = "UNKNOWN";
6136
6290
  return ErrorCode2;
6137
6291
  })(ErrorCode$1 || {});
@@ -6228,7 +6382,7 @@ var __publicField = (obj, key, value) => {
6228
6382
  /* Error */
6229
6383
  },
6230
6384
  [
6231
- 100
6385
+ 110
6232
6386
  /* MODULE_LOAD_ERROR */
6233
6387
  ]: {
6234
6388
  messageTextKey: "MODULE_LOAD_ERROR",
@@ -6303,6 +6457,11 @@ var __publicField = (obj, key, value) => {
6303
6457
  }
6304
6458
  };
6305
6459
  let VeError$1 = class VeError extends Error {
6460
+ /**
6461
+ * @hidden
6462
+ * @param error
6463
+ * @param i18n
6464
+ */
6306
6465
  constructor(error2, i18n) {
6307
6466
  var _a;
6308
6467
  const errorInfo = typeof error2 === "string" ? {
@@ -6310,8 +6469,17 @@ var __publicField = (obj, key, value) => {
6310
6469
  } : error2;
6311
6470
  const message = (i18n == null ? void 0 : i18n.getText(errorInfo == null ? void 0 : errorInfo.messageTextKey)) ?? (errorInfo == null ? void 0 : errorInfo.message) ?? ((_a = errorInfo == null ? void 0 : errorInfo.error) == null ? void 0 : _a.message) ?? (i18n == null ? void 0 : i18n.getText("UNKNOWN"));
6312
6471
  super(message);
6472
+ /**
6473
+ * @brief 错误码,对应[错误码字典](#错误码)。
6474
+ */
6313
6475
  __publicField(this, "errorCode");
6476
+ /**
6477
+ * @brief 错误等级。
6478
+ */
6314
6479
  __publicField(this, "level");
6480
+ /**
6481
+ * @brief 其他错误信息。
6482
+ */
6315
6483
  __publicField(this, "ext");
6316
6484
  this.errorCode = (errorInfo == null ? void 0 : errorInfo.errorCode) ?? "UNKNOWN";
6317
6485
  this.level = (errorInfo == null ? void 0 : errorInfo.level) ?? "Error";
@@ -7659,10 +7827,56 @@ var __publicField = (obj, key, value) => {
7659
7827
  var Touche = /* @__PURE__ */ function() {
7660
7828
  function Touche2(dom) {
7661
7829
  var _this = this;
7662
- var config = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {
7830
+ var _config = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {
7663
7831
  eventType: "touch"
7664
7832
  };
7665
7833
  _classCallCheck(this, Touche2);
7834
+ _defineProperty$1(this, "onTouchStart", function(e2) {
7835
+ var _pos = _this._pos, root2 = _this.root;
7836
+ var touch = getTouch(e2.touches);
7837
+ _pos.x = touch ? parseInt(touch.pageX, 10) : e2.pageX;
7838
+ _pos.y = touch ? parseInt(touch.pageX, 10) : e2.pageX;
7839
+ _pos.start = true;
7840
+ _this.__setPress(e2);
7841
+ root2.addEventListener(_this.events.end, _this.onTouchEnd);
7842
+ root2.addEventListener(_this.events.cancel, _this.onTouchCancel);
7843
+ root2.addEventListener(_this.events.move, _this.onTouchMove);
7844
+ _this.trigger(EVENTS.TOUCH_START, e2);
7845
+ });
7846
+ _defineProperty$1(this, "onTouchCancel", function(e2) {
7847
+ _this.onTouchEnd(e2);
7848
+ });
7849
+ _defineProperty$1(this, "onTouchEnd", function(e2) {
7850
+ var _pos = _this._pos, root2 = _this.root;
7851
+ _this.__clearPress();
7852
+ root2.removeEventListener(_this.events.cancel, _this.onTouchCancel);
7853
+ root2.removeEventListener(_this.events.end, _this.onTouchEnd);
7854
+ root2.removeEventListener(_this.events.move, _this.onTouchMove);
7855
+ e2.moving = _pos.moving;
7856
+ e2.press = _pos.press;
7857
+ _pos.press && _this.trigger(EVENTS.PRESS_END, e2);
7858
+ _this.trigger(EVENTS.TOUCH_END, e2);
7859
+ !_pos.press && !_pos.moving && _this.__setDb(e2);
7860
+ _pos.press = false;
7861
+ _pos.start = false;
7862
+ _pos.moving = false;
7863
+ });
7864
+ _defineProperty$1(this, "onTouchMove", function(e2) {
7865
+ var _pos = _this._pos, config = _this.config;
7866
+ var touch = getTouch(e2.touches);
7867
+ var x2 = touch ? parseInt(touch.pageX, 10) : e2.pageX;
7868
+ var y2 = touch ? parseInt(touch.pageY, 10) : e2.pageX;
7869
+ var diffx = x2 - _pos.x;
7870
+ var diffy = y2 - _pos.y;
7871
+ if (Math.abs(diffy) < config.miniStep && Math.abs(diffx) < config.miniStep) {
7872
+ return;
7873
+ }
7874
+ _this.__clearPress();
7875
+ _pos.press && _this.trigger(EVENTS.PRESS_END, e2);
7876
+ _pos.press = false;
7877
+ _pos.moving = true;
7878
+ _this.trigger(EVENTS.TOUCH_MOVE, e2);
7879
+ });
7666
7880
  this._pos = {
7667
7881
  moving: false,
7668
7882
  start: false,
@@ -7670,11 +7884,11 @@ var __publicField = (obj, key, value) => {
7670
7884
  y: 0
7671
7885
  };
7672
7886
  this.config = getDefaultConfig();
7673
- Object.keys(config).map(function(key) {
7674
- _this.config[key] = config[key];
7887
+ Object.keys(_config).map(function(key) {
7888
+ _this.config[key] = _config[key];
7675
7889
  });
7676
7890
  this.root = dom;
7677
- this.events = config.eventType === "mouse" ? MOUSES : TOUCHS;
7891
+ this.events = _config.eventType === "mouse" ? MOUSES : TOUCHS;
7678
7892
  this.pressIntrvalId = null;
7679
7893
  this.dbIntrvalId = null;
7680
7894
  this.__handlers = {};
@@ -7683,10 +7897,6 @@ var __publicField = (obj, key, value) => {
7683
7897
  _createClass$1(Touche2, [{
7684
7898
  key: "_initEvent",
7685
7899
  value: function _initEvent() {
7686
- this.onTouchStart = this.onTouchStart.bind(this);
7687
- this.onTouchMove = this.onTouchMove.bind(this);
7688
- this.onTouchEnd = this.onTouchEnd.bind(this);
7689
- this.onTouchCancel = this.onTouchCancel.bind(this);
7690
7900
  this.root.addEventListener(this.events.start, this.onTouchStart);
7691
7901
  }
7692
7902
  }, {
@@ -7772,60 +7982,6 @@ var __publicField = (obj, key, value) => {
7772
7982
  }
7773
7983
  });
7774
7984
  }
7775
- }, {
7776
- key: "onTouchStart",
7777
- value: function onTouchStart(e2) {
7778
- var _pos = this._pos, root2 = this.root;
7779
- var touch = getTouch(e2.touches);
7780
- _pos.x = touch ? parseInt(touch.pageX, 10) : e2.pageX;
7781
- _pos.y = touch ? parseInt(touch.pageX, 10) : e2.pageX;
7782
- _pos.start = true;
7783
- this.__setPress(e2);
7784
- root2.addEventListener(this.events.end, this.onTouchEnd);
7785
- root2.addEventListener(this.events.cancel, this.onTouchCancel);
7786
- root2.addEventListener(this.events.move, this.onTouchMove);
7787
- this.trigger(EVENTS.TOUCH_START, e2);
7788
- }
7789
- }, {
7790
- key: "onTouchCancel",
7791
- value: function onTouchCancel(e2) {
7792
- this.onTouchEnd(e2);
7793
- }
7794
- }, {
7795
- key: "onTouchEnd",
7796
- value: function onTouchEnd(e2) {
7797
- var _pos = this._pos, root2 = this.root;
7798
- this.__clearPress();
7799
- root2.removeEventListener(this.events.cancel, this.onTouchCancel);
7800
- root2.removeEventListener(this.events.end, this.onTouchEnd);
7801
- root2.removeEventListener(this.events.move, this.onTouchMove);
7802
- e2.moving = _pos.moving;
7803
- e2.press = _pos.press;
7804
- _pos.press && this.trigger(EVENTS.PRESS_END, e2);
7805
- this.trigger(EVENTS.TOUCH_END, e2);
7806
- !_pos.press && !_pos.moving && this.__setDb(e2);
7807
- _pos.press = false;
7808
- _pos.start = false;
7809
- _pos.moving = false;
7810
- }
7811
- }, {
7812
- key: "onTouchMove",
7813
- value: function onTouchMove(e2) {
7814
- var _pos = this._pos, config = this.config;
7815
- var touch = getTouch(e2.touches);
7816
- var x2 = touch ? parseInt(touch.pageX, 10) : e2.pageX;
7817
- var y2 = touch ? parseInt(touch.pageY, 10) : e2.pageX;
7818
- var diffx = x2 - _pos.x;
7819
- var diffy = y2 - _pos.y;
7820
- if (Math.abs(diffy) < config.miniStep && Math.abs(diffx) < config.miniStep) {
7821
- return;
7822
- }
7823
- this.__clearPress();
7824
- _pos.press && this.trigger(EVENTS.PRESS_END, e2);
7825
- _pos.press = false;
7826
- _pos.moving = true;
7827
- this.trigger(EVENTS.TOUCH_MOVE, e2);
7828
- }
7829
7985
  }, {
7830
7986
  key: "destroy",
7831
7987
  value: function destroy() {
@@ -7835,8 +7991,8 @@ var __publicField = (obj, key, value) => {
7835
7991
  touchmove: "onTouchMove",
7836
7992
  touchstart: "onTouchStart"
7837
7993
  };
7838
- Object.keys(map).map(function(key) {
7839
- _this4.root.removeEventListener("touchend", _this4[map[key]]);
7994
+ Object.keys(map).forEach(function(key) {
7995
+ _this4.root.removeEventListener(key, _this4[map[key]]);
7840
7996
  });
7841
7997
  }
7842
7998
  }]);
@@ -8487,38 +8643,61 @@ var __publicField = (obj, key, value) => {
8487
8643
  }
8488
8644
  _this = _super.call.apply(_super, [this].concat(args));
8489
8645
  _defineProperty$1(_assertThisInitialized(_this), "onBodyKeyDown", function(event) {
8490
- var e2 = event || window.event;
8491
- if (!_this.player || !_this.player.isUserActive && !_this.config.isIgnoreUserActive) {
8646
+ if (!_this.player) {
8492
8647
  return;
8493
8648
  }
8494
- if (_this.config.disable || _this.config.disableBodyTrigger || !_this.checkIsVisible() || e2.metaKey || e2.altKey || e2.ctrlKey) {
8649
+ var e2 = event || window.event;
8650
+ var keyCode = e2.keyCode;
8651
+ var _assertThisInitialize = _assertThisInitialized(_this), _keyState = _assertThisInitialize._keyState, player = _assertThisInitialize.player;
8652
+ var _this$config = _this.config, disable = _this$config.disable, disableBodyTrigger = _this$config.disableBodyTrigger, isIgnoreUserActive = _this$config.isIgnoreUserActive;
8653
+ if (disable || disableBodyTrigger || !player.isUserActive && !isIgnoreUserActive || isDisableTag(e2.target) || !_this.checkIsVisible() || e2.metaKey || e2.altKey || e2.ctrlKey) {
8654
+ _keyState.isBodyKeyDown = false;
8495
8655
  return;
8496
8656
  }
8497
- var keyCode = e2.keyCode;
8498
- if ((e2.target === document.body || _this.config.isGlobalTrigger && !isDisableTag(e2.target)) && _this.checkCode(keyCode, true)) {
8499
- preventDefault(e2);
8500
- _this.handleKeyCode(keyCode, event);
8501
- return false;
8657
+ if (!event.repeat && !_keyState.isKeyDown) {
8658
+ if ((e2.target === document.body || _this.config.isGlobalTrigger && !isDisableTag(e2.target)) && _this.checkCode(keyCode, true)) {
8659
+ _keyState.isBodyKeyDown = true;
8660
+ }
8661
+ document.addEventListener("keyup", _this.onBodyKeyUp);
8502
8662
  }
8503
- return false;
8663
+ _keyState.isBodyKeyDown && _this.handleKeyDown(e2);
8504
8664
  });
8505
- _defineProperty$1(_assertThisInitialized(_this), "onKeydown", function(event) {
8506
- var e2 = event || window.event;
8507
- if (_this.config.disable || _this.config.disableRootTrigger || e2.metaKey || e2.altKey || e2.ctrlKey) {
8665
+ _defineProperty$1(_assertThisInitialized(_this), "onBodyKeyUp", function(event) {
8666
+ if (!_this.player) {
8508
8667
  return;
8509
8668
  }
8510
- if (!_this.player.isUserActive && !_this.config.isIgnoreUserActive) {
8669
+ document.removeEventListener("keyup", _this.onBodyKeyUp);
8670
+ _this.handleKeyUp(event);
8671
+ });
8672
+ _defineProperty$1(_assertThisInitialized(_this), "onKeydown", function(event) {
8673
+ if (!_this.player) {
8511
8674
  return;
8512
8675
  }
8513
- if (!_this.player.isUserActive && !_this.config.isIgnoreUserActive) {
8676
+ var e2 = event || window.event;
8677
+ var _assertThisInitialize2 = _assertThisInitialized(_this), _keyState = _assertThisInitialize2._keyState;
8678
+ if (!e2.repeat) {
8679
+ if (_this.config.disable || _this.config.disableRootTrigger || e2.metaKey || e2.altKey || e2.ctrlKey) {
8680
+ return;
8681
+ }
8682
+ if (!_this.player.isUserActive && !_this.config.isIgnoreUserActive) {
8683
+ return;
8684
+ }
8685
+ if (e2 && (e2.keyCode === 37 || _this.checkCode(e2.keyCode)) && (e2.target === _this.player.root || e2.target === _this.player.video || e2.target === _this.player.controls.el)) {
8686
+ _keyState.isKeyDown = true;
8687
+ }
8688
+ _this.player.root.addEventListener("keyup", _this.onKeyup);
8689
+ }
8690
+ if (!_keyState.isKeyDown) {
8514
8691
  return;
8515
8692
  }
8516
- if (e2 && (e2.keyCode === 37 || _this.checkCode(e2.keyCode)) && (e2.target === _this.player.root || e2.target === _this.player.video || e2.target === _this.player.controls.el)) {
8517
- preventDefault(e2);
8518
- } else {
8519
- return true;
8693
+ _this.handleKeyDown(e2);
8694
+ });
8695
+ _defineProperty$1(_assertThisInitialized(_this), "onKeyup", function(event) {
8696
+ if (!_this.player) {
8697
+ return;
8520
8698
  }
8521
- _this.handleKeyCode(e2.keyCode, event);
8699
+ _this.player.root.removeEventListener("keyup", _this.onKeyup);
8700
+ _this.handleKeyUp(event);
8522
8701
  });
8523
8702
  return _this;
8524
8703
  }
@@ -8532,7 +8711,7 @@ var __publicField = (obj, key, value) => {
8532
8711
  if (!_this2.keyCodeMap[key]) {
8533
8712
  _this2.keyCodeMap[key] = extendkeyCodeMap[key];
8534
8713
  } else {
8535
- ["keyCode", "action", "disable", "isBodyTarget"].map(function(key1) {
8714
+ ["keyCode", "action", "disable", "pressAction", "disablePress", "isBodyTarget"].map(function(key1) {
8536
8715
  extendkeyCodeMap[key][key1] && (_this2.keyCodeMap[key][key1] = extendkeyCodeMap[key][key1]);
8537
8716
  });
8538
8717
  }
@@ -8552,37 +8731,51 @@ var __publicField = (obj, key, value) => {
8552
8731
  keyCode: 32,
8553
8732
  action: "playPause",
8554
8733
  disable: false,
8734
+ disablePress: false,
8555
8735
  noBodyTarget: false
8556
8736
  },
8557
8737
  up: {
8558
8738
  keyCode: 38,
8559
8739
  action: "upVolume",
8560
8740
  disable: false,
8741
+ disablePress: false,
8561
8742
  noBodyTarget: true
8562
8743
  },
8563
8744
  down: {
8564
8745
  keyCode: 40,
8565
8746
  action: "downVolume",
8566
8747
  disable: false,
8748
+ disablePress: false,
8567
8749
  noBodyTarget: true
8568
8750
  },
8569
8751
  left: {
8570
8752
  keyCode: 37,
8571
8753
  action: "seekBack",
8754
+ disablePress: false,
8572
8755
  disable: false
8573
8756
  },
8574
8757
  right: {
8575
8758
  keyCode: 39,
8576
8759
  action: "seek",
8760
+ pressAction: "changePlaybackRate",
8761
+ disablePress: false,
8577
8762
  disable: false
8578
8763
  },
8579
8764
  esc: {
8580
8765
  keyCode: 27,
8581
8766
  action: "exitFullscreen",
8767
+ disablePress: true,
8582
8768
  disable: false
8583
8769
  }
8584
8770
  };
8585
8771
  this.mergekeyCodeMap();
8772
+ this._keyState = {
8773
+ isKeyDown: false,
8774
+ isBodyKeyDown: false,
8775
+ isPress: false,
8776
+ tt: 0,
8777
+ playbackRate: 0
8778
+ };
8586
8779
  this.player.root.addEventListener("keydown", this.onKeydown);
8587
8780
  document.addEventListener("keydown", this.onBodyKeyDown);
8588
8781
  }
@@ -8616,6 +8809,9 @@ var __publicField = (obj, key, value) => {
8616
8809
  key: "downVolume",
8617
8810
  value: function downVolume(event) {
8618
8811
  var player = this.player;
8812
+ if (player.volume <= 0) {
8813
+ return;
8814
+ }
8619
8815
  var val = parseFloat((player.volume - 0.1).toFixed(1));
8620
8816
  var props = {
8621
8817
  volume: {
@@ -8636,6 +8832,9 @@ var __publicField = (obj, key, value) => {
8636
8832
  key: "upVolume",
8637
8833
  value: function upVolume(event) {
8638
8834
  var player = this.player;
8835
+ if (player.volume >= 1) {
8836
+ return;
8837
+ }
8639
8838
  var val = parseFloat((player.volume + 0.1).toFixed(1));
8640
8839
  var props = {
8641
8840
  volume: {
@@ -8655,42 +8854,57 @@ var __publicField = (obj, key, value) => {
8655
8854
  }, {
8656
8855
  key: "seek",
8657
8856
  value: function seek(event) {
8658
- var _this$player = this.player, currentTime = _this$player.currentTime, duration = _this$player.duration;
8659
- var _time = currentTime;
8660
- if (currentTime + this.seekStep <= duration) {
8661
- _time = currentTime + this.seekStep;
8857
+ var _this$player = this.player, currentTime = _this$player.currentTime, offsetCurrentTime = _this$player.offsetCurrentTime, duration = _this$player.duration, offsetDuration = _this$player.offsetDuration, timeSegments = _this$player.timeSegments;
8858
+ var _time = offsetCurrentTime > -1 ? offsetCurrentTime : currentTime;
8859
+ var _duration = offsetDuration || duration;
8860
+ var _step = event.repeat && this.seekStep >= 4 ? parseInt(this.seekStep / 2, 10) : this.seekStep;
8861
+ if (_time + _step <= _duration) {
8862
+ _time = _time + _step;
8662
8863
  } else {
8663
- _time = duration;
8864
+ _time = _duration;
8664
8865
  }
8866
+ var _seekTime = util$1.getCurrentTimeByOffset(_time, timeSegments);
8665
8867
  var props = {
8666
8868
  currentTime: {
8667
8869
  from: currentTime,
8668
- to: _time
8870
+ to: _seekTime
8669
8871
  }
8670
8872
  };
8671
8873
  this.emitUserAction(event, "seek", {
8672
8874
  props
8673
8875
  });
8674
- this.player.currentTime = _time;
8876
+ this.player.currentTime = _seekTime;
8675
8877
  }
8676
8878
  }, {
8677
8879
  key: "seekBack",
8678
8880
  value: function seekBack(event) {
8679
- var currentTime = this.player.currentTime;
8680
- var _time = 0;
8681
- if (currentTime - this.seekStep >= 0) {
8682
- _time = currentTime - this.seekStep;
8683
- }
8881
+ var _this$player2 = this.player, currentTime = _this$player2.currentTime, offsetCurrentTime = _this$player2.offsetCurrentTime, timeSegments = _this$player2.timeSegments;
8882
+ var _step = event.repeat ? parseInt(this.seekStep / 2, 10) : this.seekStep;
8883
+ var _time = offsetCurrentTime > -1 ? offsetCurrentTime : currentTime;
8884
+ var _seekTime = _time - _step;
8885
+ if (_seekTime < 0) {
8886
+ _seekTime = 0;
8887
+ }
8888
+ _seekTime = util$1.getCurrentTimeByOffset(_seekTime, timeSegments);
8684
8889
  var props = {
8685
8890
  currentTime: {
8686
8891
  from: currentTime,
8687
- to: _time
8892
+ to: _seekTime
8688
8893
  }
8689
8894
  };
8690
8895
  this.emitUserAction(event, "seek", {
8691
8896
  props
8692
8897
  });
8693
- this.player.currentTime = _time;
8898
+ this.player.currentTime = _seekTime;
8899
+ }
8900
+ }, {
8901
+ key: "changePlaybackRate",
8902
+ value: function changePlaybackRate(event) {
8903
+ var _keyState = this._keyState, config = this.config, player = this.player;
8904
+ if (_keyState.playbackRate === 0) {
8905
+ _keyState.playbackRate = player.playbackRate;
8906
+ player.playbackRate = config.playbackRate;
8907
+ }
8694
8908
  }
8695
8909
  }, {
8696
8910
  key: "playPause",
@@ -8728,32 +8942,66 @@ var __publicField = (obj, key, value) => {
8728
8942
  player.exitCssFullscreen();
8729
8943
  }
8730
8944
  }
8945
+ }, {
8946
+ key: "handleKeyDown",
8947
+ value: function handleKeyDown(e2) {
8948
+ var _keyState = this._keyState;
8949
+ if (e2.repeat) {
8950
+ _keyState.isPress = true;
8951
+ var _t = Date.now();
8952
+ if (_t - _keyState.tt < 200) {
8953
+ return;
8954
+ }
8955
+ _keyState.tt = _t;
8956
+ }
8957
+ preventDefault(e2);
8958
+ this.handleKeyCode(e2.keyCode, e2, _keyState.isPress);
8959
+ }
8960
+ }, {
8961
+ key: "handleKeyUp",
8962
+ value: function handleKeyUp(e2) {
8963
+ var _keyState = this._keyState;
8964
+ if (_keyState.playbackRate > 0) {
8965
+ this.player.playbackRate = _keyState.playbackRate;
8966
+ _keyState.playbackRate = 0;
8967
+ }
8968
+ _keyState.isKeyDown = false;
8969
+ _keyState.isPress = false;
8970
+ _keyState.tt = 0;
8971
+ }
8731
8972
  }, {
8732
8973
  key: "handleKeyCode",
8733
- value: function handleKeyCode(curKeyCode, event) {
8734
- var _this4 = this;
8735
- Object.keys(this.keyCodeMap).map(function(key) {
8736
- var _this4$keyCodeMap$key = _this4.keyCodeMap[key], action = _this4$keyCodeMap$key.action, keyCode = _this4$keyCodeMap$key.keyCode, disable = _this4$keyCodeMap$key.disable;
8737
- if (keyCode === curKeyCode && !disable) {
8738
- if (typeof action === "function") {
8739
- action(event, _this4.player);
8740
- } else if (typeof action === "string") {
8741
- if (typeof _this4[action] === "function") {
8742
- _this4[action](event, _this4.player);
8974
+ value: function handleKeyCode(curKeyCode, event, isPress) {
8975
+ var arr = Object.keys(this.keyCodeMap);
8976
+ for (var i2 = 0; i2 < arr.length; i2++) {
8977
+ var _this$keyCodeMap$arr$ = this.keyCodeMap[arr[i2]], action = _this$keyCodeMap$arr$.action, keyCode = _this$keyCodeMap$arr$.keyCode, disable = _this$keyCodeMap$arr$.disable, pressAction = _this$keyCodeMap$arr$.pressAction, disablePress = _this$keyCodeMap$arr$.disablePress;
8978
+ if (keyCode === curKeyCode) {
8979
+ if (!disable && !(isPress && disablePress)) {
8980
+ var _action = !isPress ? action : pressAction || action;
8981
+ if (typeof _action === "function") {
8982
+ action(event, this.player, isPress);
8983
+ } else if (typeof _action === "string") {
8984
+ if (typeof this[_action] === "function") {
8985
+ this[_action](event, this.player, isPress);
8986
+ }
8743
8987
  }
8988
+ this.emit(SHORTCUT, _objectSpread2$1({
8989
+ key: arr[i2],
8990
+ target: event.target,
8991
+ isPress
8992
+ }, this.keyCodeMap[arr[i2]]));
8744
8993
  }
8745
- _this4.emit(SHORTCUT, _objectSpread2$1({
8746
- key,
8747
- target: event.target
8748
- }, _this4.keyCodeMap[key]));
8994
+ break;
8749
8995
  }
8750
- });
8996
+ }
8751
8997
  }
8752
8998
  }, {
8753
8999
  key: "destroy",
8754
9000
  value: function destroy() {
8755
9001
  this.player.root.removeEventListener("keydown", this.onKeydown);
8756
9002
  document.removeEventListener("keydown", this.onBodyKeyDown);
9003
+ this.player.root.removeEventListener("keyup", this.onKeyup);
9004
+ document.removeEventListener("keyup", this.onBodyKeyUp);
8757
9005
  }
8758
9006
  }, {
8759
9007
  key: "disable",
@@ -8775,12 +9023,13 @@ var __publicField = (obj, key, value) => {
8775
9023
  get: function get() {
8776
9024
  return {
8777
9025
  seekStep: 10,
8778
- checkVisible: true,
9026
+ checkVisible: false,
8779
9027
  disableBodyTrigger: false,
8780
9028
  disableRootTrigger: false,
8781
9029
  isGlobalTrigger: false,
8782
9030
  keyCodeMap: {},
8783
9031
  disable: false,
9032
+ playbackRate: 2,
8784
9033
  isIgnoreUserActive: false
8785
9034
  };
8786
9035
  }
@@ -10149,6 +10398,9 @@ var __publicField = (obj, key, value) => {
10149
10398
  get url() {
10150
10399
  return this._currentUrlRef.url;
10151
10400
  }
10401
+ set url(url) {
10402
+ this._currentUrlRef.url = url;
10403
+ }
10152
10404
  next() {
10153
10405
  const next = this._currentUrlRef.next;
10154
10406
  /* istanbul ignore next -- @preserve */
@@ -10226,7 +10478,6 @@ var __publicField = (obj, key, value) => {
10226
10478
  __publicField(this, "defaultSource");
10227
10479
  __publicField(this, "defaultDefinition");
10228
10480
  __publicField(this, "maxFallbackRound");
10229
- __publicField(this, "_prepareList", []);
10230
10481
  __publicField(this, "_currentDefinition");
10231
10482
  __publicField(this, "_sources");
10232
10483
  __publicField(this, "_fallbackCount", 0);
@@ -10261,6 +10512,11 @@ var __publicField = (obj, key, value) => {
10261
10512
  var _a;
10262
10513
  return (_a = this.definition) == null ? void 0 : _a.url;
10263
10514
  }
10515
+ set url(url) {
10516
+ if (this.definition) {
10517
+ this.definition.url = url;
10518
+ }
10519
+ }
10264
10520
  /**
10265
10521
  * 以给定的参数搜索源和对应清晰度。`source` 和 `definition`
10266
10522
  * 都是可选的,当未指定时,使用当前的 {@link SourceManager.source}
@@ -10330,14 +10586,6 @@ var __publicField = (obj, key, value) => {
10330
10586
  this.resetFallback();
10331
10587
  return this;
10332
10588
  }
10333
- registerPrepare(prepare) {
10334
- this._prepareList.push(prepare);
10335
- }
10336
- async prepare(url) {
10337
- for (const prepare of this._prepareList) {
10338
- await prepare(url);
10339
- }
10340
- }
10341
10589
  resetFallback() {
10342
10590
  this._fallbackCount = 0;
10343
10591
  }
@@ -10779,12 +11027,13 @@ var __publicField = (obj, key, value) => {
10779
11027
  }
10780
11028
  }
10781
11029
  var optionsIcon = "";
10782
- const ListType = {
10783
- Middle: "middle",
10784
- Bottom: "bottom",
10785
- Fullscreen: "fullscreen",
10786
- Inner: "inner"
10787
- };
11030
+ var ListType = /* @__PURE__ */ ((ListType2) => {
11031
+ ListType2["Middle"] = "middle";
11032
+ ListType2["Bottom"] = "bottom";
11033
+ ListType2["Fullscreen"] = "fullscreen";
11034
+ ListType2["Inner"] = "inner";
11035
+ return ListType2;
11036
+ })(ListType || {});
10788
11037
  var RenderType = /* @__PURE__ */ ((RenderType2) => {
10789
11038
  RenderType2["Icon"] = "Icon";
10790
11039
  RenderType2["Text"] = "Text";
@@ -10792,20 +11041,26 @@ var __publicField = (obj, key, value) => {
10792
11041
  })(RenderType || {});
10793
11042
  const isMobile$1 = sniffer$1.device === "mobile";
10794
11043
  const MOBILE_LIST_TYPES = [
10795
- ListType.Bottom,
10796
- ListType.Fullscreen,
10797
- ListType.Inner
11044
+ "bottom",
11045
+ "fullscreen",
11046
+ "inner"
11047
+ /* Inner */
11048
+ ];
11049
+ const PC_LIST_TYPES = [
11050
+ "middle"
11051
+ /* Middle */
10798
11052
  ];
10799
- const PC_LIST_TYPES = [ListType.Middle];
10800
11053
  const MODAL_TYPES = [
10801
- ListType.Bottom,
10802
- ListType.Inner,
10803
- ListType.Fullscreen
11054
+ "bottom",
11055
+ "inner",
11056
+ "fullscreen"
11057
+ /* Fullscreen */
10804
11058
  ];
10805
11059
  const CUSTOM_TYPES = [
10806
- ListType.Bottom,
10807
- ListType.Inner,
10808
- ListType.Fullscreen
11060
+ "bottom",
11061
+ "inner",
11062
+ "fullscreen"
11063
+ /* Fullscreen */
10809
11064
  ];
10810
11065
  class OptionsIcon extends Plugin {
10811
11066
  constructor(args) {
@@ -10843,7 +11098,7 @@ var __publicField = (obj, key, value) => {
10843
11098
  // 默认手机端在“右上角”,pc端在控制栏右侧
10844
11099
  position: isMobile$1 ? POSITIONS$1.ROOT_TOP_RIGHT : POSITIONS$1.CONTROLS_RIGHT,
10845
11100
  // 默认手机端列表展示底部,pc端在控制栏默认
10846
- listType: isMobile$1 ? ListType.Bottom : ListType.Middle,
11101
+ listType: isMobile$1 ? "bottom" : "middle",
10847
11102
  index: 100,
10848
11103
  list: [],
10849
11104
  listStyle: {},
@@ -11025,10 +11280,10 @@ var __publicField = (obj, key, value) => {
11025
11280
  listType = this.player.config.listType;
11026
11281
  }
11027
11282
  if (!isMobile$1 && (!listType || !MOBILE_LIST_TYPES.includes(listType))) {
11028
- listType = ListType.Bottom;
11283
+ listType = "bottom";
11029
11284
  }
11030
11285
  if (!isMobile$1 && (!listType || !PC_LIST_TYPES.includes(listType))) {
11031
- listType = ListType.Middle;
11286
+ listType = "middle";
11032
11287
  }
11033
11288
  return listType;
11034
11289
  }
@@ -11921,9 +12176,7 @@ var __publicField = (obj, key, value) => {
11921
12176
  toastPlugin.remove(this._toastId);
11922
12177
  }
11923
12178
  this._toastId = toastPlugin.toast(
11924
- `${i18nManager.getText("DEFINITION_SWITCHING")} ${(definition.text && this.player.config.i18nManager.normalize(
11925
- definition.text
11926
- )) ?? definition.definition} ...`,
12179
+ `${i18nManager.getText("DEFINITION_SWITCHING")} ${definition.showText ?? definition.definition} ...`,
11927
12180
  {
11928
12181
  duration: 2e3,
11929
12182
  closable: true
@@ -12687,21 +12940,21 @@ var __publicField = (obj, key, value) => {
12687
12940
  // 自动播放插件
12688
12941
  UNMUTE: "Click to unmute",
12689
12942
  // 报错
12690
- MANIFEST: "视频解析错误",
12943
+ MANIFEST: "Video parsing error",
12691
12944
  NETWORK: "Network error",
12692
12945
  NETWORK_TIMEOUT: "Network timeout",
12693
- NETWORK_FORBIDDEN: "鉴权异常",
12694
- NETWORK_NOTFOUND: "播放地址不存在",
12695
- DEMUX: "视频解析错误",
12696
- REMUX: "视频解析错误",
12697
- MEDIA: "视频播放发生错误",
12698
- MEDIA_ERR_CODEC_NOT_SUPPORTED: "当前浏览器不支持视频解码",
12699
- MEDIA_ERR_URL_EMPTY: "当前播放地址为空",
12700
- DRM: "权限验证失败",
12701
- OTHER: "其他报错",
12702
- RUNTIME: "视频播放发生错误",
12703
- MODULE_LOAD_ERROR: "插件模块加载异常",
12704
- UNKNOWN: "未知报错"
12946
+ NETWORK_FORBIDDEN: "Authentication error",
12947
+ NETWORK_NOTFOUND: "Stream does not exist",
12948
+ DEMUX: "Video parsing error",
12949
+ REMUX: "Video parsing error",
12950
+ MEDIA: "An error occurred, Please try again",
12951
+ MEDIA_ERR_CODEC_NOT_SUPPORTED: "Audio/video codec is not supported",
12952
+ MEDIA_ERR_URL_EMPTY: "The stream address is not specified",
12953
+ DRM: "Permission verification failed",
12954
+ OTHER: "Unknown error",
12955
+ RUNTIME: "An error occurred, Please try again",
12956
+ MODULE_LOAD_ERROR: "CDN fetch error",
12957
+ UNKNOWN: "Unknown error"
12705
12958
  };
12706
12959
  const ZH_CN$1 = {
12707
12960
  ...ZH.TEXT,
@@ -12720,12 +12973,12 @@ var __publicField = (obj, key, value) => {
12720
12973
  NETWORK_NOTFOUND: "播放地址不存在",
12721
12974
  DEMUX: "视频解析错误",
12722
12975
  REMUX: "视频解析错误",
12723
- MEDIA: "视频播放发生错误",
12724
- MEDIA_ERR_CODEC_NOT_SUPPORTED: "当前浏览器不支持视频解码",
12976
+ MEDIA: "播放异常,请重试",
12977
+ MEDIA_ERR_CODEC_NOT_SUPPORTED: "不支持的音频/视频格式",
12725
12978
  MEDIA_ERR_URL_EMPTY: "当前播放地址为空",
12726
12979
  DRM: "权限验证失败",
12727
12980
  OTHER: "其他报错",
12728
- RUNTIME: "视频播放发生错误",
12981
+ RUNTIME: "播放异常,请重试",
12729
12982
  MODULE_LOAD_ERROR: "插件模块加载异常",
12730
12983
  UNKNOWN: "未知报错"
12731
12984
  };
@@ -12782,21 +13035,6 @@ var __publicField = (obj, key, value) => {
12782
13035
  }
12783
13036
  }
12784
13037
  var veplayerBase = "";
12785
- var Codec = /* @__PURE__ */ ((Codec2) => {
12786
- Codec2["H265"] = "h265";
12787
- Codec2["H264"] = "h264";
12788
- return Codec2;
12789
- })(Codec || {});
12790
- var Degradation = /* @__PURE__ */ ((Degradation2) => {
12791
- Degradation2["SoftFirst"] = "soft-first";
12792
- Degradation2["H264First"] = "h264-first";
12793
- return Degradation2;
12794
- })(Degradation || {});
12795
- var DecodeType = /* @__PURE__ */ ((DecodeType2) => {
12796
- DecodeType2["Software"] = "software";
12797
- DecodeType2["Hardware"] = "hardware";
12798
- return DecodeType2;
12799
- })(DecodeType || {});
12800
13038
  const { POSITIONS: XGPosition } = Plugin;
12801
13039
  const POSITIONS$1 = {
12802
13040
  ...XGPosition,
@@ -12806,7 +13044,7 @@ var __publicField = (obj, key, value) => {
12806
13044
  id: "veplayer",
12807
13045
  width: "100%",
12808
13046
  height: "100%",
12809
- decodeType: "hardware",
13047
+ decodeType: DecodeType.Hardware,
12810
13048
  fullscreen: {
12811
13049
  useCssFullscreen: false
12812
13050
  }
@@ -12834,6 +13072,9 @@ var __publicField = (obj, key, value) => {
12834
13072
  return xgOptions;
12835
13073
  };
12836
13074
  class VePlayerBase {
13075
+ /**
13076
+ * @hidden
13077
+ */
12837
13078
  constructor(options = {}) {
12838
13079
  __publicField(this, "_player");
12839
13080
  __publicField(this, "_sourceManager");
@@ -12881,85 +13122,172 @@ var __publicField = (obj, key, value) => {
12881
13122
  veplayer: this
12882
13123
  });
12883
13124
  this.emit(Events$1.PLAYER_CREATE_FINISH, this._player);
12884
- this._sourceManager.registerPrepare((url) => this.prepare(url));
12885
13125
  this._errorCallback = (err) => this._handleFallback(err);
12886
13126
  this._player.on(ERROR, this._errorCallback);
12887
13127
  }
13128
+ /**
13129
+ * @brief 获取视频的就绪状态,其状态枚举值、枚举名称和说明如下:
13130
+ * - `0`:HAVE_NOTHING,没有关于媒体资源的可用信息
13131
+ * - `1`:HAVE_METADATA,已检索到足够多的媒体资源来初始化元数据, 快进/快退不会引发异常
13132
+ * - `2`:HAVE_CURRENT_DATA,当前播放位置的数据可用,但不足以播放下一帧
13133
+ * - `3`:HAVE_FUTURE_DATA,当前播放位置以及未来至少一小段时间的数据是可用的(至少有两帧以上的数据)
13134
+ * - `4`:HAVE_ENOUGH_DATA,有足够的数据可用,并且下载速率足够,媒体可以不间断地播放到最后
13135
+ */
12888
13136
  get readyState() {
12889
13137
  return this._player.readyState;
12890
13138
  }
13139
+ /**
13140
+ * @brief 获取当前已缓冲的时间范围。
13141
+ */
12891
13142
  get buffered() {
12892
13143
  return this._player.buffered;
12893
13144
  }
13145
+ /**
13146
+ * @brief 获取已经播放的音频/视频的时间范围。
13147
+ */
12894
13148
  get played() {
12895
13149
  return this._player.played;
12896
13150
  }
13151
+ /**
13152
+ * @brief 设置/获取视频当前的播放时间, 单位为 s。
13153
+ */
12897
13154
  get cumulateTime() {
12898
13155
  return this._player.cumulateTime;
12899
13156
  }
13157
+ /**
13158
+ * @brief 获取是否处于焦点状态,处于焦点状态会显示控制栏。
13159
+ */
12900
13160
  get isFocused() {
12901
13161
  return this._player.isActive;
12902
13162
  }
13163
+ /**
13164
+ * @brief 获取播放器是否处于全屏状态。
13165
+ */
12903
13166
  get isFullscreen() {
12904
13167
  return this._player.isFullscreen;
12905
13168
  }
13169
+ /**
13170
+ * @brief 获取播放器是否处于网页全屏状态。
13171
+ */
12906
13172
  get isCssFullscreen() {
12907
13173
  return this._player.isCssfullScreen;
12908
13174
  }
13175
+ /**
13176
+ * @brief 获取视频的网络状态,其状态枚举值、枚举名称和说明如下:
13177
+ * - `0`:NETWORK_EMPTY,目前还没有数据,readyState 的值是 HAVE_NOTHING
13178
+ * - `1`:NETWORK_IDLE,HTMLMediaElement 处于活动状态并已选择资源,但未使用网络
13179
+ * - `2`:NETWORK_LOADING,浏览器正在下载 HTMLMediaElement 数据
13180
+ * - `3`:NETWORK_NO_SOURCE,未找到 HTMLMediaElement src。
13181
+ */
12909
13182
  get networkState() {
12910
13183
  return this._player.networkState;
12911
13184
  }
13185
+ /**
13186
+ * @brief 获取当前视频是否处于暂停状态。
13187
+ */
12912
13188
  get paused() {
12913
13189
  return this._player.paused;
12914
13190
  }
13191
+ /**
13192
+ * @brief 获取当前视频是否播放结束。
13193
+ */
12915
13194
  get ended() {
12916
13195
  return this._player.ended;
12917
13196
  }
13197
+ /**
13198
+ * @brief 获取播放器当前所处的状态,其状态枚举值、枚举名称和说明如下:
13199
+ * - `0`:ERROR,播放出现错误
13200
+ * - `1`:INITIAL,初始化
13201
+ * - `2`:READY,配置/事件/插件等均已经初始化/绑定/实例化完成
13202
+ * - `3`:ATTACHING,进入媒体对象挂载阶段
13203
+ * - `4`:ATTACHED,媒体对象已经挂载到了 DOM 中
13204
+ * - `5`:NOTALLOW,播放被阻止
13205
+ * - `6`:RUNNING,已经成功起播进入播放流程
13206
+ * - `7`:ENDED,播放结束
13207
+ * - `8`:DESTROYED,播放器实例处于已被销毁
13208
+ */
12918
13209
  get state() {
12919
13210
  return this._player.state;
12920
13211
  }
13212
+ /**
13213
+ * 获取当前播放视频的拉流地址。
13214
+ */
12921
13215
  get url() {
12922
13216
  return this._player.config.url;
12923
13217
  }
13218
+ /**
13219
+ * @brief 获取当播放视频的线路名称唯一标识(name)。
13220
+ */
12924
13221
  get source() {
12925
13222
  var _a;
12926
13223
  return (_a = this._sourceManager.source) == null ? void 0 : _a.name;
12927
13224
  }
13225
+ /**
13226
+ * @brief 获取当前播放视频的清晰度唯一标识(definition)。
13227
+ */
12928
13228
  get definition() {
12929
13229
  var _a;
12930
13230
  return (_a = this._sourceManager.definition) == null ? void 0 : _a.definition;
12931
13231
  }
13232
+ /**
13233
+ * @brief 获取和设置播放器的跨域配置信息,更多信息参考 [crossorigin](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/crossorigin) 属性介绍。
13234
+ */
12932
13235
  get crossOrigin() {
12933
13236
  return this._player.crossOrigin;
12934
13237
  }
13238
+ /**
13239
+ * @brief 获取和设置播放器的跨域配置信息,更多信息参考 [crossorigin](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/crossorigin) 属性介绍。
13240
+ */
12935
13241
  set crossOrigin(crossOrigin) {
12936
13242
  this._player.crossOrigin = crossOrigin;
12937
13243
  }
13244
+ /**
13245
+ * @brief 获取和设置视频的音量,取值范围为 [0,1]。
13246
+ */
12938
13247
  // eslint-disable-next-line @typescript-eslint/member-ordering
12939
13248
  get volume() {
12940
13249
  return this._player.volume;
12941
13250
  }
13251
+ /**
13252
+ * @brief 获取和设置视频的音量,取值范围为 [0,1]。
13253
+ */
12942
13254
  set volume(volume) {
12943
13255
  this._player.volume = volume;
12944
13256
  }
13257
+ /**
13258
+ * @brief 获取和设置视频静音状态。
13259
+ * - `true`:静音
13260
+ * - `false`:非静音
13261
+ */
12945
13262
  // eslint-disable-next-line @typescript-eslint/member-ordering
12946
13263
  get muted() {
12947
13264
  return this._player.muted;
12948
13265
  }
13266
+ /**
13267
+ * @brief 获取和设置视频静音状态。
13268
+ * - `true`:静音
13269
+ * - `false`:非静音
13270
+ */
12949
13271
  set muted(isMuted) {
12950
13272
  this._player.muted = isMuted;
12951
13273
  }
13274
+ /**
13275
+ * @brief 获取和设置当前语言。
13276
+ */
12952
13277
  // eslint-disable-next-line @typescript-eslint/member-ordering
12953
13278
  get lang() {
12954
13279
  return this._i18nManager.getLang();
12955
13280
  }
13281
+ /**
13282
+ * @brief 获取和设置当前语言。
13283
+ */
12956
13284
  set lang(lang) {
12957
13285
  var _a, _b;
12958
13286
  if (this._player.lang === lang) {
12959
13287
  return;
12960
13288
  }
12961
13289
  if (!VeI18n.isLangValid(lang)) {
12962
- const langKeys = VeI18n.langKeys().join(",");
13290
+ const langKeys = VeI18n.langKeys.join(",");
12963
13291
  const message = {
12964
13292
  en: `Sorry, we couldn't set the language to ${lang} because it's not currently supported. The list of supported languages includes ${langKeys}.`,
12965
13293
  "zh-cn": `不支持当前设置的语言${lang}, 支持的语言有${langKeys}, 请重新设置`
@@ -12974,8 +13302,11 @@ var __publicField = (obj, key, value) => {
12974
13302
  get _src() {
12975
13303
  return this._player.currentSrc;
12976
13304
  }
13305
+ /**
13306
+ * @hidden
13307
+ */
12977
13308
  static async create(options = {}, Constructor) {
12978
- var _a;
13309
+ var _a, _b, _c;
12979
13310
  const sourceManager = new SourceManager({
12980
13311
  sources: Source.normalize({
12981
13312
  url: options.url,
@@ -12987,18 +13318,28 @@ var __publicField = (obj, key, value) => {
12987
13318
  defaultDefinition: options.defaultDefinition,
12988
13319
  maxFallbackRound: options.maxFallbackRound
12989
13320
  });
13321
+ const prepareResult = await ((_a = options == null ? void 0 : options.preparePlugins) == null ? void 0 : _a.call(
13322
+ options,
13323
+ sourceManager.url ?? ""
13324
+ ));
13325
+ if ((_b = prepareResult == null ? void 0 : prepareResult.options) == null ? void 0 : _b.url) {
13326
+ sourceManager.url = (_c = prepareResult == null ? void 0 : prepareResult.options) == null ? void 0 : _c.url;
13327
+ }
12990
13328
  options.url = sourceManager.url;
12991
- const prepareResult = await ((_a = options == null ? void 0 : options.preparePlugins) == null ? void 0 : _a.call(options, options.url ?? ""));
12992
13329
  return new (Constructor ?? VePlayerBase)({
12993
13330
  ...options,
12994
13331
  prepareResult,
12995
13332
  sourceManager
12996
13333
  });
12997
13334
  }
13335
+ /**
13336
+ * @brief 调用此方法切换拉流地址、线路、清晰度。
13337
+ * @param target 目标地址,可以是播放地址,也可以是线路和清晰度
13338
+ * @param options 更多配置信息
13339
+ */
12998
13340
  async switch(target, options) {
12999
13341
  var _a, _b;
13000
13342
  if (typeof target === "string" && this._sourceManager.sources.length === 1 && ((_b = (_a = this._sourceManager.sources) == null ? void 0 : _a[0].definitions) == null ? void 0 : _b.length) === 1) {
13001
- this._sourceManager.updateSources(target);
13002
13343
  await this._switchUrl(target);
13003
13344
  return this._sourceManager.definition;
13004
13345
  }
@@ -13011,12 +13352,22 @@ var __publicField = (obj, key, value) => {
13011
13352
  await this._switch(targetDefinition);
13012
13353
  return targetDefinition;
13013
13354
  }
13355
+ /**
13356
+ * @brief 调用此方法更新拉流地址列表。
13357
+ * @param playlist 要更新的播放列表。
13358
+ * @param target 更新后默认播放的资源。
13359
+ */
13014
13360
  updatePlaylist(playlist, target) {
13015
13361
  const sourceManager = this._sourceManager.updateSources(playlist, target);
13016
13362
  return this._switch(sourceManager.definition);
13017
13363
  }
13018
13364
  // TODO: 等西瓜播放器完善错误码后增加函数重载以提供更好的类型
13019
- once(event, callback, ...args) {
13365
+ /**
13366
+ * @brief 调用此方法监听指定事件,事件处理函数只执行一次。
13367
+ * @param event 表示事件的名称。
13368
+ * @param callback 表示事件的名称。
13369
+ */
13370
+ once(event, callback) {
13020
13371
  var _a;
13021
13372
  const { xgCallback, xgEventName } = this._transformEvent(event, callback);
13022
13373
  if (xgCallback) {
@@ -13024,27 +13375,45 @@ var __publicField = (obj, key, value) => {
13024
13375
  this._events[event] = /* @__PURE__ */ new Map();
13025
13376
  }
13026
13377
  this._events[event].set(callback, xgCallback);
13027
- this._player.once(xgEventName, xgCallback, ...args);
13378
+ this._player.once(xgEventName, xgCallback);
13028
13379
  }
13029
13380
  }
13030
- off(event, callback, ...args) {
13381
+ /**
13382
+ * @brief 调用此方法解绑或移除指定事件的事件监听。
13383
+ * @param event 表示事件的名称。
13384
+ * @param callback 表示事件的名称。
13385
+ */
13386
+ off(event, callback) {
13031
13387
  var _a;
13032
13388
  const xgCallback = (_a = this._events[event]) == null ? void 0 : _a.get(callback);
13033
13389
  const { xgEventName } = this._transformEvent(event);
13034
13390
  if (xgCallback) {
13035
- this._player.off(xgEventName, xgCallback, ...args);
13391
+ this._player.off(xgEventName, xgCallback);
13036
13392
  this._events[event].delete(callback);
13037
13393
  }
13038
13394
  }
13039
- emit(event, data, ...args) {
13395
+ /**
13396
+ * @brief 调用此方法触发指定事件。
13397
+ * @param event 表示事件的名称。
13398
+ * @param data 事件信息。
13399
+ */
13400
+ emit(event, data) {
13040
13401
  const { xgEventName } = this._transformEvent(event);
13041
- this._player.emit(xgEventName, data, ...args);
13402
+ this._player.emit(xgEventName, data);
13042
13403
  }
13404
+ /**
13405
+ * @brief 调用此方法解绑或移除指定事件的所有事件监听。
13406
+ */
13043
13407
  offAll() {
13044
13408
  this._events = {};
13045
13409
  this._player.offAll();
13046
13410
  }
13047
- on(event, callback, ...args) {
13411
+ /**
13412
+ * @brief 调用此方法监听指定事件。
13413
+ * @param event 事件。
13414
+ * @param callback 事件回调。
13415
+ */
13416
+ on(event, callback) {
13048
13417
  var _a;
13049
13418
  const { xgCallback, xgEventName } = this._transformEvent(event, callback);
13050
13419
  if (xgCallback) {
@@ -13052,56 +13421,105 @@ var __publicField = (obj, key, value) => {
13052
13421
  this._events[event] = /* @__PURE__ */ new Map();
13053
13422
  }
13054
13423
  this._events[event].set(callback, xgCallback);
13055
- this._player.on(xgEventName, xgCallback, ...args);
13424
+ this._player.on(xgEventName, xgCallback);
13056
13425
  }
13057
13426
  }
13427
+ /**
13428
+ * @brief 调用此方法开始播放 。
13429
+ */
13058
13430
  play() {
13059
13431
  /* istanbul ignore next -- @preserve */
13060
13432
  return this._player.play();
13061
13433
  }
13434
+ /**
13435
+ * @brief 调用此方法暂停播放。
13436
+ */
13062
13437
  pause() {
13063
13438
  /* istanbul ignore next -- @preserve */
13064
13439
  return this._player.pause();
13065
13440
  }
13441
+ /**
13442
+ * @brief 调用此方法打开画中画。
13443
+ */
13066
13444
  requestPIP() {
13067
13445
  var _a;
13068
13446
  /* istanbul ignore next -- @preserve */
13069
13447
  (_a = this._player.plugins.pip) == null ? void 0 : _a.requestPIP();
13070
13448
  }
13449
+ /**
13450
+ * @brief 调用此方法关闭画中画。
13451
+ */
13071
13452
  exitPIP() {
13072
13453
  var _a;
13073
13454
  /* istanbul ignore next -- @preserve */
13074
13455
  (_a = this._player.plugins.pip) == null ? void 0 : _a.exitPIP();
13075
13456
  }
13457
+ /**
13458
+ * @brief 调用此方法重新拉流。
13459
+ */
13076
13460
  retry() {
13077
- this._player.emit(Events$1.RETRY);
13078
13461
  return this._player.retry();
13079
13462
  }
13463
+ /**
13464
+ * @brief 播放器获取焦点,调用该方法 `veplayer.isFocused` 将会变为 `true`,并触发 `PLAYER_FOCUS` 事件。
13465
+ * @param data 播放器获取焦点配置信息。
13466
+ */
13080
13467
  focus(data) {
13081
13468
  return this._player.focus(data);
13082
13469
  }
13470
+ /**
13471
+ * @brief 播放器失去焦点,调用该方法 `veplayer.isFocused` 将会变为 `false`,并触发 `PLAYER_BLUR` 事件。
13472
+ * @param data 播放器失去焦点配置信息。
13473
+ */
13083
13474
  blur(data) {
13084
13475
  return this._player.blur(data);
13085
13476
  }
13086
- getFullscreen(el) {
13477
+ /**
13478
+ * @brief 调用此方法进入系统全屏状态。如果该方法调用的时候处于网页全屏状态会自动退出网页全屏,下发事件 `Events.FULLSCREEN_CHANGE`。
13479
+ * @param el 全屏作用的 DOM 节点。
13480
+ */
13481
+ requestFullscreen(el) {
13087
13482
  return this._player.getFullscreen(el);
13088
13483
  }
13484
+ /**
13485
+ * @brief 调用此方法退出系统全屏状态,调用该方法 `veplayer.isFullscreen` 将会变为 `false`,并触发 `Events.FULLSCREEN_CHANGE` 事件。
13486
+ * @param el 全屏作用的 DOM 节点。
13487
+ */
13089
13488
  exitFullscreen(el) {
13090
13489
  return this._player.exitFullscreen(el);
13091
13490
  }
13092
- getCssFullscreen(el) {
13491
+ /**
13492
+ * @brief 调用此方法进入网页样式全屏状态,播放器进入网页全屏,利用 CSS 模拟实现全屏效果。如果该接口调用的时候处于全屏状态,会自动退出全屏,下发事件 `Events.CSS_FULLSCREEN_CHANGE`。
13493
+ * @param el 全屏作用的 DOM 节点。
13494
+ */
13495
+ requestCssFullscreen(el) {
13093
13496
  return this._player.getCssFullscreen(el);
13094
13497
  }
13498
+ /**
13499
+ * @brief 调用此方法退出网页样式全屏状态。 调用该方法 `veplayer.isFullscreen` 将会变为 `false`,并触发 `Events.CSS_FULLSCREEN_CHANGE` 事件。
13500
+ */
13095
13501
  exitCssFullscreen() {
13096
13502
  return this._player.exitCssFullscreen();
13097
13503
  }
13504
+ /**
13505
+ * @brief 调用此方法在当前播放器上注册指定插件。
13506
+ * @param plugin 插件构造函数。
13507
+ * @param config 插件的配置列表。
13508
+ */
13098
13509
  registerPlugin(plugin, config) {
13099
13510
  return this._player.registerPlugin(plugin, config);
13100
13511
  }
13101
- unRegisterPlugin(plugin, removedFromConfig) {
13102
- return this._player.unRegisterPlugin(plugin, removedFromConfig);
13512
+ /**
13513
+ * @brief 调用此方法在当前播放器上销毁/注销指定插件。
13514
+ * @param plugin 插件实例或者插件名称。
13515
+ */
13516
+ unRegisterPlugin(plugin) {
13517
+ return this._player.unRegisterPlugin(plugin);
13103
13518
  }
13104
- // 显示插件
13519
+ /**
13520
+ * @brief 调用此接口显示指定插件图标。
13521
+ * @param pluginNames 插件名称
13522
+ */
13105
13523
  showIcon(pluginNames) {
13106
13524
  const morePlugin = this._player.getPlugin("more");
13107
13525
  pluginNames.forEach((pluginName) => {
@@ -13115,7 +13533,10 @@ var __publicField = (obj, key, value) => {
13115
13533
  }
13116
13534
  });
13117
13535
  }
13118
- // 隐藏插件显示
13536
+ /**
13537
+ * @brief 调用此接口隐藏指定插件图标。
13538
+ * @param pluginNames 插件名称
13539
+ */
13119
13540
  hideIcon(pluginNames) {
13120
13541
  const morePlugin = this._player.getPlugin("more");
13121
13542
  pluginNames.forEach((pluginName) => {
@@ -13129,10 +13550,16 @@ var __publicField = (obj, key, value) => {
13129
13550
  }
13130
13551
  });
13131
13552
  }
13553
+ /**
13554
+ * @brief 调用此方法销毁播放器实例。
13555
+ */
13132
13556
  destroy() {
13133
13557
  this._player.off(ERROR, this._errorCallback);
13134
13558
  this._player.destroy();
13135
13559
  }
13560
+ /**
13561
+ * @hidden
13562
+ */
13136
13563
  async prepare(url) {
13137
13564
  var _a, _b;
13138
13565
  const result = await ((_a = this._preparePlugins) == null ? void 0 : _a.call(this, url));
@@ -13148,9 +13575,12 @@ var __publicField = (obj, key, value) => {
13148
13575
  if (result == null ? void 0 : result.options) {
13149
13576
  this._player.setConfig(result.options);
13150
13577
  }
13151
- return addedPlugins.map((plugin) => {
13152
- return this._player.registerPlugin(plugin);
13153
- });
13578
+ return {
13579
+ plugins: addedPlugins.map((plugin) => {
13580
+ return this._player.registerPlugin(plugin);
13581
+ }),
13582
+ options: result == null ? void 0 : result.options
13583
+ };
13154
13584
  }
13155
13585
  async _handleFallback(err) {
13156
13586
  this._player.addClass(STATE_CLASS.ENTER);
@@ -13185,7 +13615,10 @@ var __publicField = (obj, key, value) => {
13185
13615
  async _switch(targetDefinition) {
13186
13616
  var _a, _b, _c, _d, _e, _f;
13187
13617
  const preDefinition = clonedeep(this._sourceManager.definition);
13188
- const newPlugins = await this.prepare(targetDefinition.url);
13618
+ const { plugins: newPlugins, options } = await this.prepare(targetDefinition.url) || {};
13619
+ if (options == null ? void 0 : options.url) {
13620
+ targetDefinition.url = options == null ? void 0 : options.url;
13621
+ }
13189
13622
  this._sourceManager.switch(targetDefinition);
13190
13623
  (_b = (_a = this._player) == null ? void 0 : _a.plugins) == null ? void 0 : _b.sources.renderItemList();
13191
13624
  (_d = (_c = this._player) == null ? void 0 : _c.plugins) == null ? void 0 : _d.definition.renderItemList();
@@ -13201,11 +13634,13 @@ var __publicField = (obj, key, value) => {
13201
13634
  }
13202
13635
  }
13203
13636
  async _switchUrl(url) {
13204
- const newPlugins = await this.prepare(url);
13637
+ const { plugins: newPlugins, options } = await this.prepare(url) || {};
13638
+ const newUrl = (options == null ? void 0 : options.url) ?? url;
13639
+ this._sourceManager.updateSources(newUrl);
13205
13640
  if (newPlugins == null ? void 0 : newPlugins.length) {
13206
- this._callBeforePlayerInitForUrl(newPlugins, url);
13641
+ this._callBeforePlayerInitForUrl(newPlugins, newUrl);
13207
13642
  } else {
13208
- const res = this._player.switchURL(url, false);
13643
+ const res = this._player.switchURL(newUrl, false);
13209
13644
  const curTime = this._player.currentTime;
13210
13645
  if (res && res.then) {
13211
13646
  return res;
@@ -17759,7 +18194,7 @@ var __publicField = (obj, key, value) => {
17759
18194
  let mseStrategy;
17760
18195
  let softStrategy;
17761
18196
  const codec = await getCodec(options);
17762
- const isSoftDecode$1 = codec === "unknown" ? false : await isSoftDecode({ ...options, codec });
18197
+ const isSoftDecode$1 = await isSoftDecode(options, codec);
17763
18198
  if (isSoftDecode$1) {
17764
18199
  softStrategy = codec === Codec.H265 ? createSoftDecodeH265Strategy() : createSoftDecodeH264Strategy();
17765
18200
  mseStrategy = createFlvMseStrategy(options);
@@ -17786,7 +18221,7 @@ var __publicField = (obj, key, value) => {
17786
18221
  let mseStrategy;
17787
18222
  let softStrategy;
17788
18223
  const codec = await getCodec(options);
17789
- const isSoftDecode$1 = codec === "unknown" ? false : await isSoftDecode({ ...options, codec });
18224
+ const isSoftDecode$1 = await isSoftDecode(options, codec);
17790
18225
  if (isSoftDecode$1) {
17791
18226
  softStrategy = codec === Codec.H265 ? createSoftDecodeH265Strategy() : createSoftDecodeH264Strategy();
17792
18227
  mseStrategy = createHlsMseStrategy(options);
@@ -17892,10 +18327,13 @@ var __publicField = (obj, key, value) => {
17892
18327
  return "unknown";
17893
18328
  }
17894
18329
  }
17895
- async function isSoftDecode(options) {
18330
+ async function isSoftDecode(options, currentCodec) {
17896
18331
  if (options.decodeType === DecodeType.Software) {
17897
18332
  return true;
17898
18333
  }
18334
+ if (currentCodec === "unknown") {
18335
+ return false;
18336
+ }
17899
18337
  const codec = await getCodec(options);
17900
18338
  if (codec === Codec.H265) {
17901
18339
  if (sniffer$1.isHevcSupported()) {
@@ -17915,7 +18353,7 @@ var __publicField = (obj, key, value) => {
17915
18353
  }
17916
18354
  const { VeError } = error$1;
17917
18355
  var LiveErrorCode = /* @__PURE__ */ ((LiveErrorCode2) => {
17918
- LiveErrorCode2[LiveErrorCode2["INVALID_PARAMETER"] = 200] = "INVALID_PARAMETER";
18356
+ LiveErrorCode2[LiveErrorCode2["INVALID_PARAMETER"] = 210] = "INVALID_PARAMETER";
17919
18357
  return LiveErrorCode2;
17920
18358
  })(LiveErrorCode || {});
17921
18359
  const ErrorCode = {
@@ -17925,7 +18363,7 @@ var __publicField = (obj, key, value) => {
17925
18363
  const ERRORS = {
17926
18364
  ...ERROR_INFO,
17927
18365
  [
17928
- 200
18366
+ 210
17929
18367
  /* INVALID_PARAMETER */
17930
18368
  ]: {
17931
18369
  messageTextKey: "INVALID_PARAMETER",
@@ -17935,15 +18373,34 @@ var __publicField = (obj, key, value) => {
17935
18373
  function create(errorCode, i18n) {
17936
18374
  return new VeError(ERRORS[errorCode], i18n);
17937
18375
  }
18376
+ async function isRTMSupported() {
18377
+ const Rtm = await load(DynamicModule.PluginRtm);
18378
+ return Rtm.isSupported();
18379
+ }
18380
+ async function isRTMSupportCodec(codec = RTMCodec.H264) {
18381
+ const Rtm = await load(DynamicModule.PluginRtm);
18382
+ if (codec === RTMCodec.H264)
18383
+ return Rtm.isSupportedH264();
18384
+ return false;
18385
+ }
17938
18386
  const rtmStrategy = {
17939
18387
  options: {},
17940
18388
  module: DynamicModule.PluginRtm
17941
18389
  };
17942
- const getRtmStrategy = async (options) => {
18390
+ const generateFallbackUrl = (url) => {
18391
+ if (sniffer$1.device === "pc") {
18392
+ return url.replace(".sdp", ".flv");
18393
+ } else {
18394
+ return url.replace(".sdp", ".m3u8");
18395
+ }
18396
+ };
18397
+ const getRtmStrategy = async (options, player) => {
17943
18398
  var _a;
17944
18399
  let backupStrategy;
17945
- const { fallbackUrl, ...ret } = options.rtm || {};
17946
- const backupType = fallbackUrl && util.getStreamType(fallbackUrl);
18400
+ const { url } = options;
18401
+ const { fallbackUrl, enableFallback = true, ...ret } = options.rtm || {};
18402
+ const actualFallbackUrl = !enableFallback ? "" : !fallbackUrl && url ? generateFallbackUrl(url) : fallbackUrl;
18403
+ const backupType = actualFallbackUrl && util.getStreamType(actualFallbackUrl);
17947
18404
  if (backupType === "flv" && util.isMseSupported(Codec.H264)) {
17948
18405
  backupStrategy = createFlvMseStrategy(options);
17949
18406
  } else if (backupType === "hls" && (sniffer$1.device !== "mobile" || ((_a = options == null ? void 0 : options.hls) == null ? void 0 : _a.enableMSE)) && util.isMseSupported(Codec.H264)) {
@@ -17953,39 +18410,55 @@ var __publicField = (obj, key, value) => {
17953
18410
  load(rtmStrategy.module).catch(() => void 0),
17954
18411
  backupStrategy && load(backupStrategy.module).catch(() => void 0)
17955
18412
  ]);
18413
+ const [RTMSupported, RTMSupportCodec] = await Promise.all([
18414
+ isRTMSupported(),
18415
+ isRTMSupportCodec()
18416
+ ]);
18417
+ if (!RTMSupported || !RTMSupportCodec) {
18418
+ if (player) {
18419
+ player.emit("degrade", {
18420
+ url: actualFallbackUrl,
18421
+ originRtmUrl: url,
18422
+ code: "NOT_SUPPORT",
18423
+ message: "not support rtm or h264",
18424
+ isRTMSupported: RTMSupported,
18425
+ isRTMSupportCodec: RTMSupportCodec
18426
+ });
18427
+ }
18428
+ return {
18429
+ options: {
18430
+ ...(backupStrategy == null ? void 0 : backupStrategy.options) || {},
18431
+ url: actualFallbackUrl,
18432
+ _RTMdegrade: {
18433
+ _originRtmUrl: url,
18434
+ _isRTMSupported: RTMSupported,
18435
+ _isRTMSupportCodec: RTMSupportCodec
18436
+ }
18437
+ },
18438
+ plugins: backupCdn ? [backupCdn] : []
18439
+ };
18440
+ }
17956
18441
  return {
17957
18442
  options: {
17958
18443
  ...(backupStrategy == null ? void 0 : backupStrategy.options) || {},
18444
+ _RTMdegrade: void 0,
17959
18445
  rts: {
17960
18446
  retryCount: 0,
17961
18447
  ...ret,
17962
- backupURL: fallbackUrl,
18448
+ backupURL: actualFallbackUrl,
17963
18449
  backupConstruct: backupCdn
17964
18450
  }
17965
18451
  },
17966
18452
  plugins: rtmCdn ? [rtmCdn] : []
17967
18453
  };
17968
18454
  };
17969
- var RTMCodec = /* @__PURE__ */ ((RTMCodec2) => {
17970
- RTMCodec2["H264"] = "h264";
17971
- return RTMCodec2;
17972
- })(RTMCodec || {});
17973
- const isRTMSupported = async () => {
17974
- const Rtm = await load(DynamicModule.PluginRtm);
17975
- return Rtm.isSupported();
17976
- };
17977
- const isRTMSupportCodec = async (codec = "h264", options) => {
17978
- const Rtm = await load(DynamicModule.PluginRtm);
17979
- if (codec === "h264")
17980
- return Rtm.isSupportedH264(options == null ? void 0 : options.targetProfileLevel);
17981
- };
17982
- const getTypeStrategy = async (options) => {
18455
+ const getTypeStrategy = async (options, player) => {
17983
18456
  const type = options.url ? util.getStreamType(options.url) : "";
17984
18457
  if (!type || type === "unknown") {
17985
18458
  return { options: {}, plugins: [] };
17986
18459
  }
17987
18460
  if (type === "rtm") {
17988
- return await getRtmStrategy(options);
18461
+ return await getRtmStrategy(options, player);
17989
18462
  }
17990
18463
  if (type === "flv") {
17991
18464
  return await getFlvStrategy(options);
@@ -18433,9 +18906,9 @@ var __publicField = (obj, key, value) => {
18433
18906
  function isCodecSupport(codec) {
18434
18907
  return typeof MediaSource !== "undefined" ? +MediaSource.isTypeSupported("video/mp4; codecs=" + codec) : 0;
18435
18908
  }
18436
- function getUrlQuery(url, key) {
18909
+ function getUrlQuery(url, key, key2) {
18437
18910
  var x2 = new URLSearchParams(url.split("?")[1]);
18438
- return x2.get(key);
18911
+ return x2.get(key) || x2.get(key2);
18439
18912
  }
18440
18913
  function getDeviceInfo() {
18441
18914
  var res = {
@@ -18462,19 +18935,11 @@ var __publicField = (obj, key, value) => {
18462
18935
  return player.plugins.hls;
18463
18936
  } else if (player.plugins.rts) {
18464
18937
  return player.plugins.rts;
18465
- } else if (player.plugins.flvlive) {
18466
- return player.plugins.flvlive;
18467
- } else if (player.plugins.hlslive) {
18468
- return player.plugins.hlslive;
18469
- } else if (player.plugins.hlsvod) {
18470
- return player.plugins.hlsvod;
18471
- } else if (player.plugins.hlslivemobile) {
18472
- return player.plugins.hlslivemobile;
18473
- } else if (player.plugins.flvlivemobile) {
18474
- return player.plugins.flvlivemobile;
18938
+ } else if (player.plugins.rtm) {
18939
+ return player.plugins.rtm;
18475
18940
  }
18476
18941
  }
18477
- return player.newHls || player.newFlv || player.__core__ || player.flv;
18942
+ return null;
18478
18943
  }
18479
18944
  function getDefaultOptions(options) {
18480
18945
  return {
@@ -18703,7 +19168,7 @@ var __publicField = (obj, key, value) => {
18703
19168
  live_sdk_version: getPlayerCore(player) || player.hlsOps ? "2" : "-1",
18704
19169
  player_sdk_version: player.version,
18705
19170
  // eslint-disable-next-line no-undef
18706
- logger_version: "1.1.0-alpha.5",
19171
+ logger_version: "1.1.0-alpha.7",
18707
19172
  // 由rollup 在编译时注入
18708
19173
  report_version: "5",
18709
19174
  product_line: options.product_line,
@@ -18827,9 +19292,13 @@ var __publicField = (obj, key, value) => {
18827
19292
  if (this._player.video) {
18828
19293
  log.play_current_time = this._player.currentTime;
18829
19294
  }
18830
- log.cdn_play_url = url && url.startsWith("//") ? window.location.protocol + url : url;
18831
- log.live_stream_session_id = getUrlQuery(url, "session_id");
18832
- log.play_format = getPlayFormat(url);
19295
+ if (this.core && this.core.loader && this.core.loader.finnalUrl) {
19296
+ log.cdn_play_url = this.core.loader.finnalUrl;
19297
+ } else {
19298
+ log.cdn_play_url = url && url.startsWith("//") ? window.location.protocol + url : url;
19299
+ }
19300
+ log.live_stream_session_id = getUrlQuery(log.cdn_play_url, "_session_id", "session_id");
19301
+ log.play_format = getPlayFormat(log.cdn_play_url);
18833
19302
  log.timestamp = getCurrentTime();
18834
19303
  var _getDeviceInfo = getDeviceInfo(), cpu_core_number = _getDeviceInfo.cpu_core_number, memory_usage = _getDeviceInfo.memory_usage, network_downlink = _getDeviceInfo.network_downlink;
18835
19304
  log.cpu_core_number = cpu_core_number;
@@ -19055,6 +19524,11 @@ var __publicField = (obj, key, value) => {
19055
19524
  };
19056
19525
  _proto2.reportStartPlay = function reportStartPlay() {
19057
19526
  if (!this.started) {
19527
+ this.core = getPlayerCore(this.player);
19528
+ if (this.core) {
19529
+ this.commonParams.live_sdk_version = "2";
19530
+ this.logmanager.core = this.core;
19531
+ }
19058
19532
  this.started = true;
19059
19533
  this.log.start_play.start_play_time = this.log.start_play.timestamp = getCurrentTime();
19060
19534
  this.logmanager.push(this.log.start_play, true);
@@ -19319,6 +19793,7 @@ var __publicField = (obj, key, value) => {
19319
19793
  this.core = getPlayerCore(this.player);
19320
19794
  if (this.core) {
19321
19795
  this.commonParams.live_sdk_version = "2";
19796
+ this.logmanager.core = this.core;
19322
19797
  }
19323
19798
  if (this.player.config.autoplay || this.player.config.videoInit) {
19324
19799
  this.reportStartPlay();
@@ -20571,6 +21046,45 @@ var __publicField = (obj, key, value) => {
20571
21046
  this.event("predefine_pageview", n2);
20572
21047
  }, t2;
20573
21048
  }(), q = new R("default");
21049
+ let getRandomValues;
21050
+ const rnds8 = new Uint8Array(16);
21051
+ function rng() {
21052
+ if (!getRandomValues) {
21053
+ getRandomValues = typeof crypto !== "undefined" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);
21054
+ if (!getRandomValues) {
21055
+ throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
21056
+ }
21057
+ }
21058
+ return getRandomValues(rnds8);
21059
+ }
21060
+ const byteToHex = [];
21061
+ for (let i2 = 0; i2 < 256; ++i2) {
21062
+ byteToHex.push((i2 + 256).toString(16).slice(1));
21063
+ }
21064
+ function unsafeStringify(arr, offset = 0) {
21065
+ return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];
21066
+ }
21067
+ const randomUUID = typeof crypto !== "undefined" && crypto.randomUUID && crypto.randomUUID.bind(crypto);
21068
+ var native = {
21069
+ randomUUID
21070
+ };
21071
+ function v4(options, buf, offset) {
21072
+ if (native.randomUUID && !buf && !options) {
21073
+ return native.randomUUID();
21074
+ }
21075
+ options = options || {};
21076
+ const rnds = options.random || (options.rng || rng)();
21077
+ rnds[6] = rnds[6] & 15 | 64;
21078
+ rnds[8] = rnds[8] & 63 | 128;
21079
+ if (buf) {
21080
+ offset = offset || 0;
21081
+ for (let i2 = 0; i2 < 16; ++i2) {
21082
+ buf[offset + i2] = rnds[i2];
21083
+ }
21084
+ return buf;
21085
+ }
21086
+ return unsafeStringify(rnds);
21087
+ }
20574
21088
  const DEVICE_ID_KEY = "veplayer_live_device_id";
20575
21089
  const USER_ID_Key = "veplayer_live_user_id";
20576
21090
  const genRandomID = (length) => {
@@ -20596,6 +21110,45 @@ var __publicField = (obj, key, value) => {
20596
21110
  localStorage.setItem(USER_ID_Key, userId);
20597
21111
  return userId;
20598
21112
  };
21113
+ const generateUrlWithSessionId = (url) => {
21114
+ var _a, _b;
21115
+ if (!url) {
21116
+ return "";
21117
+ }
21118
+ const withoutProtocol = url.startsWith("//");
21119
+ if (withoutProtocol) {
21120
+ url = location.protocol + url;
21121
+ }
21122
+ try {
21123
+ const urlObject = new URL(url);
21124
+ if ((_a = urlObject == null ? void 0 : urlObject.searchParams) == null ? void 0 : _a.get("_session_id")) {
21125
+ return url;
21126
+ }
21127
+ (_b = urlObject == null ? void 0 : urlObject.searchParams) == null ? void 0 : _b.append("_session_id", generateSessionId());
21128
+ return urlObject.toString();
21129
+ } catch (error2) {
21130
+ return url;
21131
+ }
21132
+ };
21133
+ const hashCode = (str) => {
21134
+ str += "";
21135
+ let h2 = 0;
21136
+ let off = 0;
21137
+ const len = str.length;
21138
+ for (let i2 = 0; i2 < len; i2++) {
21139
+ h2 = 31 * h2 + str.charCodeAt(off++);
21140
+ if (h2 > 140737488355327 || h2 < -140737488355328) {
21141
+ h2 &= 281474976710655;
21142
+ }
21143
+ }
21144
+ if (h2 < 0) {
21145
+ h2 += 2251799813685247;
21146
+ }
21147
+ return h2;
21148
+ };
21149
+ const generateSessionId = () => {
21150
+ return v4().replace(/-/g, "") + "." + Date.now() + "." + hashCode(v4().replace(/-/g, ""));
21151
+ };
20599
21152
  const CN_APPID = 468759;
20600
21153
  const CHANNEL = "cn";
20601
21154
  const CHANNEL_DOMAIN = "//mcs.volceapplog.com";
@@ -20674,10 +21227,10 @@ var __publicField = (obj, key, value) => {
20674
21227
  user_id: this._userId,
20675
21228
  device_id: this._deviceId,
20676
21229
  ext: {
20677
- veplayer_version: "2.0.0-rc.1",
20678
- flv_version: "3.0.0-next.23",
20679
- hls_version: "3.0.0-next.36-1",
20680
- rts_version: "0.2.0-alpha.3"
21230
+ veplayer_version: "2.1.0-rc.0",
21231
+ flv_version: "3.0.10-alpha.4",
21232
+ hls_version: "3.0.10-alpha.4",
21233
+ rts_version: "0.2.0-alpha.5"
20681
21234
  }
20682
21235
  });
20683
21236
  }
@@ -20954,25 +21507,51 @@ var __publicField = (obj, key, value) => {
20954
21507
  autoplay: { muted: true }
20955
21508
  };
20956
21509
  const LIVE_DEFAULT_PLUGINS = [...DEFAULT_PLUGINS, Refresh, Logger, InfoPanel];
21510
+ var RTMCodec = /* @__PURE__ */ ((RTMCodec2) => {
21511
+ RTMCodec2["H264"] = "h264";
21512
+ return RTMCodec2;
21513
+ })(RTMCodec || {});
20957
21514
  class VePlayerLive extends VePlayerBase {
21515
+ /**
21516
+ * @hidden
21517
+ * @param options
21518
+ */
21519
+ constructor(options) {
21520
+ super(options);
21521
+ }
21522
+ /** {zh}
21523
+ * @brief 调用此方法开启直播日志上报。
21524
+ */
20958
21525
  openLog() {
20959
21526
  var _a;
20960
21527
  (_a = this._player.plugins) == null ? void 0 : _a.logger.open();
20961
21528
  }
21529
+ /** {zh}
21530
+ * @brief 调用此方法关闭直播日志上报。
21531
+ */
20962
21532
  closeLog() {
20963
21533
  var _a;
20964
21534
  (_a = this._player.plugins) == null ? void 0 : _a.logger.close();
20965
21535
  }
21536
+ /** {zh}
21537
+ * @brief 调用此方法将打开直播信息面板,面板将展示拉流格式、帧率、码率、GOP、视频分辨率、编码方式、Buffer 水位、播放进度等基础信息。如果当前是软解,还会显示软解解码效率和解码消耗。
21538
+ */
20966
21539
  openInfoPanel() {
20967
21540
  var _a;
20968
21541
  (_a = this._player.plugins) == null ? void 0 : _a.infopanel.open();
20969
21542
  }
21543
+ /** {zh}
21544
+ * @brief 调用此方法关闭直播信息面板。
21545
+ *
21546
+ */
20970
21547
  closeInfoPanel() {
20971
21548
  var _a;
20972
21549
  (_a = this._player.plugins) == null ? void 0 : _a.infopanel.close();
20973
21550
  }
20974
21551
  }
20975
21552
  async function createLivePlayer(options) {
21553
+ var _a, _b;
21554
+ let player = void 0;
20976
21555
  if (!options || !options.url && !options.playlist) {
20977
21556
  throw create(ErrorCode.INVALID_PARAMETER, new VeI18n());
20978
21557
  }
@@ -20981,18 +21560,35 @@ var __publicField = (obj, key, value) => {
20981
21560
  ...options,
20982
21561
  plugins: [...LIVE_DEFAULT_PLUGINS, ...options.plugins ?? []]
20983
21562
  };
20984
- const player = await VePlayerBase.create(
21563
+ player = await VePlayerBase.create(
20985
21564
  {
20986
21565
  ...LIVE_DEFAULT_OPTIONS,
20987
21566
  ...finalOptions,
20988
21567
  isLive: true,
20989
21568
  i18nManager: i18n,
21569
+ preProcessUrl: (url) => {
21570
+ return {
21571
+ url: generateUrlWithSessionId(url)
21572
+ };
21573
+ },
20990
21574
  async preparePlugins(url) {
20991
- return getTypeStrategy({ ...finalOptions, url });
21575
+ return getTypeStrategy({ ...finalOptions, url }, player);
20992
21576
  }
20993
21577
  },
20994
21578
  VePlayerLive
20995
21579
  );
21580
+ if (player) {
21581
+ const RTMDegrade = (_b = (_a = player == null ? void 0 : player._player) == null ? void 0 : _a.config) == null ? void 0 : _b._RTMdegrade;
21582
+ if (RTMDegrade) {
21583
+ player.emit("degrade", {
21584
+ originRtmUrl: RTMDegrade._originRtmUrl,
21585
+ code: "NOT_SUPPORT",
21586
+ message: "not support rtm or h264",
21587
+ isRTMSupported: RTMDegrade._isRTMSupported,
21588
+ isRTMSupportCodec: RTMDegrade._isRTMSupportCodec
21589
+ });
21590
+ }
21591
+ }
20996
21592
  return player;
20997
21593
  }
20998
21594
  var live = /* @__PURE__ */ Object.freeze({