streamer-node 1.0.31 → 1.0.37

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 (123) hide show
  1. package/dist/package.json +6 -2
  2. package/dist/scripts/README.md +670 -0
  3. package/dist/scripts/install-streamer-node.sh +117 -0
  4. package/dist/scripts/reframe_ball.py +354 -0
  5. package/dist/src/application/interfaces/StartStreamUseCase.types.d.ts +3 -1
  6. package/dist/src/application/interfaces/StartStreamUseCase.types.d.ts.map +1 -1
  7. package/dist/src/application/interfaces/StartStreamUseCase.types.js.map +1 -1
  8. package/dist/src/application/services/HttpClient.d.ts +21 -0
  9. package/dist/src/application/services/HttpClient.d.ts.map +1 -1
  10. package/dist/src/application/services/HttpClient.js +37 -5
  11. package/dist/src/application/services/HttpClient.js.map +1 -1
  12. package/dist/src/application/services/StreamManagerService.d.ts.map +1 -1
  13. package/dist/src/application/services/StreamManagerService.js +2 -0
  14. package/dist/src/application/services/StreamManagerService.js.map +1 -1
  15. package/dist/src/application/use-cases/CaptureHighlightUseCase.d.ts +52 -0
  16. package/dist/src/application/use-cases/CaptureHighlightUseCase.d.ts.map +1 -0
  17. package/dist/src/application/use-cases/CaptureHighlightUseCase.js +169 -0
  18. package/dist/src/application/use-cases/CaptureHighlightUseCase.js.map +1 -0
  19. package/dist/src/application/use-cases/StartStreamUseCase.d.ts +9 -1
  20. package/dist/src/application/use-cases/StartStreamUseCase.d.ts.map +1 -1
  21. package/dist/src/application/use-cases/StartStreamUseCase.js +125 -2
  22. package/dist/src/application/use-cases/StartStreamUseCase.js.map +1 -1
  23. package/dist/src/application/use-cases/StopStreamUseCase.d.ts +5 -1
  24. package/dist/src/application/use-cases/StopStreamUseCase.d.ts.map +1 -1
  25. package/dist/src/application/use-cases/StopStreamUseCase.js +7 -1
  26. package/dist/src/application/use-cases/StopStreamUseCase.js.map +1 -1
  27. package/dist/src/domain/events/StreamEvent.d.ts +5 -0
  28. package/dist/src/domain/events/StreamEvent.d.ts.map +1 -1
  29. package/dist/src/domain/services/BallReframer.d.ts +35 -0
  30. package/dist/src/domain/services/BallReframer.d.ts.map +1 -0
  31. package/dist/src/domain/services/BallReframer.js +3 -0
  32. package/dist/src/domain/services/BallReframer.js.map +1 -0
  33. package/dist/src/domain/services/FFmpegService.d.ts +6 -2
  34. package/dist/src/domain/services/FFmpegService.d.ts.map +1 -1
  35. package/dist/src/domain/services/HighlightSignalSource.d.ts +113 -0
  36. package/dist/src/domain/services/HighlightSignalSource.d.ts.map +1 -0
  37. package/dist/src/domain/services/HighlightSignalSource.js +3 -0
  38. package/dist/src/domain/services/HighlightSignalSource.js.map +1 -0
  39. package/dist/src/domain/services/SSEService.d.ts +1 -0
  40. package/dist/src/domain/services/SSEService.d.ts.map +1 -1
  41. package/dist/src/infrastructure/config/Config.d.ts +32 -0
  42. package/dist/src/infrastructure/config/Config.d.ts.map +1 -1
  43. package/dist/src/infrastructure/config/Config.js +60 -0
  44. package/dist/src/infrastructure/config/Config.js.map +1 -1
  45. package/dist/src/infrastructure/listeners/SupabaseListener.d.ts +5 -0
  46. package/dist/src/infrastructure/listeners/SupabaseListener.d.ts.map +1 -1
  47. package/dist/src/infrastructure/listeners/SupabaseListener.js +43 -5
  48. package/dist/src/infrastructure/listeners/SupabaseListener.js.map +1 -1
  49. package/dist/src/infrastructure/logging/LogShippingService.d.ts +3 -1
  50. package/dist/src/infrastructure/logging/LogShippingService.d.ts.map +1 -1
  51. package/dist/src/infrastructure/logging/LogShippingService.js +13 -4
  52. package/dist/src/infrastructure/logging/LogShippingService.js.map +1 -1
  53. package/dist/src/infrastructure/logging/RemoteLogger.d.ts +1 -0
  54. package/dist/src/infrastructure/logging/RemoteLogger.d.ts.map +1 -1
  55. package/dist/src/infrastructure/logging/RemoteLogger.js +1 -1
  56. package/dist/src/infrastructure/logging/RemoteLogger.js.map +1 -1
  57. package/dist/src/infrastructure/services/AdDownloaderService.d.ts +85 -0
  58. package/dist/src/infrastructure/services/AdDownloaderService.d.ts.map +1 -0
  59. package/dist/src/infrastructure/services/AdDownloaderService.js +530 -0
  60. package/dist/src/infrastructure/services/AdDownloaderService.js.map +1 -0
  61. package/dist/src/infrastructure/services/AdRotator.d.ts +63 -0
  62. package/dist/src/infrastructure/services/AdRotator.d.ts.map +1 -0
  63. package/dist/src/infrastructure/services/AdRotator.js +223 -0
  64. package/dist/src/infrastructure/services/AdRotator.js.map +1 -0
  65. package/dist/src/infrastructure/services/HighlightBufferManager.d.ts +65 -0
  66. package/dist/src/infrastructure/services/HighlightBufferManager.d.ts.map +1 -0
  67. package/dist/src/infrastructure/services/HighlightBufferManager.js +203 -0
  68. package/dist/src/infrastructure/services/HighlightBufferManager.js.map +1 -0
  69. package/dist/src/infrastructure/services/HighlightBufferRegistry.d.ts +23 -0
  70. package/dist/src/infrastructure/services/HighlightBufferRegistry.d.ts.map +1 -0
  71. package/dist/src/infrastructure/services/HighlightBufferRegistry.js +44 -0
  72. package/dist/src/infrastructure/services/HighlightBufferRegistry.js.map +1 -0
  73. package/dist/src/infrastructure/services/HighlightExtractorService.d.ts +65 -0
  74. package/dist/src/infrastructure/services/HighlightExtractorService.d.ts.map +1 -0
  75. package/dist/src/infrastructure/services/HighlightExtractorService.js +264 -0
  76. package/dist/src/infrastructure/services/HighlightExtractorService.js.map +1 -0
  77. package/dist/src/infrastructure/services/HighlightRendererService.d.ts +38 -0
  78. package/dist/src/infrastructure/services/HighlightRendererService.d.ts.map +1 -0
  79. package/dist/src/infrastructure/services/HighlightRendererService.js +182 -0
  80. package/dist/src/infrastructure/services/HighlightRendererService.js.map +1 -0
  81. package/dist/src/infrastructure/services/NodeFFmpegService.d.ts +6 -4
  82. package/dist/src/infrastructure/services/NodeFFmpegService.d.ts.map +1 -1
  83. package/dist/src/infrastructure/services/NodeFFmpegService.js +154 -32
  84. package/dist/src/infrastructure/services/NodeFFmpegService.js.map +1 -1
  85. package/dist/src/infrastructure/services/NodeSSEService.d.ts +8 -0
  86. package/dist/src/infrastructure/services/NodeSSEService.d.ts.map +1 -1
  87. package/dist/src/infrastructure/services/NodeSSEService.js +71 -27
  88. package/dist/src/infrastructure/services/NodeSSEService.js.map +1 -1
  89. package/dist/src/infrastructure/services/NullBallReframer.d.ts +11 -0
  90. package/dist/src/infrastructure/services/NullBallReframer.d.ts.map +1 -0
  91. package/dist/src/infrastructure/services/NullBallReframer.js +16 -0
  92. package/dist/src/infrastructure/services/NullBallReframer.js.map +1 -0
  93. package/dist/src/infrastructure/services/PythonBallReframer.d.ts +35 -0
  94. package/dist/src/infrastructure/services/PythonBallReframer.d.ts.map +1 -0
  95. package/dist/src/infrastructure/services/PythonBallReframer.js +238 -0
  96. package/dist/src/infrastructure/services/PythonBallReframer.js.map +1 -0
  97. package/dist/src/infrastructure/services/SerialHighlightListener.d.ts +45 -0
  98. package/dist/src/infrastructure/services/SerialHighlightListener.d.ts.map +1 -0
  99. package/dist/src/infrastructure/services/SerialHighlightListener.js +440 -0
  100. package/dist/src/infrastructure/services/SerialHighlightListener.js.map +1 -0
  101. package/dist/src/infrastructure/services/YouTubeUploadService.d.ts +36 -0
  102. package/dist/src/infrastructure/services/YouTubeUploadService.d.ts.map +1 -0
  103. package/dist/src/infrastructure/services/YouTubeUploadService.js +402 -0
  104. package/dist/src/infrastructure/services/YouTubeUploadService.js.map +1 -0
  105. package/dist/src/infrastructure/utils/ResourceSampler.d.ts +47 -0
  106. package/dist/src/infrastructure/utils/ResourceSampler.d.ts.map +1 -0
  107. package/dist/src/infrastructure/utils/ResourceSampler.js +102 -0
  108. package/dist/src/infrastructure/utils/ResourceSampler.js.map +1 -0
  109. package/dist/src/infrastructure/utils/lowPriority.d.ts +29 -0
  110. package/dist/src/infrastructure/utils/lowPriority.d.ts.map +1 -0
  111. package/dist/src/infrastructure/utils/lowPriority.js +31 -0
  112. package/dist/src/infrastructure/utils/lowPriority.js.map +1 -0
  113. package/dist/src/infrastructure/utils/paths.d.ts +27 -0
  114. package/dist/src/infrastructure/utils/paths.d.ts.map +1 -0
  115. package/dist/src/infrastructure/utils/paths.js +69 -0
  116. package/dist/src/infrastructure/utils/paths.js.map +1 -0
  117. package/dist/src/infrastructure/utils/spawnToFile.d.ts +20 -0
  118. package/dist/src/infrastructure/utils/spawnToFile.d.ts.map +1 -0
  119. package/dist/src/infrastructure/utils/spawnToFile.js +98 -0
  120. package/dist/src/infrastructure/utils/spawnToFile.js.map +1 -0
  121. package/dist/src/main.js +228 -2
  122. package/dist/src/main.js.map +1 -1
  123. package/package.json +6 -2
@@ -38,6 +38,7 @@ const child_process_1 = require("child_process");
38
38
  const fs = __importStar(require("fs"));
39
39
  const path = __importStar(require("path"));
40
40
  const canvas_1 = require("@napi-rs/canvas");
41
+ const paths_1 = require("../utils/paths");
41
42
  class NodeFFmpegService {
42
43
  constructor(logger, config) {
43
44
  this.logger = logger;
@@ -56,8 +57,8 @@ class NodeFFmpegService {
56
57
  * The restart mechanism relies on process exit events and the retry parameter
57
58
  * to handle stream recovery after failures.
58
59
  */
59
- async startStream(cameraUrl, streamKey, hasAudio, courtId, retry, isScorecardActivated) {
60
- const command = this.buildStreamCommand(cameraUrl, streamKey, hasAudio, courtId, isScorecardActivated);
60
+ async startStream(cameraUrl, streamKey, hasAudio, courtId, retry, isScorecardActivated, adPaths, highlightBufferDir) {
61
+ const command = this.buildStreamCommand(cameraUrl, streamKey, hasAudio, courtId, isScorecardActivated, adPaths, highlightBufferDir);
61
62
  this.logger.info("Command full form", command);
62
63
  this.logger.info("Starting FFmpeg process", {
63
64
  command: command.fullCommand,
@@ -270,8 +271,8 @@ class NodeFFmpegService {
270
271
  });
271
272
  });
272
273
  }
273
- buildStreamCommand(cameraUrl, streamKey, hasAudio, courtId, isScorecardActivated) {
274
- const rtmpUrl = `rtmp://a.rtmp.youtube.com/live2/${streamKey}`;
274
+ buildStreamCommand(cameraUrl, streamKey, hasAudio, courtId, isScorecardActivated, adPaths, highlightBufferDir) {
275
+ const rtmpUrl = `${this.config.get().stream.youtubeRtmpBase}/${streamKey}`;
275
276
  let fakeAudioInputCounter = 0;
276
277
  let args = [];
277
278
  // Add input parameters
@@ -291,45 +292,152 @@ class NodeFFmpegService {
291
292
  const dsInputIndex = 1 + fakeAudioInputCounter;
292
293
  args.push("-i", this.clientLogoPath); // Input 2: Client logo
293
294
  const clientInputIndex = 2 + fakeAudioInputCounter;
295
+ let nextInputIndex = 3 + fakeAudioInputCounter;
294
296
  let filterComplex = "";
297
+ // Optional scorecard overlay (top-left). Adds one input before any ads.
298
+ let scoreInputIndex = null;
295
299
  if (isScorecardActivated) {
296
300
  const scoreOverlayPath = this.getScoreOverlayPath(courtId);
297
- this.ensureScoreOverlay(scoreOverlayPath);
301
+ // Always start from a fully transparent overlay so nothing is shown until
302
+ // the first live score update arrives. This also wipes any stale scorecard
303
+ // left on disk from a previous match on this court.
304
+ this.resetScoreOverlay(scoreOverlayPath);
298
305
  // Treat the overlay PNG as a continuously looping sequence of images
299
306
  // This allows FFmpeg to reflect file updates cleanly as they are overwritten
300
307
  args.push("-f", "image2", "-loop", "1", "-i", scoreOverlayPath);
301
- const scoreInputIndex = 3 + fakeAudioInputCounter;
302
- // position them correctly using filter complex
303
- filterComplex = [
304
- "[0:v] scale=1920:1080 [base];",
305
- // Top-left score overlay
306
- `[${scoreInputIndex}:v] scale=420:-1:force_original_aspect_ratio=decrease [score];`,
307
- // Bottom-right DropShot watermark
308
- `[${dsInputIndex}:v] scale=500:-1:force_original_aspect_ratio=decrease [ds];`,
309
- // Top-right client logo
310
- `[${clientInputIndex}:v] scale=350:-1:force_original_aspect_ratio=decrease [client];`,
311
- "[base][score] overlay=30:30 [tmp0];",
312
- "[tmp0][ds] overlay=main_w-overlay_w-10:main_h-overlay_h-10 [tmp1];",
313
- "[tmp1][client] overlay=main_w-overlay_w-10:10",
314
- ].join(" ");
308
+ scoreInputIndex = nextInputIndex++;
309
+ }
310
+ // Resolve left/right ad paths and push each as a new input if present.
311
+ // These are fixed PNG "slot" files managed by AdRotator: it overwrites them
312
+ // on a timer to rotate the pool, and ffmpeg reflects each new file via the
313
+ // image2 loop below (same live-reload trick as the score overlay). A missing
314
+ // slot file simply means that side has no ad this session.
315
+ const leftAdPath = adPaths?.left && fs.existsSync(adPaths.left) ? adPaths.left : null;
316
+ const rightAdPath = adPaths?.right && fs.existsSync(adPaths.right) ? adPaths.right : null;
317
+ let leftAdInputIndex = null;
318
+ let rightAdInputIndex = null;
319
+ if (leftAdPath) {
320
+ args.push(...this.buildAdInputFlags(leftAdPath));
321
+ leftAdInputIndex = nextInputIndex++;
322
+ }
323
+ if (rightAdPath) {
324
+ args.push(...this.buildAdInputFlags(rightAdPath));
325
+ rightAdInputIndex = nextInputIndex++;
326
+ }
327
+ const hasAnyAd = leftAdInputIndex !== null || rightAdInputIndex !== null;
328
+ // Highlight buffer: when a buffer dir is configured, branch the scaled
329
+ // frame BEFORE any overlay is applied. One copy ([base]) continues into
330
+ // the existing overlay/RTMP chain completely unchanged; the other
331
+ // ([hlbuf]) becomes a second output that records a raw (no ads/logos)
332
+ // rolling buffer for later highlight-clip extraction. This keeps the
333
+ // camera connection count at exactly one — no second ffmpeg process, no
334
+ // proxy — the split happens inside this same command.
335
+ // Fail-soft: the highlight buffer is a non-critical, secondary output. If
336
+ // its directory can't be created (bad path, permissions, disk full), we
337
+ // must NOT let that abort the live stream — disable the buffer branch for
338
+ // this run and build the command exactly as if it were off. Without this,
339
+ // a throw here propagates up and leaves the stream wedged (the caller's
340
+ // catch doesn't reset state), blocking future starts for the court.
341
+ let highlightBufferEnabled = !!highlightBufferDir;
342
+ if (highlightBufferEnabled) {
343
+ try {
344
+ (0, paths_1.ensureDirSync)(highlightBufferDir);
345
+ }
346
+ catch (error) {
347
+ this.logger.warn("Failed to create highlight buffer dir; continuing without highlight buffer", {
348
+ highlightBufferDir,
349
+ error: error instanceof Error ? error.message : String(error),
350
+ });
351
+ highlightBufferEnabled = false;
352
+ }
353
+ }
354
+ // Build filter graph
355
+ const steps = highlightBufferEnabled
356
+ ? ["[0:v] scale=1920:1080 [scaled];", "[scaled] split=2 [base][hlbuf];"]
357
+ : ["[0:v] scale=1920:1080 [base];"];
358
+ if (scoreInputIndex !== null) {
359
+ steps.push(`[${scoreInputIndex}:v] scale=420:-1:force_original_aspect_ratio=decrease [score];`);
360
+ }
361
+ steps.push(`[${dsInputIndex}:v] scale=500:140:force_original_aspect_ratio=decrease [ds];`, `[${clientInputIndex}:v] scale=400:140:force_original_aspect_ratio=decrease [client];`);
362
+ if (leftAdInputIndex !== null) {
363
+ steps.push(`[${leftAdInputIndex}:v] scale=220:500:force_original_aspect_ratio=decrease [leftAd];`);
364
+ }
365
+ if (rightAdInputIndex !== null) {
366
+ steps.push(`[${rightAdInputIndex}:v] scale=220:500:force_original_aspect_ratio=decrease [rightAd];`);
367
+ }
368
+ // Overlay chain: base → (score) → ds → client → (leftAd) → (rightAd)
369
+ if (scoreInputIndex !== null) {
370
+ steps.push("[base][score] overlay=30:30 [tmp0];", "[tmp0][ds] overlay=main_w-overlay_w-10:main_h-overlay_h-10 [tmp1];");
371
+ }
372
+ else {
373
+ steps.push("[base][ds] overlay=main_w-overlay_w-10:main_h-overlay_h-10 [tmp1];");
374
+ }
375
+ // After client overlay: label output [tmp2] if ads follow, else leave unlabeled (final output)
376
+ if (hasAnyAd) {
377
+ steps.push("[tmp1][client] overlay=main_w-overlay_w-10:10 [tmp2];");
378
+ const adSlots = [
379
+ leftAdInputIndex !== null ? { label: "leftAd", pos: "10:(main_h-overlay_h)/2" } : null,
380
+ rightAdInputIndex !== null ? { label: "rightAd", pos: "main_w-overlay_w-10:(main_h-overlay_h)/2" } : null,
381
+ ].filter((x) => x !== null);
382
+ let cur = "tmp2";
383
+ adSlots.forEach(({ label, pos }, i) => {
384
+ const isLast = i === adSlots.length - 1;
385
+ const next = isLast ? "vout" : `tmp${3 + i}`;
386
+ steps.push(`[${cur}][${label}] overlay=${pos} [${next}]${isLast ? "" : ";"}`);
387
+ cur = next;
388
+ });
389
+ }
390
+ else if (highlightBufferEnabled) {
391
+ // The highlight buffer branch introduces a second named filtergraph
392
+ // pad ([hlbuf]), so the primary chain's output can no longer rely on
393
+ // ffmpeg's "auto-pick the single unlabeled filtergraph output"
394
+ // behavior — that becomes ambiguous with two named pads present. Label
395
+ // it explicitly and map it below, same as the ad-overlay path already
396
+ // has to.
397
+ steps.push("[tmp1][client] overlay=main_w-overlay_w-10:10 [vout]");
315
398
  }
316
399
  else {
317
- filterComplex = [
318
- "[0:v] scale=1920:1080 [base];",
319
- // Bottom-right DropShot watermark
320
- `[${dsInputIndex}:v] scale=500:-1:force_original_aspect_ratio=decrease [ds];`,
321
- // Top-right client logo
322
- `[${clientInputIndex}:v] scale=350:-1:force_original_aspect_ratio=decrease [client];`,
323
- "[base][ds] overlay=main_w-overlay_w-10:main_h-overlay_h-10 [tmp1];",
324
- "[tmp1][client] overlay=main_w-overlay_w-10:10",
325
- ].join(" ");
400
+ steps.push("[tmp1][client] overlay=main_w-overlay_w-10:10");
326
401
  }
402
+ filterComplex = steps.join(" ");
327
403
  args.push("-filter_complex", filterComplex);
404
+ // Whether the primary chain terminates in an explicit [vout] label (vs.
405
+ // ffmpeg's implicit single-output selection) and whether we must emit an
406
+ // explicit -map for it are the SAME decision — derive both from one flag
407
+ // so a future output-adding feature can't update one site and forget the
408
+ // other (which would dangle the label or map a non-existent pad).
409
+ const needsExplicitVout = hasAnyAd || highlightBufferEnabled;
410
+ if (needsExplicitVout) {
411
+ args.push("-map", "[vout]");
412
+ args.push("-map", `${fakeAudioInputCounter}:a`);
413
+ }
328
414
  // audio & video output configurations
329
415
  args.push("-c:v", "libx264", "-preset", "veryfast", "-b:v", "4500k", "-maxrate", "5000k", "-bufsize", "10000k");
330
416
  args.push("-c:a", "aac", "-b:a", "128k", "-ar", "44100", "-ac", "2", "-shortest");
331
417
  // Specify output format for RTMP streaming
332
418
  args.push("-f", "flv", rtmpUrl);
419
+ // Second output: the highlight buffer branch. Deliberately cheap encode
420
+ // (low bitrate, ultrafast, no audio) since this is an intermediate
421
+ // artifact that gets reframed/re-encoded again during highlight
422
+ // processing — quality parity with the broadcast output isn't needed.
423
+ // "-c copy" isn't an option here: [hlbuf] is decoded/filtered video, not
424
+ // an already-encoded bitstream, so it must be encoded to be written out.
425
+ if (highlightBufferEnabled) {
426
+ const segmentSec = this.config.get().highlight.bufferSegmentSec;
427
+ // Unique per stream run (and per retry, since retries rebuild the
428
+ // command). The segment muxer names files by whole-second wall clock
429
+ // (%s), so on a fast restart the respawned process's first segment could
430
+ // land on the same second as the dying process's last one and overwrite
431
+ // it. A per-run token in the name keeps runs from colliding while %s
432
+ // still carries the segment's start time for the buffer manifest.
433
+ const runToken = Date.now().toString(36);
434
+ args.push("-map", "[hlbuf]", "-c:v", "libx264", "-preset", "ultrafast", "-b:v", "800k", "-an",
435
+ // Force a keyframe exactly every segmentSec. The segment muxer can only
436
+ // cut at keyframes; without this, libx264's default GOP (~250 frames,
437
+ // ~8-10s) governs the real segment length and -segment_time is
438
+ // effectively ignored, producing segments far coarser than configured.
439
+ "-force_key_frames", `expr:gte(t,n_forced*${segmentSec})`, "-f", "segment", "-segment_time", String(segmentSec), "-reset_timestamps", "1", "-strftime", "1", path.join(highlightBufferDir, `seg-${runToken}-%s.ts`));
440
+ }
333
441
  const fullCommand = `ffmpeg ${args.join(" ")}`;
334
442
  return {
335
443
  command: "ffmpeg",
@@ -348,6 +456,18 @@ class NodeFFmpegService {
348
456
  await Promise.all(killPromises);
349
457
  this.runningProcesses.clear();
350
458
  }
459
+ // Pick the right ffmpeg input flags for an ad file based on its extension.
460
+ // Animated formats loop via stream_loop; stills via image2 loop.
461
+ // For the looping concat slot video, "-stream_loop -1" makes the input
462
+ // infinite (it never EOFs, so the main encoder's clock never stalls), and
463
+ // "-fflags +genpts" smooths the PTS reset at each loop wrap.
464
+ buildAdInputFlags(adPath) {
465
+ const ext = path.extname(adPath).slice(1).toLowerCase();
466
+ if (NodeFFmpegService.VIDEO_EXTS.has(ext)) {
467
+ return ["-stream_loop", "-1", "-re", "-fflags", "+genpts", "-i", adPath];
468
+ }
469
+ return ["-f", "image2", "-loop", "1", "-i", adPath];
470
+ }
351
471
  validateImageFiles() {
352
472
  const dsLogoPath = path.resolve("./public/ds.png");
353
473
  const clientLogoPath = path.resolve(this.clientLogoPath);
@@ -362,10 +482,11 @@ class NodeFFmpegService {
362
482
  clientLogo: clientLogoPath,
363
483
  });
364
484
  }
365
- ensureScoreOverlay(scoreOverlayPath) {
366
- if (!fs.existsSync(scoreOverlayPath)) {
367
- this.createDefaultScoreOverlay(scoreOverlayPath);
368
- }
485
+ resetScoreOverlay(scoreOverlayPath) {
486
+ // Unconditionally (re)write the transparent placeholder. Unlike an
487
+ // ensure-if-missing check, this guarantees a clean slate on every stream
488
+ // start so a previous match's scorecard never shows on the new stream.
489
+ this.createDefaultScoreOverlay(scoreOverlayPath);
369
490
  }
370
491
  getScoreOverlayPath(courtId) {
371
492
  return path.join(this.scoreOverlayDir, `${courtId}.png`);
@@ -387,4 +508,5 @@ class NodeFFmpegService {
387
508
  }
388
509
  }
389
510
  exports.NodeFFmpegService = NodeFFmpegService;
511
+ NodeFFmpegService.VIDEO_EXTS = new Set(["mp4", "gif", "webm", "mov", "avi", "mkv"]);
390
512
  //# sourceMappingURL=NodeFFmpegService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NodeFFmpegService.js","sourceRoot":"","sources":["../../../../src/infrastructure/services/NodeFFmpegService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NodeFFmpegService.js","sourceRoot":"","sources":["../../../../src/infrastructure/services/NodeFFmpegService.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,14 @@ export declare class NodeSSEService extends EventEmitter implements SSEService {
24
24
  private processEventStream;
25
25
  private parseSSEEvents;
26
26
  private handleSSEEvent;
27
+ /**
28
+ * Normalize the `ads` field from an SSE payload into an AdSpec[].
29
+ *
30
+ * Accepts the new rolling-pool shape (array of { url, duration } or bare URL
31
+ * strings) and the legacy static shape ({ left, right }) for backward
32
+ * compatibility during rollout. Returns undefined when no ads are present.
33
+ */
34
+ private parseAds;
27
35
  private scheduleRetry;
28
36
  private emitConnectionEvent;
29
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NodeSSEService.d.ts","sourceRoot":"","sources":["../../../../src/infrastructure/services/NodeSSEService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EACL,UAAU,EACV,mBAAmB,EACpB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAE7D,qBAAa,cAAe,SAAQ,YAAa,YAAW,UAAU;IAUxD,OAAO,CAAC,QAAQ,CAAC,MAAM;IATnC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,gBAAgB,CACP;IACjB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,YAAY,CAAC,CAAiB;IACtC,OAAO,CAAC,MAAM,CAAC,CAAsB;IACrC,OAAO,CAAC,eAAe,CAAC,CAAkB;gBAEb,MAAM,EAAE,MAAM;IAI9B,KAAK,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IASjD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB3B,WAAW,IAAI,OAAO;IAItB,aAAa,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI;IAI9D,kBAAkB,CACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,cAAc,KAAK,IAAI,GACxE,IAAI;IAIA,mBAAmB,IAAI,WAAW,GAAG,cAAc,GAAG,cAAc;IAIpE,aAAa,IAAI,MAAM;IAIjB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;YAczB,OAAO;YAwFP,kBAAkB;IAoChC,OAAO,CAAC,cAAc;IAgCtB,OAAO,CAAC,cAAc;IAgEtB,OAAO,CAAC,aAAa;IA+BrB,OAAO,CAAC,mBAAmB;CAS5B"}
1
+ {"version":3,"file":"NodeSSEService.d.ts","sourceRoot":"","sources":["../../../../src/infrastructure/services/NodeSSEService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EACL,UAAU,EACV,mBAAmB,EACpB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAE7D,qBAAa,cAAe,SAAQ,YAAa,YAAW,UAAU;IAUxD,OAAO,CAAC,QAAQ,CAAC,MAAM;IATnC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,gBAAgB,CACP;IACjB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,YAAY,CAAC,CAAiB;IACtC,OAAO,CAAC,MAAM,CAAC,CAAsB;IACrC,OAAO,CAAC,eAAe,CAAC,CAAkB;gBAEb,MAAM,EAAE,MAAM;IAI9B,KAAK,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IASjD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB3B,WAAW,IAAI,OAAO;IAItB,aAAa,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI;IAI9D,kBAAkB,CACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,cAAc,KAAK,IAAI,GACxE,IAAI;IAIA,mBAAmB,IAAI,WAAW,GAAG,cAAc,GAAG,cAAc;IAIpE,aAAa,IAAI,MAAM;IAIjB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;YAczB,OAAO;YA4FP,kBAAkB;IAoChC,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,cAAc;IA0EtB;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ;IAyChB,OAAO,CAAC,aAAa;IA+BrB,OAAO,CAAC,mBAAmB;CAS5B"}
@@ -89,6 +89,10 @@ class NodeSSEService extends events_1.EventEmitter {
89
89
  headers: {
90
90
  Accept: "text/event-stream",
91
91
  "Cache-Control": "no-cache",
92
+ // Server-to-server auth; only sent when configured.
93
+ ...(this.config.streamingApiKey
94
+ ? { "x-streaming-api-key": this.config.streamingApiKey }
95
+ : {}),
92
96
  },
93
97
  signal: this.abortController.signal,
94
98
  }),
@@ -157,41 +161,36 @@ class NodeSSEService extends events_1.EventEmitter {
157
161
  }
158
162
  }
159
163
  parseSSEEvents(buffer) {
160
- const events = [];
161
- const lines = buffer.split("\n");
162
- let currentEvent = "";
163
- let i = 0;
164
- while (i < lines.length) {
165
- const line = lines[i];
166
- if (line === "") {
167
- // Empty line indicates end of event
168
- if (currentEvent.trim()) {
169
- events.push(currentEvent.trim());
170
- currentEvent = "";
171
- }
172
- }
173
- else {
174
- currentEvent += line + "\n";
175
- }
176
- i++;
177
- }
178
- // Return complete events and remaining buffer
179
- return {
180
- complete: events,
181
- remaining: currentEvent,
182
- };
164
+ // SSE events are separated by a blank line. Split on the event boundary and
165
+ // keep the trailing partial event (everything after the last separator) in
166
+ // `remaining`, so an event whose `data:` line is split across network chunks
167
+ // is reassembled on the next read rather than corrupted by a stray newline.
168
+ const normalized = buffer.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
169
+ const segments = normalized.split("\n\n");
170
+ const remaining = segments.pop() ?? "";
171
+ const complete = segments
172
+ .map((segment) => segment.trim())
173
+ .filter((segment) => segment.length > 0);
174
+ return { complete, remaining };
183
175
  }
184
176
  handleSSEEvent(eventData) {
185
177
  try {
186
178
  const lines = eventData.split("\n");
187
179
  let data = "";
188
180
  let eventType = "";
181
+ // Per the SSE spec a field may omit the space after the colon, and an event
182
+ // may carry multiple `data:` lines that are joined with newlines.
189
183
  for (const line of lines) {
190
- if (line.startsWith("data: ")) {
191
- data = line.substring(6);
184
+ if (line.startsWith("data:")) {
185
+ const chunk = line.startsWith("data: ")
186
+ ? line.substring(6)
187
+ : line.substring(5);
188
+ data = data ? `${data}\n${chunk}` : chunk;
192
189
  }
193
- else if (line.startsWith("event: ")) {
194
- eventType = line.substring(7);
190
+ else if (line.startsWith("event:")) {
191
+ eventType = (line.startsWith("event: ")
192
+ ? line.substring(7)
193
+ : line.substring(6)).trim();
195
194
  }
196
195
  }
197
196
  if (!data) {
@@ -219,6 +218,7 @@ class NodeSSEService extends events_1.EventEmitter {
219
218
  courtId: parsedData.courtId,
220
219
  reconciliationMode: parsedData.reconciliation_mode || false,
221
220
  isScorecardActivated: parsedData.isScorecardActivated,
221
+ ads: this.parseAds(parsedData.ads),
222
222
  };
223
223
  this.logger.info("Processing SSE stream event", {
224
224
  action: streamEvent.action,
@@ -226,6 +226,7 @@ class NodeSSEService extends events_1.EventEmitter {
226
226
  streamKey: streamEvent.streamKey,
227
227
  reconciliationMode: streamEvent.reconciliationMode,
228
228
  isScorecardActivated: streamEvent.isScorecardActivated,
229
+ ads: streamEvent.ads,
229
230
  });
230
231
  this.emit("streamEvent", streamEvent);
231
232
  }
@@ -236,6 +237,49 @@ class NodeSSEService extends events_1.EventEmitter {
236
237
  });
237
238
  }
238
239
  }
240
+ /**
241
+ * Normalize the `ads` field from an SSE payload into an AdSpec[].
242
+ *
243
+ * Accepts the new rolling-pool shape (array of { url, duration } or bare URL
244
+ * strings) and the legacy static shape ({ left, right }) for backward
245
+ * compatibility during rollout. Returns undefined when no ads are present.
246
+ */
247
+ parseAds(raw) {
248
+ if (!raw)
249
+ return undefined;
250
+ const toSpec = (entry) => {
251
+ if (typeof entry === "string") {
252
+ return entry.trim() ? { url: entry } : null;
253
+ }
254
+ if (entry && typeof entry === "object") {
255
+ // The backend sends each ad as { link, duration }; accept `url` too for
256
+ // our own docs/tests. duration may be null → falls back to the default.
257
+ const obj = entry;
258
+ const rawUrl = typeof obj.url === "string" && obj.url.trim()
259
+ ? obj.url
260
+ : typeof obj.link === "string" && obj.link.trim()
261
+ ? obj.link
262
+ : null;
263
+ if (rawUrl) {
264
+ const duration = typeof obj.duration === "number" && isFinite(obj.duration)
265
+ ? obj.duration
266
+ : undefined;
267
+ return { url: rawUrl, durationSec: duration };
268
+ }
269
+ }
270
+ return null;
271
+ };
272
+ // Normalize both shapes to an entries array, then run the shared pipeline once.
273
+ // New shape: array of { url, duration } objects or bare URL strings.
274
+ // Legacy shape: { left, right } static slot object (backward compat during rollout).
275
+ const entries = Array.isArray(raw)
276
+ ? raw
277
+ : typeof raw === "object" && raw !== null
278
+ ? [raw.left, raw.right]
279
+ : [];
280
+ const specs = entries.map(toSpec).filter((s) => s !== null);
281
+ return specs.length > 0 ? specs : undefined;
282
+ }
239
283
  scheduleRetry() {
240
284
  if (!this.config) {
241
285
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"NodeSSEService.js","sourceRoot":"","sources":["../../../../src/infrastructure/services/NodeSSEService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NodeSSEService.js","sourceRoot":"","sources":["../../../../src/infrastructure/services/NodeSSEService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { BallReframer } from "../../domain/services/BallReframer";
2
+ /**
3
+ * Default BallReframer: does nothing, always returns null so the caller uses
4
+ * the full-frame clip. Active whenever ball-tracking is disabled (the default),
5
+ * so the highlight pipeline produces a full-frame, logo-branded reel with no
6
+ * dependency on Python/OpenCV.
7
+ */
8
+ export declare class NullBallReframer implements BallReframer {
9
+ reframe(): Promise<string | null>;
10
+ }
11
+ //# sourceMappingURL=NullBallReframer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NullBallReframer.d.ts","sourceRoot":"","sources":["../../../../src/infrastructure/services/NullBallReframer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAElE;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IACtC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAG/C"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NullBallReframer = void 0;
4
+ /**
5
+ * Default BallReframer: does nothing, always returns null so the caller uses
6
+ * the full-frame clip. Active whenever ball-tracking is disabled (the default),
7
+ * so the highlight pipeline produces a full-frame, logo-branded reel with no
8
+ * dependency on Python/OpenCV.
9
+ */
10
+ class NullBallReframer {
11
+ async reframe() {
12
+ return null;
13
+ }
14
+ }
15
+ exports.NullBallReframer = NullBallReframer;
16
+ //# sourceMappingURL=NullBallReframer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NullBallReframer.js","sourceRoot":"","sources":["../../../../src/infrastructure/services/NullBallReframer.ts"],"names":[],"mappings":";;;AAEA;;;;;GAKG;AACH,MAAa,gBAAgB;IACpB,KAAK,CAAC,OAAO;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAJD,4CAIC"}
@@ -0,0 +1,35 @@
1
+ import { BallReframer } from "../../domain/services/BallReframer";
2
+ import { Logger } from "../../application/interfaces/Logger";
3
+ /**
4
+ * BallReframer backed by a one-shot Python/OpenCV script (scripts/reframe_ball.py).
5
+ *
6
+ * ── IN SIMPLE WORDS ──
7
+ * Hands the raw clip to a small Python program that watches the ball and writes
8
+ * a cropped, vertical version. If Python isn't installed, the script errors, or
9
+ * it takes too long, we just return null and the full-frame clip is used.
10
+ *
11
+ * ── WHY IT'S BUILT THIS WAY (change at your peril) ──
12
+ * Same one-shot-subprocess pattern as the ffmpeg calls: spawn, wait with a
13
+ * timeout, read back the produced file. It is fail-soft by construction — a
14
+ * missing interpreter, a crash, a timeout, or a missing output file all resolve
15
+ * to null. A highlight must never be lost because tracking misbehaved.
16
+ *
17
+ * ── DO NOT ──
18
+ * - Do NOT let this throw; every error path returns null.
19
+ * - Do NOT enable in production before the CV script is tuned on real padel
20
+ * footage — until then the crop quality is unproven (hence default OFF).
21
+ */
22
+ export declare class PythonBallReframer implements BallReframer {
23
+ private readonly reelAspect;
24
+ private readonly logger;
25
+ private readonly timeoutMs;
26
+ private readonly scriptPath;
27
+ constructor(reelAspect: string, logger: Logger, scriptPath?: string);
28
+ reframe(clipPath: string, courtId: string): Promise<string | null>;
29
+ /** "16:9" -> 1.777…; null when unparseable (caller then just runs the pass). */
30
+ private parseAspect;
31
+ private probeDimensions;
32
+ private isPlayable;
33
+ private runPython;
34
+ }
35
+ //# sourceMappingURL=PythonBallReframer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PythonBallReframer.d.ts","sourceRoot":"","sources":["../../../../src/infrastructure/services/PythonBallReframer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAG7D;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,kBAAmB,YAAW,YAAY;IAUnD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAGjB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EAC/B,UAAU,CAAC,EAAE,MAAM;IAeR,OAAO,CAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA+EzB,gFAAgF;IAChF,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,eAAe;IAwBvB,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,SAAS;CA0BlB"}