stormcloud-video-player 0.7.8 → 0.7.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -367,7 +367,7 @@ function _ts_values(o) {
367
367
  throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
368
368
  }
369
369
  // src/ui/StormcloudVideoPlayer.tsx
370
- import React2, { useEffect as useEffect2, useRef as useRef2, useMemo, useCallback as useCallback2 } from "react";
370
+ import React2, { useEffect as useEffect2, useRef as useRef2, useMemo as useMemo2, useCallback as useCallback2 } from "react";
371
371
  // src/player/StormcloudVideoPlayer.ts
372
372
  import Hls from "hls.js";
373
373
  // src/sdk/vastParser.ts
@@ -6016,7 +6016,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
6016
6016
  // src/ui/StormcloudVideoPlayer.tsx
6017
6017
  import { FaPlay, FaPause, FaVolumeUp, FaVolumeMute, FaVolumeDown, FaExpand, FaCompress, FaCog, FaTimes } from "react-icons/fa";
6018
6018
  // src/ui/OverlayRenderer.tsx
6019
- import React, { useEffect, useRef, useState, useCallback } from "react";
6019
+ import React, { useEffect, useRef, useState, useCallback, useMemo } from "react";
6020
6020
  // src/utils/overlays.ts
6021
6021
  var OVERLAY_API_BASE = "https://adstorm.co/api-adstorm-dev";
6022
6022
  function timeStringToSeconds(timeStr) {
@@ -6341,15 +6341,38 @@ function ScoreBugOverlay(param) {
6341
6341
  })
6342
6342
  ]
6343
6343
  }),
6344
- cfg.sponsorText && /* @__PURE__ */ jsx("div", {
6344
+ (cfg.sponsorText || cfg.sponsorImageUrl) && /* @__PURE__ */ jsxs("div", {
6345
6345
  style: {
6346
6346
  fontSize: "0.7em",
6347
6347
  textAlign: "center",
6348
- opacity: 0.5,
6349
- padding: "".concat(f * 0.2, "px 0"),
6350
- borderTop: "1px solid ".concat(cfg.accentColor, "40")
6348
+ opacity: 0.6,
6349
+ padding: "".concat(f * 0.2, "px ").concat(f * 0.4, "px"),
6350
+ borderTop: "1px solid ".concat(cfg.accentColor, "40"),
6351
+ display: "flex",
6352
+ alignItems: "center",
6353
+ justifyContent: "center",
6354
+ gap: f * 0.4,
6355
+ overflow: "hidden"
6351
6356
  },
6352
- children: cfg.sponsorText
6357
+ children: [
6358
+ cfg.sponsorImageUrl && /* @__PURE__ */ jsx("img", {
6359
+ src: cfg.sponsorImageUrl,
6360
+ alt: "sponsor",
6361
+ style: {
6362
+ height: "".concat(f * 1.4, "px"),
6363
+ objectFit: "contain",
6364
+ flexShrink: 0
6365
+ }
6366
+ }),
6367
+ cfg.sponsorText && /* @__PURE__ */ jsx("span", {
6368
+ style: {
6369
+ overflow: "hidden",
6370
+ textOverflow: "ellipsis",
6371
+ whiteSpace: "nowrap"
6372
+ },
6373
+ children: cfg.sponsorText
6374
+ })
6375
+ ]
6353
6376
  })
6354
6377
  ]
6355
6378
  });
@@ -6411,13 +6434,35 @@ function LowerThirdOverlay(param) {
6411
6434
  })
6412
6435
  ]
6413
6436
  }),
6414
- cfg.sponsorText && /* @__PURE__ */ jsx("div", {
6437
+ (cfg.sponsorText || cfg.sponsorImageUrl) && /* @__PURE__ */ jsxs("div", {
6415
6438
  style: {
6416
6439
  fontSize: "0.7em",
6417
- opacity: 0.4,
6418
- padding: "0 ".concat(f * 1.2, "px ").concat(f * 0.4, "px")
6440
+ opacity: 0.5,
6441
+ padding: "0 ".concat(f * 1.2, "px ").concat(f * 0.4, "px"),
6442
+ display: "flex",
6443
+ alignItems: "center",
6444
+ gap: f * 0.4,
6445
+ overflow: "hidden"
6419
6446
  },
6420
- children: cfg.sponsorText
6447
+ children: [
6448
+ cfg.sponsorImageUrl && /* @__PURE__ */ jsx("img", {
6449
+ src: cfg.sponsorImageUrl,
6450
+ alt: "sponsor",
6451
+ style: {
6452
+ height: "".concat(f * 1.4, "px"),
6453
+ objectFit: "contain",
6454
+ flexShrink: 0
6455
+ }
6456
+ }),
6457
+ cfg.sponsorText && /* @__PURE__ */ jsx("span", {
6458
+ style: {
6459
+ overflow: "hidden",
6460
+ textOverflow: "ellipsis",
6461
+ whiteSpace: "nowrap"
6462
+ },
6463
+ children: cfg.sponsorText
6464
+ })
6465
+ ]
6421
6466
  })
6422
6467
  ]
6423
6468
  });
@@ -6574,6 +6619,23 @@ function ComingUpNextOverlay(param) {
6574
6619
  children: cfg.scheduledTime
6575
6620
  })
6576
6621
  ]
6622
+ }),
6623
+ cfg.thumbnailUrl && /* @__PURE__ */ jsx("div", {
6624
+ style: {
6625
+ flexShrink: 0,
6626
+ width: Math.max(40, size.h * 0.75),
6627
+ overflow: "hidden"
6628
+ },
6629
+ children: /* @__PURE__ */ jsx("img", {
6630
+ src: cfg.thumbnailUrl,
6631
+ alt: "thumbnail",
6632
+ style: {
6633
+ width: "100%",
6634
+ height: "100%",
6635
+ objectFit: "cover",
6636
+ display: "block"
6637
+ }
6638
+ })
6577
6639
  })
6578
6640
  ]
6579
6641
  });
@@ -6809,35 +6871,41 @@ function BreakingNewsOverlay(param) {
6809
6871
  ]
6810
6872
  });
6811
6873
  }
6874
+ function calcCountdownRemaining(targetTime) {
6875
+ var diff = Math.max(0, new Date(targetTime).getTime() - Date.now());
6876
+ return {
6877
+ d: Math.floor(diff / 864e5),
6878
+ h: Math.floor(diff % 864e5 / 36e5),
6879
+ m: Math.floor(diff % 36e5 / 6e4),
6880
+ s: Math.floor(diff % 6e4 / 1e3),
6881
+ expired: diff === 0
6882
+ };
6883
+ }
6812
6884
  function CountdownOverlay(param) {
6813
6885
  var overlay = param.overlay, size = param.size;
6886
+ var _ref;
6814
6887
  var cfg = parseConfig(overlay.content);
6815
- var _useState = _sliced_to_array(useState({
6816
- d: 0,
6817
- h: 0,
6818
- m: 0,
6819
- s: 0
6888
+ var targetTime = (_ref = cfg === null || cfg === void 0 ? void 0 : cfg.targetTime) !== null && _ref !== void 0 ? _ref : "";
6889
+ var _useState = _sliced_to_array(useState(function() {
6890
+ return targetTime ? calcCountdownRemaining(targetTime) : {
6891
+ d: 0,
6892
+ h: 0,
6893
+ m: 0,
6894
+ s: 0,
6895
+ expired: false
6896
+ };
6820
6897
  }), 2), remaining = _useState[0], setRemaining = _useState[1];
6821
6898
  useEffect(function() {
6822
- if (!cfg) return;
6823
- var update = function update() {
6824
- var target = new Date(cfg.targetTime).getTime();
6825
- var now = Date.now();
6826
- var diff = Math.max(0, target - now);
6827
- setRemaining({
6828
- d: Math.floor(diff / 864e5),
6829
- h: Math.floor(diff % 864e5 / 36e5),
6830
- m: Math.floor(diff % 36e5 / 6e4),
6831
- s: Math.floor(diff % 6e4 / 1e3)
6832
- });
6833
- };
6834
- update();
6835
- var id = setInterval(update, 1e3);
6899
+ if (!targetTime) return;
6900
+ setRemaining(calcCountdownRemaining(targetTime));
6901
+ var id = setInterval(function() {
6902
+ return setRemaining(calcCountdownRemaining(targetTime));
6903
+ }, 1e3);
6836
6904
  return function() {
6837
6905
  return clearInterval(id);
6838
6906
  };
6839
6907
  }, [
6840
- cfg === null || cfg === void 0 ? void 0 : cfg.targetTime
6908
+ targetTime
6841
6909
  ]);
6842
6910
  if (!cfg) return null;
6843
6911
  var f = Math.max(6, size.w * 0.055);
@@ -6896,7 +6964,14 @@ function CountdownOverlay(param) {
6896
6964
  },
6897
6965
  children: cfg.eventName
6898
6966
  }),
6899
- /* @__PURE__ */ jsx("div", {
6967
+ remaining.expired ? /* @__PURE__ */ jsx("div", {
6968
+ style: {
6969
+ fontSize: "1em",
6970
+ fontWeight: 700,
6971
+ opacity: 0.6
6972
+ },
6973
+ children: cfg.message || "Event ended"
6974
+ }) : /* @__PURE__ */ jsx("div", {
6900
6975
  style: {
6901
6976
  display: "flex",
6902
6977
  gap: f * 0.6,
@@ -6945,7 +7020,7 @@ function CountdownOverlay(param) {
6945
7020
  }, u.label);
6946
7021
  })
6947
7022
  }),
6948
- cfg.message && /* @__PURE__ */ jsx("div", {
7023
+ !remaining.expired && cfg.message && /* @__PURE__ */ jsx("div", {
6949
7024
  style: {
6950
7025
  fontSize: "0.8em",
6951
7026
  opacity: 0.6,
@@ -6990,10 +7065,13 @@ function hexToRgb(hex) {
6990
7065
  var num = parseInt(clean.length === 3 ? clean.replace(/./g, "$&$&") : clean, 16);
6991
7066
  return "".concat(num >> 16 & 255, ",").concat(num >> 8 & 255, ",").concat(num & 255);
6992
7067
  }
7068
+ var FADE_DURATION_MS = 1e3;
6993
7069
  var OverlayRenderer = function OverlayRenderer(param) {
6994
7070
  var overlays = param.overlays, currentTime = param.currentTime, videoRef = param.videoRef, coordinateSpace = param.coordinateSpace;
6995
7071
  var _useState = _sliced_to_array(useState(null), 2), dims = _useState[0], setDims = _useState[1];
6996
7072
  var rafRef = useRef(null);
7073
+ var _useState1 = _sliced_to_array(useState(/* @__PURE__ */ new Map()), 2), fadeMap = _useState1[0], setFadeMap = _useState1[1];
7074
+ var removeTimers = useRef(/* @__PURE__ */ new Map());
6997
7075
  var updateDims = useCallback(function() {
6998
7076
  var video = videoRef.current;
6999
7077
  if (video) {
@@ -7024,10 +7102,181 @@ var OverlayRenderer = function OverlayRenderer(param) {
7024
7102
  }, [
7025
7103
  updateDims
7026
7104
  ]);
7027
- var activeOverlays = overlays.filter(function(o) {
7028
- return isOverlayActive(o, currentTime);
7029
- });
7030
- if (!dims || activeOverlays.length === 0) return null;
7105
+ var activeOverlays = useMemo(function() {
7106
+ return overlays.filter(function(o) {
7107
+ return isOverlayActive(o, currentTime);
7108
+ });
7109
+ }, [
7110
+ overlays,
7111
+ currentTime
7112
+ ]);
7113
+ useEffect(function() {
7114
+ var activeIds = new Set(activeOverlays.map(function(o) {
7115
+ return o.id;
7116
+ }));
7117
+ setFadeMap(function(prev) {
7118
+ var next = new Map(prev);
7119
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
7120
+ try {
7121
+ for(var _iterator = activeOverlays[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
7122
+ var overlay = _step.value;
7123
+ if (!next.has(overlay.id)) {
7124
+ next.set(overlay.id, {
7125
+ overlay: overlay,
7126
+ visible: false
7127
+ });
7128
+ } else {
7129
+ var existing = next.get(overlay.id);
7130
+ next.set(overlay.id, _object_spread_props(_object_spread({}, existing), {
7131
+ overlay: overlay
7132
+ }));
7133
+ }
7134
+ }
7135
+ } catch (err) {
7136
+ _didIteratorError = true;
7137
+ _iteratorError = err;
7138
+ } finally{
7139
+ try {
7140
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
7141
+ _iterator.return();
7142
+ }
7143
+ } finally{
7144
+ if (_didIteratorError) {
7145
+ throw _iteratorError;
7146
+ }
7147
+ }
7148
+ }
7149
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
7150
+ try {
7151
+ var _loop = function() {
7152
+ var _step_value = _sliced_to_array(_step1.value, 2), id = _step_value[0], state = _step_value[1];
7153
+ if (!activeIds.has(id) && state.visible) {
7154
+ next.set(id, _object_spread_props(_object_spread({}, state), {
7155
+ visible: false
7156
+ }));
7157
+ if (!removeTimers.current.has(id)) {
7158
+ var timer = setTimeout(function() {
7159
+ setFadeMap(function(m) {
7160
+ var updated = new Map(m);
7161
+ updated.delete(id);
7162
+ return updated;
7163
+ });
7164
+ removeTimers.current.delete(id);
7165
+ }, FADE_DURATION_MS);
7166
+ removeTimers.current.set(id, timer);
7167
+ }
7168
+ } else if (!activeIds.has(id) && !state.visible) {}
7169
+ };
7170
+ for(var _iterator1 = next[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true)_loop();
7171
+ } catch (err) {
7172
+ _didIteratorError1 = true;
7173
+ _iteratorError1 = err;
7174
+ } finally{
7175
+ try {
7176
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
7177
+ _iterator1.return();
7178
+ }
7179
+ } finally{
7180
+ if (_didIteratorError1) {
7181
+ throw _iteratorError1;
7182
+ }
7183
+ }
7184
+ }
7185
+ return next;
7186
+ });
7187
+ }, [
7188
+ activeOverlays
7189
+ ]);
7190
+ useEffect(function() {
7191
+ var toFadeIn = [];
7192
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
7193
+ try {
7194
+ var _loop = function() {
7195
+ var _step_value = _sliced_to_array(_step.value, 2), id = _step_value[0], state = _step_value[1];
7196
+ if (!state.visible) {
7197
+ var isActive = activeOverlays.some(function(o) {
7198
+ return o.id === id;
7199
+ });
7200
+ if (isActive) toFadeIn.push(id);
7201
+ }
7202
+ };
7203
+ for(var _iterator = fadeMap[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
7204
+ } catch (err) {
7205
+ _didIteratorError = true;
7206
+ _iteratorError = err;
7207
+ } finally{
7208
+ try {
7209
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
7210
+ _iterator.return();
7211
+ }
7212
+ } finally{
7213
+ if (_didIteratorError) {
7214
+ throw _iteratorError;
7215
+ }
7216
+ }
7217
+ }
7218
+ if (toFadeIn.length === 0) return;
7219
+ var raf = requestAnimationFrame(function() {
7220
+ setFadeMap(function(prev) {
7221
+ var next = new Map(prev);
7222
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
7223
+ try {
7224
+ for(var _iterator = toFadeIn[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
7225
+ var id = _step.value;
7226
+ var state = next.get(id);
7227
+ if (state) next.set(id, _object_spread_props(_object_spread({}, state), {
7228
+ visible: true
7229
+ }));
7230
+ }
7231
+ } catch (err) {
7232
+ _didIteratorError = true;
7233
+ _iteratorError = err;
7234
+ } finally{
7235
+ try {
7236
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
7237
+ _iterator.return();
7238
+ }
7239
+ } finally{
7240
+ if (_didIteratorError) {
7241
+ throw _iteratorError;
7242
+ }
7243
+ }
7244
+ }
7245
+ return next;
7246
+ });
7247
+ });
7248
+ return function() {
7249
+ return cancelAnimationFrame(raf);
7250
+ };
7251
+ }, [
7252
+ fadeMap,
7253
+ activeOverlays
7254
+ ]);
7255
+ useEffect(function() {
7256
+ return function() {
7257
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
7258
+ try {
7259
+ for(var _iterator = removeTimers.current.values()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
7260
+ var timer = _step.value;
7261
+ clearTimeout(timer);
7262
+ }
7263
+ } catch (err) {
7264
+ _didIteratorError = true;
7265
+ _iteratorError = err;
7266
+ } finally{
7267
+ try {
7268
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
7269
+ _iterator.return();
7270
+ }
7271
+ } finally{
7272
+ if (_didIteratorError) {
7273
+ throw _iteratorError;
7274
+ }
7275
+ }
7276
+ }
7277
+ };
7278
+ }, []);
7279
+ if (!dims || fadeMap.size === 0) return null;
7031
7280
  return /* @__PURE__ */ jsx("div", {
7032
7281
  "aria-hidden": "true",
7033
7282
  style: {
@@ -7040,14 +7289,16 @@ var OverlayRenderer = function OverlayRenderer(param) {
7040
7289
  overflow: "hidden",
7041
7290
  zIndex: 8
7042
7291
  },
7043
- children: activeOverlays.map(function(overlay) {
7292
+ children: _to_consumable_array(fadeMap.values()).map(function(param) {
7293
+ var overlay = param.overlay, visible = param.visible;
7044
7294
  var scaleX = (coordinateSpace === null || coordinateSpace === void 0 ? void 0 : coordinateSpace.width) ? dims.displayWidth / coordinateSpace.width : dims.scaleX;
7045
7295
  var scaleY = (coordinateSpace === null || coordinateSpace === void 0 ? void 0 : coordinateSpace.height) ? dims.displayHeight / coordinateSpace.height : dims.scaleY;
7046
7296
  var left = overlay.x * scaleX;
7047
7297
  var top = overlay.y * scaleY;
7048
7298
  var width = overlay.width * scaleX;
7049
7299
  var height = overlay.height * scaleY;
7050
- var opacity = Math.max(0, Math.min(100, overlay.opacity)) / 100;
7300
+ var baseOpacity = Math.max(0, Math.min(100, overlay.opacity)) / 100;
7301
+ var opacity = visible ? baseOpacity : 0;
7051
7302
  var sz = {
7052
7303
  w: width,
7053
7304
  h: height
@@ -7060,6 +7311,7 @@ var OverlayRenderer = function OverlayRenderer(param) {
7060
7311
  width: "".concat(width, "px"),
7061
7312
  height: "".concat(height, "px"),
7062
7313
  opacity: opacity,
7314
+ transition: "opacity ".concat(FADE_DURATION_MS, "ms ease"),
7063
7315
  zIndex: overlay.z_index,
7064
7316
  overflow: "hidden"
7065
7317
  },
@@ -7329,7 +7581,7 @@ var StormcloudVideoPlayerComponent = React2.memo(function(props) {
7329
7581
  var debugPanelBottomOffset = shouldShowEnhancedControls ? Math.max(74, 92 * responsiveScale) : Math.max(52, 58 * responsiveScale);
7330
7582
  var panelBaseRight = PANEL_BASE_RIGHT_OFFSET * responsiveScale;
7331
7583
  var debugPanelRightOffset = showAiPanel && !shouldStackPanels ? panelBaseRight + analyzerPanelWidth + panelGap : panelBaseRight;
7332
- var criticalPropsKey = useMemo(function() {
7584
+ var criticalPropsKey = useMemo2(function() {
7333
7585
  return CRITICAL_PROPS.map(function(prop) {
7334
7586
  return "".concat(prop, ":").concat(props[prop]);
7335
7587
  }).join("|");