stormcloud-video-player 0.7.39 → 0.7.41

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.
@@ -211,24 +211,39 @@ __export(overlays_exports, {
211
211
  OVERLAY_API_BASE: function OVERLAY_API_BASE1() {
212
212
  return OVERLAY_API_BASE;
213
213
  },
214
+ SWIRL_HD_AUTHORING_HEIGHT: function SWIRL_HD_AUTHORING_HEIGHT1() {
215
+ return SWIRL_HD_AUTHORING_HEIGHT;
216
+ },
217
+ SWIRL_HD_AUTHORING_WIDTH: function SWIRL_HD_AUTHORING_WIDTH1() {
218
+ return SWIRL_HD_AUTHORING_WIDTH;
219
+ },
214
220
  createDemoStockTickerOverlay: function createDemoStockTickerOverlay1() {
215
221
  return createDemoStockTickerOverlay;
216
222
  },
217
223
  fetchProjectOverlays: function fetchProjectOverlays1() {
218
224
  return fetchProjectOverlays;
219
225
  },
226
+ inferSwirlOverlayCoordinateSpace: function inferSwirlOverlayCoordinateSpace1() {
227
+ return inferSwirlOverlayCoordinateSpace;
228
+ },
220
229
  isOverlayActive: function isOverlayActive1() {
221
230
  return isOverlayActive;
222
231
  },
223
232
  normalizeSwirlOverlay: function normalizeSwirlOverlay1() {
224
233
  return normalizeSwirlOverlay;
225
234
  },
235
+ overlayAuthoringDimensions: function overlayAuthoringDimensions1() {
236
+ return overlayAuthoringDimensions;
237
+ },
226
238
  resolveImageUrl: function resolveImageUrl1() {
227
239
  return resolveImageUrl;
228
240
  },
229
241
  scrollerLooksLikeMarketsStock: function scrollerLooksLikeMarketsStock1() {
230
242
  return scrollerLooksLikeMarketsStock;
231
243
  },
244
+ swirlProjectHasNabDemoMixedWithOther: function swirlProjectHasNabDemoMixedWithOther1() {
245
+ return swirlProjectHasNabDemoMixedWithOther;
246
+ },
232
247
  timeStringToSeconds: function timeStringToSeconds1() {
233
248
  return timeStringToSeconds;
234
249
  }
@@ -269,6 +284,126 @@ function isOverlayActive(overlay, currentTime) {
269
284
  if (durationSec <= 0) return false;
270
285
  return currentTime >= startSec && currentTime < startSec + durationSec;
271
286
  }
287
+ var SWIRL_HD_AUTHORING_WIDTH = 1920;
288
+ var SWIRL_HD_AUTHORING_HEIGHT = 1080;
289
+ var NAB_DEMO_NAME_PREFIX = "NAB Demo \u2014 ";
290
+ function overlayAuthoringDimensions(overlay, decodeWidth, decodeHeight) {
291
+ if (!decodeWidth || !decodeHeight) {
292
+ return {
293
+ width: decodeWidth || SWIRL_HD_AUTHORING_WIDTH,
294
+ height: decodeHeight || SWIRL_HD_AUTHORING_HEIGHT
295
+ };
296
+ }
297
+ if (!overlay.visible) {
298
+ return {
299
+ width: decodeWidth,
300
+ height: decodeHeight
301
+ };
302
+ }
303
+ var extR = overlay.x + overlay.width;
304
+ var extB = overlay.y + overlay.height;
305
+ var EPS = 2;
306
+ var exceedsDecode = extR > decodeWidth + EPS || extB > decodeHeight + EPS;
307
+ var isNabDemo = overlay.name.startsWith(NAB_DEMO_NAME_PREFIX);
308
+ var isSyntheticMarketsTicker = overlay.id === -9001 || overlay.name === "Demo stock ticker";
309
+ if (exceedsDecode && (isNabDemo || isSyntheticMarketsTicker)) {
310
+ return {
311
+ width: SWIRL_HD_AUTHORING_WIDTH,
312
+ height: SWIRL_HD_AUTHORING_HEIGHT
313
+ };
314
+ }
315
+ return {
316
+ width: decodeWidth,
317
+ height: decodeHeight
318
+ };
319
+ }
320
+ function overlayExtents(overlays) {
321
+ var maxR = 0;
322
+ var maxB = 0;
323
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
324
+ try {
325
+ for(var _iterator = overlays[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
326
+ var o = _step.value;
327
+ if (!o.visible) continue;
328
+ maxR = Math.max(maxR, o.x + o.width);
329
+ maxB = Math.max(maxB, o.y + o.height);
330
+ }
331
+ } catch (err) {
332
+ _didIteratorError = true;
333
+ _iteratorError = err;
334
+ } finally{
335
+ try {
336
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
337
+ _iterator.return();
338
+ }
339
+ } finally{
340
+ if (_didIteratorError) {
341
+ throw _iteratorError;
342
+ }
343
+ }
344
+ }
345
+ return {
346
+ maxR: maxR,
347
+ maxB: maxB
348
+ };
349
+ }
350
+ function swirlProjectHasNabDemoMixedWithOther(overlays) {
351
+ var hasNab = false;
352
+ var hasOther = false;
353
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
354
+ try {
355
+ for(var _iterator = overlays[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
356
+ var o = _step.value;
357
+ if (!o.visible) continue;
358
+ if (o.name.startsWith(NAB_DEMO_NAME_PREFIX)) hasNab = true;
359
+ else hasOther = true;
360
+ }
361
+ } catch (err) {
362
+ _didIteratorError = true;
363
+ _iteratorError = err;
364
+ } finally{
365
+ try {
366
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
367
+ _iterator.return();
368
+ }
369
+ } finally{
370
+ if (_didIteratorError) {
371
+ throw _iteratorError;
372
+ }
373
+ }
374
+ }
375
+ return hasNab && hasOther;
376
+ }
377
+ function inferSwirlOverlayCoordinateSpace(overlays, videoWidth, videoHeight) {
378
+ if (!videoWidth || !videoHeight) {
379
+ return {
380
+ width: videoWidth || SWIRL_HD_AUTHORING_WIDTH,
381
+ height: videoHeight || SWIRL_HD_AUTHORING_HEIGHT
382
+ };
383
+ }
384
+ if (!overlays.length) {
385
+ return {
386
+ width: videoWidth,
387
+ height: videoHeight
388
+ };
389
+ }
390
+ var _overlayExtents = overlayExtents(overlays), maxR = _overlayExtents.maxR, maxB = _overlayExtents.maxB;
391
+ var EPS = 1;
392
+ var exceedsDecode = maxR > videoWidth + EPS || maxB > videoHeight + EPS;
393
+ var fitsHdCanvas = maxR <= SWIRL_HD_AUTHORING_WIDTH + EPS && maxB <= SWIRL_HD_AUTHORING_HEIGHT + EPS;
394
+ var mixed = swirlProjectHasNabDemoMixedWithOther(overlays);
395
+ var decodeLargerThanHd = videoWidth > SWIRL_HD_AUTHORING_WIDTH + EPS || videoHeight > SWIRL_HD_AUTHORING_HEIGHT + EPS;
396
+ if (fitsHdCanvas && (decodeLargerThanHd || exceedsDecode && !mixed)) {
397
+ return {
398
+ width: SWIRL_HD_AUTHORING_WIDTH,
399
+ height: SWIRL_HD_AUTHORING_HEIGHT
400
+ };
401
+ }
402
+ return {
403
+ width: videoWidth,
404
+ height: videoHeight
405
+ };
406
+ }
272
407
  function scrollerLooksLikeMarketsStock(o) {
273
408
  var _ref, _ref1, _ref2, _ref3;
274
409
  if (o.type !== "scroller") return false;
@@ -277,39 +412,52 @@ function scrollerLooksLikeMarketsStock(o) {
277
412
  return /\b(MARKETS?|NYSE|NASDAQ|DJIA|\bS&P\b|STOCK|AAPL|TSLA|NVDA|EQUITIES)\b/i.test(blob);
278
413
  }
279
414
  function createDemoStockTickerOverlay(projectId, opts) {
280
- var stack = (opts === null || opts === void 0 ? void 0 : opts.stackAboveNews) === true;
415
+ var cw = (opts === null || opts === void 0 ? void 0 : opts.coordinateWidth) && opts.coordinateWidth > 0 ? opts.coordinateWidth : SWIRL_HD_AUTHORING_WIDTH;
416
+ var ch = (opts === null || opts === void 0 ? void 0 : opts.coordinateHeight) && opts.coordinateHeight > 0 ? opts.coordinateHeight : SWIRL_HD_AUTHORING_HEIGHT;
417
+ var sx = cw / SWIRL_HD_AUTHORING_WIDTH;
418
+ var sy = ch / SWIRL_HD_AUTHORING_HEIGHT;
419
+ var x = 36 * sx;
420
+ var y = 1002 * sy;
421
+ var width = 1848 * sx;
422
+ var height = 66 * sy;
423
+ var fontSize = Math.max(8, Math.round(13 * sy));
424
+ var scrollSpeed = Math.max(8, Math.round(36 * sx));
425
+ var borderRadius = Math.max(1, Math.round(4 * sy));
281
426
  return {
282
427
  id: -9001,
283
428
  project_id: projectId,
284
429
  name: "Demo stock ticker",
285
430
  type: "scroller",
286
431
  visible: true,
287
- x: 144,
288
- y: stack ? 818 : 950,
289
- width: 1632,
290
- height: stack ? 78 : 97,
432
+ x: x,
433
+ y: y,
434
+ width: width,
435
+ height: height,
291
436
  opacity: 100,
292
437
  start_time: "00:00:00.000",
293
438
  duration: "24:00:00.000",
294
- z_index: stack ? 125 : 120,
439
+ z_index: 120,
295
440
  scroller_config: {
441
+ preset: "equities_strip",
296
442
  use_custom_text: true,
297
- custom_text: "AAPL +1.24% \u2022 MSFT +0.42% \u2022 GOOGL \u22120.11% \u2022 TSLA +2.31% \u2022 NVDA +1.87% \u2022 AMZN +0.65% \u2022 META +0.38% \u2022 DJIA +0.52% \u2022 S&P 500 +0.33% \u2022 NDAQ +0.41%",
443
+ custom_text: "AAPL +0.84% \u2022 MSFT +0.31% \u2022 GOOGL \u22120.22% \u2022 AMZN +0.47% \u2022 NVDA +1.12% \u2022 META +0.19% \u2022 BRK.B +0.11% \u2022 JPM +0.55% \u2022 V +0.28% \u2022 UNH \u22120.17% \u2022 DJIA +0.41% \u2022 S&P 500 +0.29% \u2022 Nasdaq Composite +0.36% \u2022 Russell 2000 +0.52% \u2022 WTI crude $78.40 +0.6% \u2022 Gold $2,348/oz \u22120.2% \u2022 10Y Treasury 4.28%",
298
444
  direction: "left",
299
- scroll_speed: 42,
300
- font_size: 15,
301
- font_weight: "700",
302
- text_color: "#f8fafc",
303
- background_color: "#0f172a",
445
+ scroll_speed: scrollSpeed,
446
+ font_size: fontSize,
447
+ font_weight: "600",
448
+ text_color: "#e2e8f0",
449
+ background_color: "#0a0f18",
304
450
  background_opacity: 92,
305
- border_radius: 4,
306
- label: "MARKETS",
307
- label_line2: "LIVE",
308
- label_color: "#0ea5e9",
309
- label_text_color: "#ffffff",
451
+ border_radius: borderRadius,
452
+ padding: Math.max(3, Math.round(6 * sy)),
453
+ label: "U.S. equities",
454
+ label_line2: "",
455
+ label_color: "#1e3a5f",
456
+ label_text_color: "#f8fafc",
310
457
  accent_color: "#38bdf8",
311
458
  show_accent_line: true,
312
- separator_char: "\u2022"
459
+ separator_char: "\u2022",
460
+ item_spacing: Math.max(28, Math.round(48 * sx))
313
461
  }
314
462
  };
315
463
  }
@@ -395,12 +543,17 @@ function resolveImageUrl(imageUrl) {
395
543
  // Annotate the CommonJS export names for ESM import in node:
396
544
  0 && (module.exports = {
397
545
  OVERLAY_API_BASE: OVERLAY_API_BASE,
546
+ SWIRL_HD_AUTHORING_HEIGHT: SWIRL_HD_AUTHORING_HEIGHT,
547
+ SWIRL_HD_AUTHORING_WIDTH: SWIRL_HD_AUTHORING_WIDTH,
398
548
  createDemoStockTickerOverlay: createDemoStockTickerOverlay,
399
549
  fetchProjectOverlays: fetchProjectOverlays,
550
+ inferSwirlOverlayCoordinateSpace: inferSwirlOverlayCoordinateSpace,
400
551
  isOverlayActive: isOverlayActive,
401
552
  normalizeSwirlOverlay: normalizeSwirlOverlay,
553
+ overlayAuthoringDimensions: overlayAuthoringDimensions,
402
554
  resolveImageUrl: resolveImageUrl,
403
555
  scrollerLooksLikeMarketsStock: scrollerLooksLikeMarketsStock,
556
+ swirlProjectHasNabDemoMixedWithOther: swirlProjectHasNabDemoMixedWithOther,
404
557
  timeStringToSeconds: timeStringToSeconds
405
558
  });
406
559
  //# sourceMappingURL=overlays.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/utils/overlays.cjs"],"names":["__defProp","defineProperty","Object","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IACA,EAAIA,KAAAA,GAAmBC,OAAnBD,IAAYE,QAAOD,KAAAA,EAAc,KAAdA;AACvB,IAAIE,mBAAmBD,OAAOE,wBAAwB;AACtD,IAAIC,oBAAoBH,OAAOI,mBAAmB,WAAA;AAClD,IAAIC,CAAAA,CAAAA,OAAAA,MAAeL,CAAAA,GAAAA,GAAOM,SAAS,CAACC,cAAc;IAClD,kBAAA,EAAIC,WAAW,kBAACC,QAAQC;oCACtB,IAAK,IAAIC,QAAQD,IACfZ,UAAUW,QAAQE,MAAM;gCAAEC,KAAKF,GAAG,CAACC,KAAK;2BAAEE,YAAY;6BAAK;IAC/D,iBAAA;IACA,+BAAA,EAAIC,cAAc,qBAACC,IAAIC,MAAMC,QAAQC;2BACnC,IAAIF,QAAQ,CAAA,OAAOA,qCAAP,SAAOA,KAAG,MAAM,YAAY,OAAOA,SAAS,YAAY;aAC7D,kCAAA,2BAAA","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/utils/overlays.ts\nvar overlays_exports = {};\n__export(overlays_exports, {\n OVERLAY_API_BASE: () => OVERLAY_API_BASE,\n createDemoStockTickerOverlay: () => createDemoStockTickerOverlay,\n fetchProjectOverlays: () => fetchProjectOverlays,\n isOverlayActive: () => isOverlayActive,\n normalizeSwirlOverlay: () => normalizeSwirlOverlay,\n resolveImageUrl: () => resolveImageUrl,\n scrollerLooksLikeMarketsStock: () => scrollerLooksLikeMarketsStock,\n timeStringToSeconds: () => timeStringToSeconds\n});\nmodule.exports = __toCommonJS(overlays_exports);\nvar OVERLAY_API_BASE = \"https://adstorm.co/api-adstorm-dev\";\nfunction timeStringToSeconds(timeStr) {\n if (!timeStr) return 0;\n const parts = timeStr.split(\":\");\n if (parts.length >= 3) {\n const hours = parseInt(parts[0] ?? \"0\", 10) || 0;\n const minutes = parseInt(parts[1] ?? \"0\", 10) || 0;\n const secStr = parts[2] ?? \"0\";\n const dotIdx = secStr.indexOf(\".\");\n const seconds = parseInt(dotIdx >= 0 ? secStr.substring(0, dotIdx) : secStr, 10) || 0;\n const msFrag = dotIdx >= 0 ? secStr.substring(dotIdx + 1) : \"\";\n const ms = msFrag ? parseInt(msFrag.padEnd(3, \"0\").substring(0, 3), 10) || 0 : 0;\n return hours * 3600 + minutes * 60 + seconds + ms / 1e3;\n }\n if (parts.length === 2) {\n const minutes = parseInt(parts[0] ?? \"0\", 10) || 0;\n const secStr = parts[1] ?? \"0\";\n const dotIdx = secStr.indexOf(\".\");\n const seconds = parseInt(dotIdx >= 0 ? secStr.substring(0, dotIdx) : secStr, 10) || 0;\n const msFrag = dotIdx >= 0 ? secStr.substring(dotIdx + 1) : \"\";\n const ms = msFrag ? parseInt(msFrag.padEnd(3, \"0\").substring(0, 3), 10) || 0 : 0;\n return minutes * 60 + seconds + ms / 1e3;\n }\n const num = parseFloat(timeStr);\n return isFinite(num) ? Math.max(0, num) : 0;\n}\nfunction isOverlayActive(overlay, currentTime) {\n if (!overlay.visible) return false;\n const startSec = timeStringToSeconds(overlay.start_time);\n const durationSec = timeStringToSeconds(overlay.duration);\n if (durationSec <= 0) return false;\n return currentTime >= startSec && currentTime < startSec + durationSec;\n}\nfunction scrollerLooksLikeMarketsStock(o) {\n if (o.type !== \"scroller\") return false;\n const cfg = o.scroller_config;\n const blob = `${o.name} ${cfg?.label ?? \"\"} ${cfg?.label_line2 ?? \"\"} ${cfg?.custom_text ?? \"\"} ${cfg?.preset ?? \"\"}`;\n return /\\b(MARKETS?|NYSE|NASDAQ|DJIA|\\bS&P\\b|STOCK|AAPL|TSLA|NVDA|EQUITIES)\\b/i.test(blob);\n}\nfunction createDemoStockTickerOverlay(projectId, opts) {\n const stack = opts?.stackAboveNews === true;\n return {\n id: -9001,\n project_id: projectId,\n name: \"Demo stock ticker\",\n type: \"scroller\",\n visible: true,\n x: 144,\n y: stack ? 818 : 950,\n width: 1632,\n height: stack ? 78 : 97,\n opacity: 100,\n start_time: \"00:00:00.000\",\n duration: \"24:00:00.000\",\n z_index: stack ? 125 : 120,\n scroller_config: {\n use_custom_text: true,\n custom_text: \"AAPL +1.24% \\u2022 MSFT +0.42% \\u2022 GOOGL \\u22120.11% \\u2022 TSLA +2.31% \\u2022 NVDA +1.87% \\u2022 AMZN +0.65% \\u2022 META +0.38% \\u2022 DJIA +0.52% \\u2022 S&P 500 +0.33% \\u2022 NDAQ +0.41%\",\n direction: \"left\",\n scroll_speed: 42,\n font_size: 15,\n font_weight: \"700\",\n text_color: \"#f8fafc\",\n background_color: \"#0f172a\",\n background_opacity: 92,\n border_radius: 4,\n label: \"MARKETS\",\n label_line2: \"LIVE\",\n label_color: \"#0ea5e9\",\n label_text_color: \"#ffffff\",\n accent_color: \"#38bdf8\",\n show_accent_line: true,\n separator_char: \"\\u2022\"\n }\n };\n}\nfunction normalizeScrollerConfig(raw) {\n if (!raw || typeof raw !== \"object\") return void 0;\n const r = raw;\n const merged = { ...raw };\n if (merged.use_custom_text === void 0 && typeof r.useCustomText === \"boolean\") {\n merged.use_custom_text = r.useCustomText;\n }\n if ((merged.custom_text === void 0 || merged.custom_text === \"\") && typeof r.customText === \"string\") {\n merged.custom_text = r.customText;\n }\n if (!merged.rss_url && typeof r.rssUrl === \"string\") {\n merged.rss_url = r.rssUrl;\n }\n return merged;\n}\nfunction normalizeSwirlOverlay(raw) {\n const o = { ...raw };\n if (o.type === \"scroller\") {\n const sc = raw.scroller_config ?? raw.scrollerConfig;\n const normalized = normalizeScrollerConfig(sc);\n if (normalized) o.scroller_config = normalized;\n }\n return o;\n}\nasync function fetchProjectOverlays(projectId, apiBaseUrl = OVERLAY_API_BASE) {\n const base = apiBaseUrl.replace(/\\/$/, \"\");\n const response = await fetch(\n `${base}/adstorm/swirl/projects/${projectId}/overlays`\n );\n if (!response.ok) {\n throw new Error(\n `Failed to fetch overlays: ${response.status} ${response.statusText}`\n );\n }\n const data = await response.json();\n if (!Array.isArray(data)) return [];\n return data.map(\n (row) => normalizeSwirlOverlay(row)\n );\n}\nfunction resolveImageUrl(imageUrl, apiBaseUrl = OVERLAY_API_BASE) {\n if (!imageUrl) return \"\";\n if (imageUrl.startsWith(\"http://\") || imageUrl.startsWith(\"https://\")) {\n return imageUrl;\n }\n if (imageUrl.startsWith(\"/\")) {\n try {\n const url = new URL(apiBaseUrl);\n return `${url.origin}${imageUrl}`;\n } catch {\n return imageUrl;\n }\n }\n return `${apiBaseUrl}/${imageUrl}`;\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n OVERLAY_API_BASE,\n createDemoStockTickerOverlay,\n fetchProjectOverlays,\n isOverlayActive,\n normalizeSwirlOverlay,\n resolveImageUrl,\n scrollerLooksLikeMarketsStock,\n timeStringToSeconds\n});\n"]}
1
+ {"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/utils/overlays.cjs","../../src/utils/overlays.ts"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","overlays_exports","OVERLAY_API_BASE","SWIRL_HD_AUTHORING_HEIGHT","SWIRL_HD_AUTHORING_WIDTH","createDemoStockTickerOverlay","fetchProjectOverlays","normalizeSwirlOverlay","inferSwirlOverlayCoordinateSpace","isOverlayActive","overlayAuthoringDimensions","resolveImageUrl","scrollerLooksLikeMarketsStock","swirlProjectHasNabDemoMixedWithOther","timeStringToSeconds","module","exports","timeStr","parts","split","length","hours","parseInt","minutes","secStr","dotIdx","indexOf","seconds","substring","msFrag","ms","padEnd"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/utils/overlays.ts\nvar overlays_exports = {};\n__export(overlays_exports, {\n OVERLAY_API_BASE: () => OVERLAY_API_BASE,\n SWIRL_HD_AUTHORING_HEIGHT: () => SWIRL_HD_AUTHORING_HEIGHT,\n SWIRL_HD_AUTHORING_WIDTH: () => SWIRL_HD_AUTHORING_WIDTH,\n createDemoStockTickerOverlay: () => createDemoStockTickerOverlay,\n fetchProjectOverlays: () => fetchProjectOverlays,\n inferSwirlOverlayCoordinateSpace: () => inferSwirlOverlayCoordinateSpace,\n isOverlayActive: () => isOverlayActive,\n normalizeSwirlOverlay: () => normalizeSwirlOverlay,\n overlayAuthoringDimensions: () => overlayAuthoringDimensions,\n resolveImageUrl: () => resolveImageUrl,\n scrollerLooksLikeMarketsStock: () => scrollerLooksLikeMarketsStock,\n swirlProjectHasNabDemoMixedWithOther: () => swirlProjectHasNabDemoMixedWithOther,\n timeStringToSeconds: () => timeStringToSeconds\n});\nmodule.exports = __toCommonJS(overlays_exports);\nvar OVERLAY_API_BASE = \"https://adstorm.co/api-adstorm-dev\";\nfunction timeStringToSeconds(timeStr) {\n if (!timeStr) return 0;\n const parts = timeStr.split(\":\");\n if (parts.length >= 3) {\n const hours = parseInt(parts[0] ?? \"0\", 10) || 0;\n const minutes = parseInt(parts[1] ?? \"0\", 10) || 0;\n const secStr = parts[2] ?? \"0\";\n const dotIdx = secStr.indexOf(\".\");\n const seconds = parseInt(dotIdx >= 0 ? secStr.substring(0, dotIdx) : secStr, 10) || 0;\n const msFrag = dotIdx >= 0 ? secStr.substring(dotIdx + 1) : \"\";\n const ms = msFrag ? parseInt(msFrag.padEnd(3, \"0\").substring(0, 3), 10) || 0 : 0;\n return hours * 3600 + minutes * 60 + seconds + ms / 1e3;\n }\n if (parts.length === 2) {\n const minutes = parseInt(parts[0] ?? \"0\", 10) || 0;\n const secStr = parts[1] ?? \"0\";\n const dotIdx = secStr.indexOf(\".\");\n const seconds = parseInt(dotIdx >= 0 ? secStr.substring(0, dotIdx) : secStr, 10) || 0;\n const msFrag = dotIdx >= 0 ? secStr.substring(dotIdx + 1) : \"\";\n const ms = msFrag ? parseInt(msFrag.padEnd(3, \"0\").substring(0, 3), 10) || 0 : 0;\n return minutes * 60 + seconds + ms / 1e3;\n }\n const num = parseFloat(timeStr);\n return isFinite(num) ? Math.max(0, num) : 0;\n}\nfunction isOverlayActive(overlay, currentTime) {\n if (!overlay.visible) return false;\n const startSec = timeStringToSeconds(overlay.start_time);\n const durationSec = timeStringToSeconds(overlay.duration);\n if (durationSec <= 0) return false;\n return currentTime >= startSec && currentTime < startSec + durationSec;\n}\nvar SWIRL_HD_AUTHORING_WIDTH = 1920;\nvar SWIRL_HD_AUTHORING_HEIGHT = 1080;\nvar NAB_DEMO_NAME_PREFIX = \"NAB Demo \\u2014 \";\nfunction overlayAuthoringDimensions(overlay, decodeWidth, decodeHeight) {\n if (!decodeWidth || !decodeHeight) {\n return {\n width: decodeWidth || SWIRL_HD_AUTHORING_WIDTH,\n height: decodeHeight || SWIRL_HD_AUTHORING_HEIGHT\n };\n }\n if (!overlay.visible) {\n return { width: decodeWidth, height: decodeHeight };\n }\n const extR = overlay.x + overlay.width;\n const extB = overlay.y + overlay.height;\n const EPS = 2;\n const exceedsDecode = extR > decodeWidth + EPS || extB > decodeHeight + EPS;\n const isNabDemo = overlay.name.startsWith(NAB_DEMO_NAME_PREFIX);\n const isSyntheticMarketsTicker = overlay.id === -9001 || overlay.name === \"Demo stock ticker\";\n if (exceedsDecode && (isNabDemo || isSyntheticMarketsTicker)) {\n return {\n width: SWIRL_HD_AUTHORING_WIDTH,\n height: SWIRL_HD_AUTHORING_HEIGHT\n };\n }\n return { width: decodeWidth, height: decodeHeight };\n}\nfunction overlayExtents(overlays) {\n let maxR = 0;\n let maxB = 0;\n for (const o of overlays) {\n if (!o.visible) continue;\n maxR = Math.max(maxR, o.x + o.width);\n maxB = Math.max(maxB, o.y + o.height);\n }\n return { maxR, maxB };\n}\nfunction swirlProjectHasNabDemoMixedWithOther(overlays) {\n let hasNab = false;\n let hasOther = false;\n for (const o of overlays) {\n if (!o.visible) continue;\n if (o.name.startsWith(NAB_DEMO_NAME_PREFIX)) hasNab = true;\n else hasOther = true;\n }\n return hasNab && hasOther;\n}\nfunction inferSwirlOverlayCoordinateSpace(overlays, videoWidth, videoHeight) {\n if (!videoWidth || !videoHeight) {\n return {\n width: videoWidth || SWIRL_HD_AUTHORING_WIDTH,\n height: videoHeight || SWIRL_HD_AUTHORING_HEIGHT\n };\n }\n if (!overlays.length) {\n return { width: videoWidth, height: videoHeight };\n }\n const { maxR, maxB } = overlayExtents(overlays);\n const EPS = 1;\n const exceedsDecode = maxR > videoWidth + EPS || maxB > videoHeight + EPS;\n const fitsHdCanvas = maxR <= SWIRL_HD_AUTHORING_WIDTH + EPS && maxB <= SWIRL_HD_AUTHORING_HEIGHT + EPS;\n const mixed = swirlProjectHasNabDemoMixedWithOther(overlays);\n const decodeLargerThanHd = videoWidth > SWIRL_HD_AUTHORING_WIDTH + EPS || videoHeight > SWIRL_HD_AUTHORING_HEIGHT + EPS;\n if (fitsHdCanvas && (decodeLargerThanHd || exceedsDecode && !mixed)) {\n return {\n width: SWIRL_HD_AUTHORING_WIDTH,\n height: SWIRL_HD_AUTHORING_HEIGHT\n };\n }\n return { width: videoWidth, height: videoHeight };\n}\nfunction scrollerLooksLikeMarketsStock(o) {\n if (o.type !== \"scroller\") return false;\n const cfg = o.scroller_config;\n const blob = `${o.name} ${cfg?.label ?? \"\"} ${cfg?.label_line2 ?? \"\"} ${cfg?.custom_text ?? \"\"} ${cfg?.preset ?? \"\"}`;\n return /\\b(MARKETS?|NYSE|NASDAQ|DJIA|\\bS&P\\b|STOCK|AAPL|TSLA|NVDA|EQUITIES)\\b/i.test(blob);\n}\nfunction createDemoStockTickerOverlay(projectId, opts) {\n const cw = opts?.coordinateWidth && opts.coordinateWidth > 0 ? opts.coordinateWidth : SWIRL_HD_AUTHORING_WIDTH;\n const ch = opts?.coordinateHeight && opts.coordinateHeight > 0 ? opts.coordinateHeight : SWIRL_HD_AUTHORING_HEIGHT;\n const sx = cw / SWIRL_HD_AUTHORING_WIDTH;\n const sy = ch / SWIRL_HD_AUTHORING_HEIGHT;\n const x = 36 * sx;\n const y = 1002 * sy;\n const width = 1848 * sx;\n const height = 66 * sy;\n const fontSize = Math.max(8, Math.round(13 * sy));\n const scrollSpeed = Math.max(8, Math.round(36 * sx));\n const borderRadius = Math.max(1, Math.round(4 * sy));\n return {\n id: -9001,\n project_id: projectId,\n name: \"Demo stock ticker\",\n type: \"scroller\",\n visible: true,\n x,\n y,\n width,\n height,\n opacity: 100,\n start_time: \"00:00:00.000\",\n duration: \"24:00:00.000\",\n z_index: 120,\n scroller_config: {\n preset: \"equities_strip\",\n use_custom_text: true,\n custom_text: \"AAPL +0.84% \\u2022 MSFT +0.31% \\u2022 GOOGL \\u22120.22% \\u2022 AMZN +0.47% \\u2022 NVDA +1.12% \\u2022 META +0.19% \\u2022 BRK.B +0.11% \\u2022 JPM +0.55% \\u2022 V +0.28% \\u2022 UNH \\u22120.17% \\u2022 DJIA +0.41% \\u2022 S&P 500 +0.29% \\u2022 Nasdaq Composite +0.36% \\u2022 Russell 2000 +0.52% \\u2022 WTI crude $78.40 +0.6% \\u2022 Gold $2,348/oz \\u22120.2% \\u2022 10Y Treasury 4.28%\",\n direction: \"left\",\n scroll_speed: scrollSpeed,\n font_size: fontSize,\n font_weight: \"600\",\n text_color: \"#e2e8f0\",\n background_color: \"#0a0f18\",\n background_opacity: 92,\n border_radius: borderRadius,\n padding: Math.max(3, Math.round(6 * sy)),\n label: \"U.S. equities\",\n label_line2: \"\",\n label_color: \"#1e3a5f\",\n label_text_color: \"#f8fafc\",\n accent_color: \"#38bdf8\",\n show_accent_line: true,\n separator_char: \"\\u2022\",\n item_spacing: Math.max(28, Math.round(48 * sx))\n }\n };\n}\nfunction normalizeScrollerConfig(raw) {\n if (!raw || typeof raw !== \"object\") return void 0;\n const r = raw;\n const merged = { ...raw };\n if (merged.use_custom_text === void 0 && typeof r.useCustomText === \"boolean\") {\n merged.use_custom_text = r.useCustomText;\n }\n if ((merged.custom_text === void 0 || merged.custom_text === \"\") && typeof r.customText === \"string\") {\n merged.custom_text = r.customText;\n }\n if (!merged.rss_url && typeof r.rssUrl === \"string\") {\n merged.rss_url = r.rssUrl;\n }\n return merged;\n}\nfunction normalizeSwirlOverlay(raw) {\n const o = { ...raw };\n if (o.type === \"scroller\") {\n const sc = raw.scroller_config ?? raw.scrollerConfig;\n const normalized = normalizeScrollerConfig(sc);\n if (normalized) o.scroller_config = normalized;\n }\n return o;\n}\nasync function fetchProjectOverlays(projectId, apiBaseUrl = OVERLAY_API_BASE) {\n const base = apiBaseUrl.replace(/\\/$/, \"\");\n const response = await fetch(\n `${base}/adstorm/swirl/projects/${projectId}/overlays`\n );\n if (!response.ok) {\n throw new Error(\n `Failed to fetch overlays: ${response.status} ${response.statusText}`\n );\n }\n const data = await response.json();\n if (!Array.isArray(data)) return [];\n return data.map(\n (row) => normalizeSwirlOverlay(row)\n );\n}\nfunction resolveImageUrl(imageUrl, apiBaseUrl = OVERLAY_API_BASE) {\n if (!imageUrl) return \"\";\n if (imageUrl.startsWith(\"http://\") || imageUrl.startsWith(\"https://\")) {\n return imageUrl;\n }\n if (imageUrl.startsWith(\"/\")) {\n try {\n const url = new URL(apiBaseUrl);\n return `${url.origin}${imageUrl}`;\n } catch {\n return imageUrl;\n }\n }\n return `${apiBaseUrl}/${imageUrl}`;\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n OVERLAY_API_BASE,\n SWIRL_HD_AUTHORING_HEIGHT,\n SWIRL_HD_AUTHORING_WIDTH,\n createDemoStockTickerOverlay,\n fetchProjectOverlays,\n inferSwirlOverlayCoordinateSpace,\n isOverlayActive,\n normalizeSwirlOverlay,\n overlayAuthoringDimensions,\n resolveImageUrl,\n scrollerLooksLikeMarketsStock,\n swirlProjectHasNabDemoMixedWithOther,\n timeStringToSeconds\n});\n","export const OVERLAY_API_BASE = \"https://adstorm.co/api-adstorm-dev\";\n\nexport interface OverlayCoordinateSpace {\n width: number;\n height: number;\n}\n\nexport interface SwirlScrollerConfig {\n rss_url?: string;\n update_interval?: number;\n scroll_speed?: number;\n direction?: string;\n font_size?: number;\n font_family?: string;\n font_weight?: string;\n text_color?: string;\n background_color?: string;\n background_opacity?: number;\n border_color?: string;\n border_width?: number;\n border_radius?: number;\n padding?: number;\n margin?: number;\n show_title?: boolean;\n show_description?: boolean;\n show_timestamp?: boolean;\n show_author?: boolean;\n show_category?: boolean;\n max_items?: number;\n item_spacing?: number;\n fade_in_out?: boolean;\n fade_distance?: number;\n auto_refresh?: boolean;\n use_custom_text?: boolean;\n custom_text?: string;\n label?: string;\n label_line2?: string;\n label_color?: string;\n label_text_color?: string;\n accent_color?: string;\n show_accent_line?: boolean;\n separator_char?: string;\n preset?: string;\n}\n\nexport type SwirlOverlayType =\n | \"image\"\n | \"text\"\n | \"scroller\"\n | \"shape\"\n | \"score_bug\"\n | \"lower_third\"\n | \"qr_code\"\n | \"coming_up_next\"\n | \"contextual_trigger\"\n | \"odds_betting\"\n | \"breaking_news\"\n | \"countdown\";\n\nexport interface SwirlOverlay {\n id: number;\n project_id: number;\n name: string;\n type: SwirlOverlayType | string;\n visible: boolean;\n x: number;\n y: number;\n width: number;\n height: number;\n opacity: number;\n start_time: string;\n duration: string;\n content?: string;\n image_url?: string;\n scroller_config?: SwirlScrollerConfig;\n z_index: number;\n created_at?: string;\n updated_at?: string;\n}\n\nexport function timeStringToSeconds(timeStr: string): number {\n if (!timeStr) return 0;\n\n const parts = timeStr.split(\":\");\n\n if (parts.length >= 3) {\n const hours = parseInt(parts[0] ?? \"0\", 10) || 0;\n const minutes = parseInt(parts[1] ?? \"0\", 10) || 0;\n const secStr = parts[2] ?? \"0\";\n const dotIdx = secStr.indexOf(\".\");\n const seconds =\n parseInt(dotIdx >= 0 ? secStr.substring(0, dotIdx) : secStr, 10) || 0;\n const msFrag = dotIdx >= 0 ? secStr.substring(dotIdx + 1) : \"\";\n const ms = msFrag ? parseInt(msFrag.padEnd(3, \"0\").substring(0, 3), 10) || 0 : 0;\n return hours * 3600 + minutes * 60 + seconds + ms / 1000;\n }\n\n if (parts.length === 2) {\n const minutes = parseInt(parts[0] ?? \"0\", 10) || 0;\n const secStr = parts[1] ?? \"0\";\n const dotIdx = secStr.indexOf(\".\");\n const seconds =\n parseInt(dotIdx >= 0 ? secStr.substring(0, dotIdx) : secStr, 10) || 0;\n const msFrag = dotIdx >= 0 ? secStr.substring(dotIdx + 1) : \"\";\n const ms = msFrag ? parseInt(msFrag.padEnd(3, \"0\").substring(0, 3), 10) || 0 : 0;\n return minutes * 60 + seconds + ms / 1000;\n }\n\n const num = parseFloat(timeStr);\n return isFinite(num) ? Math.max(0, num) : 0;\n}\n\nexport function isOverlayActive(\n overlay: SwirlOverlay,\n currentTime: number\n): boolean {\n if (!overlay.visible) return false;\n const startSec = timeStringToSeconds(overlay.start_time);\n const durationSec = timeStringToSeconds(overlay.duration);\n if (durationSec <= 0) return false;\n return currentTime >= startSec && currentTime < startSec + durationSec;\n}\n\nexport const SWIRL_HD_AUTHORING_WIDTH = 1920;\nexport const SWIRL_HD_AUTHORING_HEIGHT = 1080;\n\nconst NAB_DEMO_NAME_PREFIX = \"NAB Demo — \";\n\nexport function overlayAuthoringDimensions(\n overlay: SwirlOverlay,\n decodeWidth: number,\n decodeHeight: number\n): { width: number; height: number } {\n if (!decodeWidth || !decodeHeight) {\n return {\n width: decodeWidth || SWIRL_HD_AUTHORING_WIDTH,\n height: decodeHeight || SWIRL_HD_AUTHORING_HEIGHT,\n };\n }\n if (!overlay.visible) {\n return { width: decodeWidth, height: decodeHeight };\n }\n const extR = overlay.x + overlay.width;\n const extB = overlay.y + overlay.height;\n const EPS = 2;\n const exceedsDecode =\n extR > decodeWidth + EPS || extB > decodeHeight + EPS;\n const isNabDemo = overlay.name.startsWith(NAB_DEMO_NAME_PREFIX);\n const isSyntheticMarketsTicker =\n overlay.id === -9001 || overlay.name === \"Demo stock ticker\";\n\n if (exceedsDecode && (isNabDemo || isSyntheticMarketsTicker)) {\n return {\n width: SWIRL_HD_AUTHORING_WIDTH,\n height: SWIRL_HD_AUTHORING_HEIGHT,\n };\n }\n return { width: decodeWidth, height: decodeHeight };\n}\n\nfunction overlayExtents(overlays: SwirlOverlay[]): { maxR: number; maxB: number } {\n let maxR = 0;\n let maxB = 0;\n for (const o of overlays) {\n if (!o.visible) continue;\n maxR = Math.max(maxR, o.x + o.width);\n maxB = Math.max(maxB, o.y + o.height);\n }\n return { maxR, maxB };\n}\n\nexport function swirlProjectHasNabDemoMixedWithOther(overlays: SwirlOverlay[]): boolean {\n let hasNab = false;\n let hasOther = false;\n for (const o of overlays) {\n if (!o.visible) continue;\n if (o.name.startsWith(NAB_DEMO_NAME_PREFIX)) hasNab = true;\n else hasOther = true;\n }\n return hasNab && hasOther;\n}\n\nexport function inferSwirlOverlayCoordinateSpace(\n overlays: SwirlOverlay[],\n videoWidth: number,\n videoHeight: number\n): OverlayCoordinateSpace {\n if (!videoWidth || !videoHeight) {\n return {\n width: videoWidth || SWIRL_HD_AUTHORING_WIDTH,\n height: videoHeight || SWIRL_HD_AUTHORING_HEIGHT,\n };\n }\n if (!overlays.length) {\n return { width: videoWidth, height: videoHeight };\n }\n\n const { maxR, maxB } = overlayExtents(overlays);\n const EPS = 1;\n const exceedsDecode = maxR > videoWidth + EPS || maxB > videoHeight + EPS;\n const fitsHdCanvas =\n maxR <= SWIRL_HD_AUTHORING_WIDTH + EPS &&\n maxB <= SWIRL_HD_AUTHORING_HEIGHT + EPS;\n const mixed = swirlProjectHasNabDemoMixedWithOther(overlays);\n const decodeLargerThanHd =\n videoWidth > SWIRL_HD_AUTHORING_WIDTH + EPS ||\n videoHeight > SWIRL_HD_AUTHORING_HEIGHT + EPS;\n\n if (fitsHdCanvas && (decodeLargerThanHd || (exceedsDecode && !mixed))) {\n return {\n width: SWIRL_HD_AUTHORING_WIDTH,\n height: SWIRL_HD_AUTHORING_HEIGHT,\n };\n }\n\n return { width: videoWidth, height: videoHeight };\n}\n\nexport function scrollerLooksLikeMarketsStock(o: SwirlOverlay): boolean {\n if (o.type !== \"scroller\") return false;\n const cfg = o.scroller_config;\n const blob = `${o.name} ${cfg?.label ?? \"\"} ${cfg?.label_line2 ?? \"\"} ${cfg?.custom_text ?? \"\"} ${cfg?.preset ?? \"\"}`;\n return /\\b(MARKETS?|NYSE|NASDAQ|DJIA|\\bS&P\\b|STOCK|AAPL|TSLA|NVDA|EQUITIES)\\b/i.test(blob);\n}\n\nexport type DemoStockTickerOptions = {\n coordinateWidth?: number;\n coordinateHeight?: number;\n};\n\nexport function createDemoStockTickerOverlay(\n projectId: number,\n opts?: DemoStockTickerOptions\n): SwirlOverlay {\n const cw =\n opts?.coordinateWidth && opts.coordinateWidth > 0\n ? opts.coordinateWidth\n : SWIRL_HD_AUTHORING_WIDTH;\n const ch =\n opts?.coordinateHeight && opts.coordinateHeight > 0\n ? opts.coordinateHeight\n : SWIRL_HD_AUTHORING_HEIGHT;\n const sx = cw / SWIRL_HD_AUTHORING_WIDTH;\n const sy = ch / SWIRL_HD_AUTHORING_HEIGHT;\n\n const x = 36 * sx;\n const y = 1002 * sy;\n const width = 1848 * sx;\n const height = 66 * sy;\n\n const fontSize = Math.max(8, Math.round(13 * sy));\n const scrollSpeed = Math.max(8, Math.round(36 * sx));\n const borderRadius = Math.max(1, Math.round(4 * sy));\n\n return {\n id: -9001,\n project_id: projectId,\n name: \"Demo stock ticker\",\n type: \"scroller\",\n visible: true,\n x,\n y,\n width,\n height,\n opacity: 100,\n start_time: \"00:00:00.000\",\n duration: \"24:00:00.000\",\n z_index: 120,\n scroller_config: {\n preset: \"equities_strip\",\n use_custom_text: true,\n custom_text:\n \"AAPL +0.84% • MSFT +0.31% • GOOGL −0.22% • AMZN +0.47% • NVDA +1.12% • META +0.19% • BRK.B +0.11% • JPM +0.55% • V +0.28% • UNH −0.17% • DJIA +0.41% • S&P 500 +0.29% • Nasdaq Composite +0.36% • Russell 2000 +0.52% • WTI crude $78.40 +0.6% • Gold $2,348/oz −0.2% • 10Y Treasury 4.28%\",\n direction: \"left\",\n scroll_speed: scrollSpeed,\n font_size: fontSize,\n font_weight: \"600\",\n text_color: \"#e2e8f0\",\n background_color: \"#0a0f18\",\n background_opacity: 92,\n border_radius: borderRadius,\n padding: Math.max(3, Math.round(6 * sy)),\n label: \"U.S. equities\",\n label_line2: \"\",\n label_color: \"#1e3a5f\",\n label_text_color: \"#f8fafc\",\n accent_color: \"#38bdf8\",\n show_accent_line: true,\n separator_char: \"•\",\n item_spacing: Math.max(28, Math.round(48 * sx)),\n },\n };\n}\n\nfunction normalizeScrollerConfig(\n raw: SwirlScrollerConfig | Record<string, unknown> | undefined\n): SwirlScrollerConfig | undefined {\n if (!raw || typeof raw !== \"object\") return undefined;\n const r = raw as Record<string, unknown>;\n const merged: SwirlScrollerConfig = { ...(raw as SwirlScrollerConfig) };\n if (merged.use_custom_text === undefined && typeof r.useCustomText === \"boolean\") {\n merged.use_custom_text = r.useCustomText;\n }\n if ((merged.custom_text === undefined || merged.custom_text === \"\") && typeof r.customText === \"string\") {\n merged.custom_text = r.customText;\n }\n if (!merged.rss_url && typeof r.rssUrl === \"string\") {\n merged.rss_url = r.rssUrl;\n }\n return merged;\n}\n\nexport function normalizeSwirlOverlay(raw: SwirlOverlay & Record<string, unknown>): SwirlOverlay {\n const o = { ...raw };\n if (o.type === \"scroller\") {\n const sc = raw.scroller_config ?? (raw as Record<string, unknown>).scrollerConfig;\n const normalized = normalizeScrollerConfig(sc as SwirlScrollerConfig);\n if (normalized) o.scroller_config = normalized;\n }\n return o;\n}\n\nexport async function fetchProjectOverlays(\n projectId: number,\n apiBaseUrl: string = OVERLAY_API_BASE\n): Promise<SwirlOverlay[]> {\n const base = apiBaseUrl.replace(/\\/$/, \"\");\n const response = await fetch(\n `${base}/adstorm/swirl/projects/${projectId}/overlays`\n );\n if (!response.ok) {\n throw new Error(\n `Failed to fetch overlays: ${response.status} ${response.statusText}`\n );\n }\n const data = await response.json();\n if (!Array.isArray(data)) return [];\n return data.map((row: SwirlOverlay & Record<string, unknown>) =>\n normalizeSwirlOverlay(row)\n );\n}\n\nexport function resolveImageUrl(\n imageUrl: string,\n apiBaseUrl: string = OVERLAY_API_BASE\n): string {\n if (!imageUrl) return \"\";\n if (imageUrl.startsWith(\"http://\") || imageUrl.startsWith(\"https://\")) {\n return imageUrl;\n }\n if (imageUrl.startsWith(\"/\")) {\n try {\n const url = new URL(apiBaseUrl);\n return `${url.origin}${imageUrl}`;\n } catch {\n return imageUrl;\n }\n }\n return `${apiBaseUrl}/${imageUrl}`;\n}\n"]}
@@ -63,13 +63,22 @@ interface SwirlOverlay {
63
63
  }
64
64
  declare function timeStringToSeconds(timeStr: string): number;
65
65
  declare function isOverlayActive(overlay: SwirlOverlay, currentTime: number): boolean;
66
+ declare const SWIRL_HD_AUTHORING_WIDTH = 1920;
67
+ declare const SWIRL_HD_AUTHORING_HEIGHT = 1080;
68
+ declare function overlayAuthoringDimensions(overlay: SwirlOverlay, decodeWidth: number, decodeHeight: number): {
69
+ width: number;
70
+ height: number;
71
+ };
72
+ declare function swirlProjectHasNabDemoMixedWithOther(overlays: SwirlOverlay[]): boolean;
73
+ declare function inferSwirlOverlayCoordinateSpace(overlays: SwirlOverlay[], videoWidth: number, videoHeight: number): OverlayCoordinateSpace;
66
74
  declare function scrollerLooksLikeMarketsStock(o: SwirlOverlay): boolean;
67
75
  type DemoStockTickerOptions = {
68
- stackAboveNews?: boolean;
76
+ coordinateWidth?: number;
77
+ coordinateHeight?: number;
69
78
  };
70
79
  declare function createDemoStockTickerOverlay(projectId: number, opts?: DemoStockTickerOptions): SwirlOverlay;
71
80
  declare function normalizeSwirlOverlay(raw: SwirlOverlay & Record<string, unknown>): SwirlOverlay;
72
81
  declare function fetchProjectOverlays(projectId: number, apiBaseUrl?: string): Promise<SwirlOverlay[]>;
73
82
  declare function resolveImageUrl(imageUrl: string, apiBaseUrl?: string): string;
74
83
 
75
- export { type DemoStockTickerOptions, OVERLAY_API_BASE, type OverlayCoordinateSpace, type SwirlOverlay, type SwirlOverlayType, type SwirlScrollerConfig, createDemoStockTickerOverlay, fetchProjectOverlays, isOverlayActive, normalizeSwirlOverlay, resolveImageUrl, scrollerLooksLikeMarketsStock, timeStringToSeconds };
84
+ export { type DemoStockTickerOptions, OVERLAY_API_BASE, type OverlayCoordinateSpace, SWIRL_HD_AUTHORING_HEIGHT, SWIRL_HD_AUTHORING_WIDTH, type SwirlOverlay, type SwirlOverlayType, type SwirlScrollerConfig, createDemoStockTickerOverlay, fetchProjectOverlays, inferSwirlOverlayCoordinateSpace, isOverlayActive, normalizeSwirlOverlay, overlayAuthoringDimensions, resolveImageUrl, scrollerLooksLikeMarketsStock, swirlProjectHasNabDemoMixedWithOther, timeStringToSeconds };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stormcloud-video-player",
3
- "version": "0.7.39",
3
+ "version": "0.7.41",
4
4
  "main": "lib/index.js",
5
5
  "typings": "lib/index.d.ts",
6
6
  "scripts": {