prismcast 1.9.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.d.ts +1 -1
- package/dist/app.js +27 -9
- package/dist/app.js.map +1 -1
- package/dist/browser/cdp.js +7 -7
- package/dist/browser/cdp.js.map +1 -1
- package/dist/browser/channelSelection.d.ts +41 -11
- package/dist/browser/channelSelection.js +75 -24
- package/dist/browser/channelSelection.js.map +1 -1
- package/dist/browser/display.d.ts +1 -1
- package/dist/browser/index.d.ts +8 -8
- package/dist/browser/index.js +42 -43
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/login.d.ts +2 -2
- package/dist/browser/login.js +1 -1
- package/dist/browser/manifestInterceptor.d.ts +77 -0
- package/dist/browser/manifestInterceptor.js +323 -0
- package/dist/browser/manifestInterceptor.js.map +1 -0
- package/dist/browser/precaching.js +4 -4
- package/dist/browser/tuning/comcastPolymer.d.ts +1 -1
- package/dist/browser/tuning/cox.d.ts +1 -1
- package/dist/browser/tuning/directv.d.ts +1 -1
- package/dist/browser/tuning/directv.js +61 -62
- package/dist/browser/tuning/directv.js.map +1 -1
- package/dist/browser/tuning/fox.d.ts +1 -1
- package/dist/browser/tuning/fox.js +171 -14
- package/dist/browser/tuning/fox.js.map +1 -1
- package/dist/browser/tuning/hbo.d.ts +1 -1
- package/dist/browser/tuning/hbo.js +6 -6
- package/dist/browser/tuning/hbo.js.map +1 -1
- package/dist/browser/tuning/hulu.d.ts +1 -1
- package/dist/browser/tuning/hulu.js +117 -110
- package/dist/browser/tuning/hulu.js.map +1 -1
- package/dist/browser/tuning/shared.d.ts +3 -3
- package/dist/browser/tuning/shared.js +5 -5
- package/dist/browser/tuning/sling.d.ts +1 -1
- package/dist/browser/tuning/sling.js +28 -28
- package/dist/browser/tuning/sling.js.map +1 -1
- package/dist/browser/tuning/spectrum.d.ts +1 -1
- package/dist/browser/tuning/spectrum.js +21 -22
- package/dist/browser/tuning/spectrum.js.map +1 -1
- package/dist/browser/tuning/thumbnailRow.d.ts +1 -1
- package/dist/browser/tuning/thumbnailRow.js +1 -1
- package/dist/browser/tuning/tileClick.d.ts +1 -1
- package/dist/browser/tuning/tileClick.js +5 -5
- package/dist/browser/tuning/xfinity.d.ts +1 -1
- package/dist/browser/tuning/youtubeTv.d.ts +1 -1
- package/dist/browser/tuning/youtubeTv.js +17 -18
- package/dist/browser/tuning/youtubeTv.js.map +1 -1
- package/dist/browser/video.d.ts +20 -6
- package/dist/browser/video.js +30 -38
- package/dist/browser/video.js.map +1 -1
- package/dist/channels/index.d.ts +1 -2
- package/dist/channels/index.js +73 -40
- package/dist/channels/index.js.map +1 -1
- package/dist/config/channelForm.d.ts +58 -0
- package/dist/config/channelForm.js +129 -0
- package/dist/config/channelForm.js.map +1 -0
- package/dist/config/consistencyProbe.d.ts +7 -0
- package/dist/config/consistencyProbe.js +143 -0
- package/dist/config/consistencyProbe.js.map +1 -0
- package/dist/config/health.d.ts +4 -3
- package/dist/config/health.js +75 -62
- package/dist/config/health.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.js +19 -12
- package/dist/config/index.js.map +1 -1
- package/dist/config/paths.d.ts +9 -3
- package/dist/config/paths.js +12 -4
- package/dist/config/paths.js.map +1 -1
- package/dist/config/persistence.context.d.ts +8 -0
- package/dist/config/persistence.context.js +30 -0
- package/dist/config/persistence.context.js.map +1 -0
- package/dist/config/persistence.d.ts +110 -12
- package/dist/config/persistence.js +351 -32
- package/dist/config/persistence.js.map +1 -1
- package/dist/config/presets.d.ts +14 -4
- package/dist/config/presets.js +84 -75
- package/dist/config/presets.js.map +1 -1
- package/dist/config/profiles.d.ts +2 -2
- package/dist/config/profiles.js +7 -9
- package/dist/config/profiles.js.map +1 -1
- package/dist/config/servicePacks.d.ts +2 -2
- package/dist/config/servicePacks.js +28 -28
- package/dist/config/servicePacks.js.map +1 -1
- package/dist/config/services.d.ts +62 -36
- package/dist/config/services.js +150 -136
- package/dist/config/services.js.map +1 -1
- package/dist/config/sites.d.ts +3 -3
- package/dist/config/sites.js +16 -16
- package/dist/config/sites.js.map +1 -1
- package/dist/config/userChannels.d.ts +500 -41
- package/dist/config/userChannels.js +1201 -312
- package/dist/config/userChannels.js.map +1 -1
- package/dist/config/userConfig.d.ts +103 -10
- package/dist/config/userConfig.js +277 -117
- package/dist/config/userConfig.js.map +1 -1
- package/dist/config/userProfiles.d.ts +4 -2
- package/dist/config/userProfiles.js +72 -26
- package/dist/config/userProfiles.js.map +1 -1
- package/dist/hdhr/channelMap.js +8 -11
- package/dist/hdhr/channelMap.js.map +1 -1
- package/dist/hdhr/deviceId.js +10 -9
- package/dist/hdhr/deviceId.js.map +1 -1
- package/dist/hdhr/discover.js +4 -5
- package/dist/hdhr/discover.js.map +1 -1
- package/dist/hdhr/index.js +6 -10
- package/dist/hdhr/index.js.map +1 -1
- package/dist/index.js +12 -12
- package/dist/index.js.map +1 -1
- package/dist/native/codecInference.d.ts +44 -0
- package/dist/native/codecInference.js +327 -0
- package/dist/native/codecInference.js.map +1 -0
- package/dist/native/decrypt.d.ts +1 -1
- package/dist/native/index.d.ts +5 -5
- package/dist/native/index.js +42 -64
- package/dist/native/index.js.map +1 -1
- package/dist/native/probe.d.ts +27 -9
- package/dist/native/probe.js +158 -67
- package/dist/native/probe.js.map +1 -1
- package/dist/native/proxy.d.ts +4 -2
- package/dist/native/proxy.js +52 -49
- package/dist/native/proxy.js.map +1 -1
- package/dist/native/tokenExpiry.d.ts +22 -0
- package/dist/native/tokenExpiry.js +153 -0
- package/dist/native/tokenExpiry.js.map +1 -0
- package/dist/routes/auth.js +6 -10
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/components.js +2 -2
- package/dist/routes/components.js.map +1 -1
- package/dist/routes/config/channels/endpoints/browse.d.ts +6 -0
- package/dist/routes/config/channels/endpoints/browse.js +195 -0
- package/dist/routes/config/channels/endpoints/browse.js.map +1 -0
- package/dist/routes/config/channels/endpoints/bulk.d.ts +6 -0
- package/dist/routes/config/channels/endpoints/bulk.js +128 -0
- package/dist/routes/config/channels/endpoints/bulk.js.map +1 -0
- package/dist/routes/config/channels/endpoints/crud.d.ts +6 -0
- package/dist/routes/config/channels/endpoints/crud.js +504 -0
- package/dist/routes/config/channels/endpoints/crud.js.map +1 -0
- package/dist/routes/config/channels/endpoints/importExport.d.ts +6 -0
- package/dist/routes/config/channels/endpoints/importExport.js +131 -0
- package/dist/routes/config/channels/endpoints/importExport.js.map +1 -0
- package/dist/routes/config/channels/endpoints/predefined.d.ts +6 -0
- package/dist/routes/config/channels/endpoints/predefined.js +78 -0
- package/dist/routes/config/channels/endpoints/predefined.js.map +1 -0
- package/dist/routes/config/channels/endpoints/prefs.d.ts +6 -0
- package/dist/routes/config/channels/endpoints/prefs.js +58 -0
- package/dist/routes/config/channels/endpoints/prefs.js.map +1 -0
- package/dist/routes/config/channels/endpoints/service.d.ts +6 -0
- package/dist/routes/config/channels/endpoints/service.js +149 -0
- package/dist/routes/config/channels/endpoints/service.js.map +1 -0
- package/dist/routes/config/channels/endpoints/tags.d.ts +6 -0
- package/dist/routes/config/channels/endpoints/tags.js +185 -0
- package/dist/routes/config/channels/endpoints/tags.js.map +1 -0
- package/dist/routes/config/channels/http/handler.d.ts +10 -0
- package/dist/routes/config/channels/http/handler.js +20 -0
- package/dist/routes/config/channels/http/handler.js.map +1 -0
- package/dist/routes/config/channels/http/playlistHint.d.ts +25 -0
- package/dist/routes/config/channels/http/playlistHint.js +40 -0
- package/dist/routes/config/channels/http/playlistHint.js.map +1 -0
- package/dist/routes/config/channels/http/serviceWarning.d.ts +10 -0
- package/dist/routes/config/channels/http/serviceWarning.js +28 -0
- package/dist/routes/config/channels/http/serviceWarning.js.map +1 -0
- package/dist/routes/config/channels/index.d.ts +3 -3
- package/dist/routes/config/channels/index.js +1 -1
- package/dist/routes/config/channels/index.js.map +1 -1
- package/dist/routes/config/channels/{routes.d.ts → setup.d.ts} +1 -1
- package/dist/routes/config/channels/setup.js +23 -0
- package/dist/routes/config/channels/setup.js.map +1 -0
- package/dist/routes/config/channels/table.d.ts +9 -9
- package/dist/routes/config/channels/table.js +124 -76
- package/dist/routes/config/channels/table.js.map +1 -1
- package/dist/routes/config/http/envelope.d.ts +111 -0
- package/dist/routes/config/http/envelope.js +103 -0
- package/dist/routes/config/http/envelope.js.map +1 -0
- package/dist/routes/config/index.d.ts +9 -9
- package/dist/routes/config/index.js +2 -2
- package/dist/routes/config/index.js.map +1 -1
- package/dist/routes/config/services.js +69 -68
- package/dist/routes/config/services.js.map +1 -1
- package/dist/routes/config/settings.d.ts +1 -1
- package/dist/routes/config/settings.js +45 -38
- package/dist/routes/config/settings.js.map +1 -1
- package/dist/routes/debug.js +12 -11
- package/dist/routes/debug.js.map +1 -1
- package/dist/routes/icons.js +2 -2
- package/dist/routes/icons.js.map +1 -1
- package/dist/routes/logs.js +19 -30
- package/dist/routes/logs.js.map +1 -1
- package/dist/routes/mpegts.js +1 -1
- package/dist/routes/playlist.d.ts +1 -1
- package/dist/routes/playlist.js +37 -26
- package/dist/routes/playlist.js.map +1 -1
- package/dist/routes/root/content.js +27 -6
- package/dist/routes/root/content.js.map +1 -1
- package/dist/routes/root/index.js +2 -5
- package/dist/routes/root/index.js.map +1 -1
- package/dist/routes/root/scripts/channels.js +16 -16
- package/dist/routes/root/scripts/channels.js.map +1 -1
- package/dist/routes/root/scripts/config.js +59 -59
- package/dist/routes/root/scripts/config.js.map +1 -1
- package/dist/routes/root/scripts/index.d.ts +4 -4
- package/dist/routes/root/scripts/shared.js +24 -10
- package/dist/routes/root/scripts/shared.js.map +1 -1
- package/dist/routes/root/scripts/status.d.ts +4 -0
- package/dist/routes/root/scripts/status.handlers.d.ts +182 -0
- package/dist/routes/root/scripts/status.handlers.js +713 -0
- package/dist/routes/root/scripts/status.handlers.js.map +1 -0
- package/dist/routes/root/scripts/status.js +86 -488
- package/dist/routes/root/scripts/status.js.map +1 -1
- package/dist/routes/root/styles.js +5 -5
- package/dist/routes/services.js +18 -15
- package/dist/routes/services.js.map +1 -1
- package/dist/routes/sse.d.ts +16 -0
- package/dist/routes/sse.js +29 -0
- package/dist/routes/sse.js.map +1 -0
- package/dist/routes/streams.js +10 -23
- package/dist/routes/streams.js.map +1 -1
- package/dist/routes/ui.d.ts +2 -2
- package/dist/routes/upgrade.js +6 -7
- package/dist/routes/upgrade.js.map +1 -1
- package/dist/service/commands.context.d.ts +6 -0
- package/dist/service/commands.context.js +47 -0
- package/dist/service/commands.context.js.map +1 -0
- package/dist/service/commands.d.ts +53 -8
- package/dist/service/commands.js +171 -188
- package/dist/service/commands.js.map +1 -1
- package/dist/service/generators.context.d.ts +6 -0
- package/dist/service/generators.context.js +45 -0
- package/dist/service/generators.context.js.map +1 -0
- package/dist/service/generators.d.ts +56 -16
- package/dist/service/generators.js +499 -383
- package/dist/service/generators.js.map +1 -1
- package/dist/service/index.d.ts +2 -2
- package/dist/streaming/clients.d.ts +2 -2
- package/dist/streaming/clients.js +2 -2
- package/dist/streaming/codec.d.ts +2 -2
- package/dist/streaming/codec.js +0 -1
- package/dist/streaming/codec.js.map +1 -1
- package/dist/streaming/fmp4Segmenter.d.ts +2 -2
- package/dist/streaming/fmp4Segmenter.js +12 -12
- package/dist/streaming/hls.d.ts +3 -3
- package/dist/streaming/hls.js +81 -70
- package/dist/streaming/hls.js.map +1 -1
- package/dist/streaming/hlsResume.d.ts +3 -3
- package/dist/streaming/hlsResume.js +5 -5
- package/dist/streaming/hlsSegments.d.ts +5 -2
- package/dist/streaming/hlsSegments.js +14 -9
- package/dist/streaming/hlsSegments.js.map +1 -1
- package/dist/streaming/monitor.d.ts +12 -12
- package/dist/streaming/monitor.js +80 -54
- package/dist/streaming/monitor.js.map +1 -1
- package/dist/streaming/mp4Parser.d.ts +34 -4
- package/dist/streaming/mp4Parser.js +111 -29
- package/dist/streaming/mp4Parser.js.map +1 -1
- package/dist/streaming/mpegts.d.ts +1 -1
- package/dist/streaming/mpegts.js +13 -10
- package/dist/streaming/mpegts.js.map +1 -1
- package/dist/streaming/playlistBuilder.d.ts +1 -1
- package/dist/streaming/playlistBuilder.js +2 -2
- package/dist/streaming/preroll.d.ts +9 -9
- package/dist/streaming/preroll.js +39 -41
- package/dist/streaming/preroll.js.map +1 -1
- package/dist/streaming/pretune.js +4 -4
- package/dist/streaming/pretune.js.map +1 -1
- package/dist/streaming/recovery.d.ts +3 -3
- package/dist/streaming/recovery.js +4 -4
- package/dist/streaming/registry.d.ts +6 -6
- package/dist/streaming/setup.d.ts +9 -8
- package/dist/streaming/setup.js +97 -49
- package/dist/streaming/setup.js.map +1 -1
- package/dist/streaming/showInfo.d.ts +9 -3
- package/dist/streaming/showInfo.js +26 -18
- package/dist/streaming/showInfo.js.map +1 -1
- package/dist/streaming/statusEmitter.d.ts +4 -4
- package/dist/streaming/statusEmitter.js +2 -2
- package/dist/types/channels.d.ts +133 -34
- package/dist/types/channels.js +39 -1
- package/dist/types/channels.js.map +1 -1
- package/dist/types/config.d.ts +20 -1
- package/dist/types/index.d.ts +9 -8
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/profiles.d.ts +5 -4
- package/dist/types/selection.d.ts +48 -4
- package/dist/types/streaming.d.ts +1 -1
- package/dist/upgrade/commands.context.d.ts +6 -0
- package/dist/upgrade/commands.context.js +29 -0
- package/dist/upgrade/commands.context.js.map +1 -0
- package/dist/upgrade/commands.d.ts +29 -2
- package/dist/upgrade/commands.js +87 -134
- package/dist/upgrade/commands.js.map +1 -1
- package/dist/upgrade/detection.context.d.ts +6 -0
- package/dist/upgrade/detection.context.js +24 -0
- package/dist/upgrade/detection.context.js.map +1 -0
- package/dist/upgrade/detection.d.ts +140 -10
- package/dist/upgrade/detection.js +153 -66
- package/dist/upgrade/detection.js.map +1 -1
- package/dist/upgrade/index.d.ts +2 -2
- package/dist/utils/chromeFetch.d.ts +1 -1
- package/dist/utils/chromeFetch.js +1 -1
- package/dist/utils/clock.d.ts +14 -0
- package/dist/utils/clock.js +28 -0
- package/dist/utils/clock.js.map +1 -0
- package/dist/utils/debugFilter.d.ts +1 -1
- package/dist/utils/debugFilter.js +6 -4
- package/dist/utils/debugFilter.js.map +1 -1
- package/dist/utils/delay.d.ts +2 -3
- package/dist/utils/delay.js +10 -16
- package/dist/utils/delay.js.map +1 -1
- package/dist/utils/evaluate.js +12 -14
- package/dist/utils/evaluate.js.map +1 -1
- package/dist/utils/ffmpeg.context.d.ts +6 -0
- package/dist/utils/ffmpeg.context.js +31 -0
- package/dist/utils/ffmpeg.context.js.map +1 -0
- package/dist/utils/ffmpeg.d.ts +85 -29
- package/dist/utils/ffmpeg.js +126 -129
- package/dist/utils/ffmpeg.js.map +1 -1
- package/dist/utils/fileLogger.d.ts +18 -2
- package/dist/utils/fileLogger.js +58 -30
- package/dist/utils/fileLogger.js.map +1 -1
- package/dist/utils/format.d.ts +1 -1
- package/dist/utils/format.js +2 -2
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/html.js +1 -3
- package/dist/utils/html.js.map +1 -1
- package/dist/utils/index.d.ts +21 -20
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.js +16 -20
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/m3u.d.ts +18 -3
- package/dist/utils/m3u.js +28 -14
- package/dist/utils/m3u.js.map +1 -1
- package/dist/utils/memo.d.ts +19 -0
- package/dist/utils/memo.js +53 -0
- package/dist/utils/memo.js.map +1 -0
- package/dist/utils/morganStream.js +2 -2
- package/dist/utils/morganStream.js.map +1 -1
- package/dist/utils/pid.d.ts +2 -2
- package/dist/utils/pid.js +2 -2
- package/dist/utils/platform.d.ts +1 -1
- package/dist/utils/platform.js +3 -3
- package/dist/utils/platform.js.map +1 -1
- package/dist/utils/retry.d.ts +2 -0
- package/dist/utils/retry.js +9 -7
- package/dist/utils/retry.js.map +1 -1
- package/dist/utils/sanitize.d.ts +2 -2
- package/dist/utils/sanitize.js +4 -4
- package/dist/utils/timing.d.ts +6 -3
- package/dist/utils/timing.js +10 -6
- package/dist/utils/timing.js.map +1 -1
- package/dist/utils/version.d.ts +3 -2
- package/dist/utils/version.js +14 -27
- package/dist/utils/version.js.map +1 -1
- package/package.json +13 -7
- package/dist/native/intercept.d.ts +0 -35
- package/dist/native/intercept.js +0 -181
- package/dist/native/intercept.js.map +0 -1
- package/dist/routes/config/channels/routes.js +0 -1505
- package/dist/routes/config/channels/routes.js.map +0 -1
package/dist/streaming/mpegts.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
*
|
|
3
3
|
* mpegts.ts: MPEG-TS streaming handler for PrismCast.
|
|
4
4
|
*/
|
|
5
|
-
import { LOG, formatError, spawnMpegTsRemuxer } from "../utils/index.js";
|
|
5
|
+
import { LOG, formatError, resolveFFmpegPath, spawnMpegTsRemuxer } from "../utils/index.js";
|
|
6
6
|
import { getStream, updateLastAccess } from "./registry.js";
|
|
7
7
|
import { initializeStream, sendValidationError, validateChannel } from "./hls.js";
|
|
8
8
|
import { registerClient, unregisterClient } from "./clients.js";
|
|
@@ -13,7 +13,7 @@ import { waitForInitSegment } from "./hlsSegments.js";
|
|
|
13
13
|
/* This module provides a continuous MPEG-TS byte stream for HDHomeRun-compatible clients (such as Plex) that expect raw MPEG-TS when tuning a channel. Two delivery
|
|
14
14
|
* modes are supported:
|
|
15
15
|
*
|
|
16
|
-
* Capture mode (fMP4
|
|
16
|
+
* Capture mode (fMP4 -> MPEG-TS): The capture pipeline produces fMP4 segments. Each MPEG-TS client gets its own FFmpeg remuxer that converts fMP4 to MPEG-TS with
|
|
17
17
|
* codec copy (no transcoding). FFmpeg reads the init segment + media segments from stdin and outputs a continuous MPEG-TS stream on stdout, piped to the HTTP response.
|
|
18
18
|
*
|
|
19
19
|
* Native mode (MPEG-TS pass-through): The native HLS proxy already produces MPEG-TS segments. These are written directly to the HTTP response without any remuxing.
|
|
@@ -27,7 +27,7 @@ import { waitForInitSegment } from "./hlsSegments.js";
|
|
|
27
27
|
* mode-appropriate serving path (FFmpeg remuxer for capture mode, direct pass-through for native mode).
|
|
28
28
|
*
|
|
29
29
|
* For new streams, headers are flushed before stream setup begins so the client sees an immediate 200 response. This prevents timeout failures during the 4-10+
|
|
30
|
-
* second startup sequence. The trade-off is that error responses cannot be sent after the flush
|
|
30
|
+
* second startup sequence. The trade-off is that error responses cannot be sent after the flush - failures are logged server-side and the connection is closed.
|
|
31
31
|
*
|
|
32
32
|
* Route: GET /stream/:name
|
|
33
33
|
*
|
|
@@ -47,14 +47,14 @@ export async function handleMpegTsStream(req, res) {
|
|
|
47
47
|
await serveMpegTsStream(existingStreamId, channelName, req, res);
|
|
48
48
|
return;
|
|
49
49
|
}
|
|
50
|
-
// No existing stream
|
|
50
|
+
// No existing stream - validate the channel before flushing headers. This ensures we can still return proper error responses for invalid channels, disabled
|
|
51
51
|
// channels, and login mode.
|
|
52
52
|
const validation = validateChannel(channelName);
|
|
53
53
|
if (!validation.valid) {
|
|
54
54
|
sendValidationError(validation, res);
|
|
55
55
|
return;
|
|
56
56
|
}
|
|
57
|
-
// Flush HTTP 200 headers immediately. The client sees "connection accepted, data coming" and waits patiently. After this point, we cannot send error status codes
|
|
57
|
+
// Flush HTTP 200 headers immediately. The client sees "connection accepted, data coming" and waits patiently. After this point, we cannot send error status codes -
|
|
58
58
|
// failures will close the connection with no data.
|
|
59
59
|
res.setHeader("Cache-Control", "no-cache");
|
|
60
60
|
res.setHeader("Connection", "close");
|
|
@@ -70,7 +70,7 @@ export async function handleMpegTsStream(req, res) {
|
|
|
70
70
|
channelName,
|
|
71
71
|
clientAddress: req.ip ?? req.socket.remoteAddress ?? null,
|
|
72
72
|
mpegTsClient: true,
|
|
73
|
-
profileOverride: req.query
|
|
73
|
+
profileOverride: req.query["profile"],
|
|
74
74
|
url: validation.channel.url
|
|
75
75
|
});
|
|
76
76
|
}
|
|
@@ -127,7 +127,7 @@ async function serveMpegTsStream(streamId, channelName, req, res) {
|
|
|
127
127
|
}
|
|
128
128
|
return;
|
|
129
129
|
}
|
|
130
|
-
// For native-mode streams, segments are already MPEG-TS
|
|
130
|
+
// For native-mode streams, segments are already MPEG-TS - write them directly to the response without FFmpeg.
|
|
131
131
|
if (stream.streamingMode === "native") {
|
|
132
132
|
connectMpegTsClient({
|
|
133
133
|
logLabel: "Native MPEG-TS",
|
|
@@ -160,10 +160,13 @@ async function serveMpegTsStream(streamId, channelName, req, res) {
|
|
|
160
160
|
}
|
|
161
161
|
// Spawn an FFmpeg process to remux fMP4 to MPEG-TS. The process reads concatenated fMP4 (init segment + media segments) from stdin and outputs a continuous
|
|
162
162
|
// MPEG-TS stream on stdout. Video (H264) and audio (AAC) are copied without transcoding. We declare cleanup as a let so the error callback can reference it before
|
|
163
|
-
// connectMpegTsClient assigns the real implementation
|
|
163
|
+
// connectMpegTsClient assigns the real implementation - all assignments happen synchronously before any async events can fire.
|
|
164
164
|
let cleanup = () => { };
|
|
165
165
|
const streamLog = LOG.withStreamId(stream.streamIdStr);
|
|
166
|
-
|
|
166
|
+
// Resolved FFmpeg binary path. Falls back to "ffmpeg" so spawn() defers to PATH lookup if the resolver couldn't find one (matching previous behavior; the
|
|
167
|
+
// spawn will then fail with ENOENT if PATH is also empty).
|
|
168
|
+
const ffmpegBin = (await resolveFFmpegPath()) ?? "ffmpeg";
|
|
169
|
+
const remuxer = spawnMpegTsRemuxer(ffmpegBin, (error) => {
|
|
167
170
|
streamLog.debug("streaming:mpegts", "MPEG-TS remuxer error: %s.", formatError(error));
|
|
168
171
|
cleanup();
|
|
169
172
|
if (!res.writableEnded) {
|
|
@@ -178,7 +181,7 @@ async function serveMpegTsStream(streamId, channelName, req, res) {
|
|
|
178
181
|
beforeCatchup: () => {
|
|
179
182
|
// Pipe FFmpeg stdout to the HTTP response. When FFmpeg exits (either from stdin ending or being killed), stdout closes and the response ends automatically.
|
|
180
183
|
remuxer.stdout.pipe(res);
|
|
181
|
-
// Write the init segment first
|
|
184
|
+
// Write the init segment first - FFmpeg needs the ftyp and moov boxes before it can process any media segments.
|
|
182
185
|
remuxer.stdin.write(stream.hls.initSegment);
|
|
183
186
|
},
|
|
184
187
|
extraCleanup: () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mpegts.js","sourceRoot":"","sources":["../../src/streaming/mpegts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"mpegts.js","sourceRoot":"","sources":["../../src/streaming/mpegts.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,7 +25,7 @@ export interface PlaylistOptions {
|
|
|
25
25
|
}
|
|
26
26
|
/**
|
|
27
27
|
* Builds an HLS playlist string from playlist options and an ordered array of segment entries. This is the single formatting function used by all playlist generators
|
|
28
|
-
* in PrismCast
|
|
28
|
+
* in PrismCast - the capture-mode fMP4 segmenter, the native HLS proxy, and the standalone preroll playlist. The builder is stateless and pure: it iterates the
|
|
29
29
|
* entries, emits the appropriate HLS tags for each, and returns the formatted m3u8 string.
|
|
30
30
|
*
|
|
31
31
|
* Per-segment tag ordering follows the HLS spec and preserves the ordering used by both existing generators: DISCONTINUITY, MAP, PROGRAM-DATE-TIME, CUE-IN,
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// Playlist Builder.
|
|
6
6
|
/**
|
|
7
7
|
* Builds an HLS playlist string from playlist options and an ordered array of segment entries. This is the single formatting function used by all playlist generators
|
|
8
|
-
* in PrismCast
|
|
8
|
+
* in PrismCast - the capture-mode fMP4 segmenter, the native HLS proxy, and the standalone preroll playlist. The builder is stateless and pure: it iterates the
|
|
9
9
|
* entries, emits the appropriate HLS tags for each, and returns the formatted m3u8 string.
|
|
10
10
|
*
|
|
11
11
|
* Per-segment tag ordering follows the HLS spec and preserves the ordering used by both existing generators: DISCONTINUITY, MAP, PROGRAM-DATE-TIME, CUE-IN,
|
|
@@ -30,7 +30,7 @@ export function buildPlaylist(options, entries) {
|
|
|
30
30
|
"#EXT-X-MEDIA-SEQUENCE:" + String(options.mediaSequence)
|
|
31
31
|
];
|
|
32
32
|
// Emit DISCONTINUITY-SEQUENCE when the caller provides a value. The distinction between undefined (no discontinuities in the stream's history) and 0
|
|
33
|
-
// (discontinuities exist but none have scrolled off the window) is meaningful for spec compliance
|
|
33
|
+
// (discontinuities exist but none have scrolled off the window) is meaningful for spec compliance - both capture and native paths control this independently.
|
|
34
34
|
if (options.discontinuitySequence !== undefined) {
|
|
35
35
|
lines.push("#EXT-X-DISCONTINUITY-SEQUENCE:" + String(options.discontinuitySequence));
|
|
36
36
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { type CaptureCodec } from "./codec.
|
|
1
|
+
import { type CaptureCodec } from "./codec.ts";
|
|
2
2
|
import type { Express } from "express";
|
|
3
|
-
import type { PlaylistSegmentEntry } from "./playlistBuilder.
|
|
3
|
+
import type { PlaylistSegmentEntry } from "./playlistBuilder.ts";
|
|
4
4
|
/**
|
|
5
5
|
* Returns true when the specified preroll variant has been generated and is ready to serve.
|
|
6
6
|
* @param codec - The preroll codec variant to check.
|
|
@@ -48,7 +48,7 @@ export declare function getPrerollCodec(): CaptureCodec;
|
|
|
48
48
|
*
|
|
49
49
|
* Each variant spawns FFmpeg to create PREROLL_TOTAL_DURATION seconds of black frame + silence as fragmented MP4, then splits the output into an init segment
|
|
50
50
|
* (ftyp + moov) and individual media segments (moof + mdat pairs) using the MP4 box parser. Each segment has naturally monotonic PTS because it comes from a
|
|
51
|
-
* continuous FFmpeg encode. If the bundled FFmpeg is unavailable or a variant fails, the system degrades gracefully
|
|
51
|
+
* continuous FFmpeg encode. If the bundled FFmpeg is unavailable or a variant fails, the system degrades gracefully - the blocking stream setup path is used instead.
|
|
52
52
|
*/
|
|
53
53
|
export declare function generatePreroll(): Promise<void>;
|
|
54
54
|
/**
|
|
@@ -63,7 +63,7 @@ export interface PrerollWindowOptions {
|
|
|
63
63
|
/**
|
|
64
64
|
* Computes the sliding window start index for a composite playlist containing both preroll and real segments. The start index is determined by three constraints:
|
|
65
65
|
* (1) never negative, (2) the standard sliding window rule (current index minus window size), and (3) the preroll cap that limits how many preroll entries appear in
|
|
66
|
-
* the window. The third constraint is the key addition
|
|
66
|
+
* the window. The third constraint is the key addition - it prevents clients from playing through many seconds of remaining preroll before reaching live content.
|
|
67
67
|
*
|
|
68
68
|
* @param options - Window computation parameters.
|
|
69
69
|
* @returns The start index for the composite playlist window.
|
|
@@ -81,7 +81,7 @@ export interface PrerollEntryOptions {
|
|
|
81
81
|
}
|
|
82
82
|
/**
|
|
83
83
|
* Builds an array of playlist segment entries for preroll segments within the given index range. Each entry has an absolute URL pointing to the global /preroll/ route
|
|
84
|
-
* and the duration extracted from the preroll segment cache. No per-segment metadata tags (DISCONTINUITY, PROGRAM-DATE-TIME, etc.) are set
|
|
84
|
+
* and the duration extracted from the preroll segment cache. No per-segment metadata tags (DISCONTINUITY, PROGRAM-DATE-TIME, etc.) are set - preroll is synthetic
|
|
85
85
|
* placeholder content.
|
|
86
86
|
*
|
|
87
87
|
* @param options - Entry construction parameters.
|
|
@@ -91,7 +91,7 @@ export declare function buildPrerollEntries(options: PrerollEntryOptions): Playl
|
|
|
91
91
|
/**
|
|
92
92
|
* Computes how many preroll segments should be visible based on elapsed wall-clock time since the preroll started. The initial window (PREROLL_INITIAL_WINDOW segments)
|
|
93
93
|
* is revealed immediately so the client has enough content to begin playback per the HLS 3-from-end rule. Additional segments are revealed one at a time as wall-clock
|
|
94
|
-
* time passes
|
|
94
|
+
* time passes - each new segment appears when enough time has elapsed for the client to have consumed the prior content beyond the initial window.
|
|
95
95
|
*
|
|
96
96
|
* @param codec - The preroll codec variant.
|
|
97
97
|
* @param prerollStartTime - Wall-clock time when the preroll began.
|
|
@@ -100,14 +100,14 @@ export declare function buildPrerollEntries(options: PrerollEntryOptions): Playl
|
|
|
100
100
|
export declare function computeProgressiveReveal(codec: CaptureCodec, prerollStartTime: Date): number;
|
|
101
101
|
/**
|
|
102
102
|
* Generates a progressive HLS playlist referencing the global preroll segments for the specified codec. The playlist simulates a live stream by revealing segments
|
|
103
|
-
* based on elapsed wall-clock time since the preroll started. On each client poll, more segments become visible
|
|
103
|
+
* based on elapsed wall-clock time since the preroll started. On each client poll, more segments become visible - the client sees new content appear and keeps playing
|
|
104
104
|
* without stalling.
|
|
105
105
|
*
|
|
106
106
|
* The playlist uses absolute URLs because preroll segments are served at global routes (/preroll/:codec/*) while the playlist itself is served under /hls/:name/.
|
|
107
|
-
* Without absolute URLs, the client would request /hls/:name/preroll/... which does not exist. The playlist omits #EXT-X-ENDLIST so it behaves as a live playlist
|
|
107
|
+
* Without absolute URLs, the client would request /hls/:name/preroll/... which does not exist. The playlist omits #EXT-X-ENDLIST so it behaves as a live playlist -
|
|
108
108
|
* the client polls for updates and receives the real content playlist when ready.
|
|
109
109
|
*
|
|
110
|
-
* PROGRAM-DATE-TIME is intentionally omitted from the preroll playlist. Preroll is synthetic placeholder content
|
|
110
|
+
* PROGRAM-DATE-TIME is intentionally omitted from the preroll playlist. Preroll is synthetic placeholder content - assigning it wall-clock timestamps would be
|
|
111
111
|
* misleading and would create a backward time jump at the preroll-to-live boundary (preroll PDT would overshoot real content PDT because the preroll covers 30
|
|
112
112
|
* seconds of content but real content typically arrives in ~15 seconds). PDT is emitted only on real segments once the segmenter produces them.
|
|
113
113
|
*
|
|
@@ -9,8 +9,9 @@ import { CONFIG } from "../config/index.js";
|
|
|
9
9
|
import { buildPlaylist } from "./playlistBuilder.js";
|
|
10
10
|
import { getEffectiveViewport } from "../config/presets.js";
|
|
11
11
|
import { spawn } from "node:child_process";
|
|
12
|
+
import { buffer as streamToBuffer } from "node:stream/consumers";
|
|
12
13
|
/* When a client requests an HLS playlist for a channel that is still starting up, PrismCast returns a startup playlist immediately to prevent HTTP timeouts. Channels
|
|
13
|
-
* DVR requires at least one segment in the playlist
|
|
14
|
+
* DVR requires at least one segment in the playlist - an empty playlist is rejected with "Playlist had no segments." This module generates PREROLL_TOTAL_DURATION
|
|
14
15
|
* seconds of black+silence fMP4 at server startup, splits it into individual segments with naturally monotonic PTS, and serves them via global routes so the startup
|
|
15
16
|
* playlist can reference valid media content.
|
|
16
17
|
*
|
|
@@ -19,7 +20,7 @@ import { spawn } from "node:child_process";
|
|
|
19
20
|
* The bundled ffmpeg-for-homebridge binary (which includes libx265) is used for all preroll generation, bypassing the Channels DVR FFmpeg whose minimal encoder
|
|
20
21
|
* set may lack HEVC support.
|
|
21
22
|
*
|
|
22
|
-
* The preroll playlist is served progressively
|
|
23
|
+
* The preroll playlist is served progressively - segments are revealed over time based on elapsed wall-clock time, simulating a live stream. The client polls for
|
|
23
24
|
* updates, sees new segments appear, and keeps playing without stalling for the full duration of the tune. When real content arrives, the fMP4 segmenter's composite
|
|
24
25
|
* playlist takes over, including preroll entries in its sliding window during the transition. As real segments accumulate, preroll entries fall off the window and the
|
|
25
26
|
* playlist becomes purely live content.
|
|
@@ -123,12 +124,12 @@ export function getPrerollCodec() {
|
|
|
123
124
|
*
|
|
124
125
|
* Each variant spawns FFmpeg to create PREROLL_TOTAL_DURATION seconds of black frame + silence as fragmented MP4, then splits the output into an init segment
|
|
125
126
|
* (ftyp + moov) and individual media segments (moof + mdat pairs) using the MP4 box parser. Each segment has naturally monotonic PTS because it comes from a
|
|
126
|
-
* continuous FFmpeg encode. If the bundled FFmpeg is unavailable or a variant fails, the system degrades gracefully
|
|
127
|
+
* continuous FFmpeg encode. If the bundled FFmpeg is unavailable or a variant fails, the system degrades gracefully - the blocking stream setup path is used instead.
|
|
127
128
|
*/
|
|
128
129
|
export async function generatePreroll() {
|
|
129
130
|
const ffmpegBin = getBundledFFmpegPath();
|
|
130
131
|
if (!ffmpegBin) {
|
|
131
|
-
LOG.warn("Bundled FFmpeg is not available. Preroll generation skipped
|
|
132
|
+
LOG.warn("Bundled FFmpeg is not available. Preroll generation skipped - startup playlists will have no segments.");
|
|
132
133
|
return;
|
|
133
134
|
}
|
|
134
135
|
// Use the effective viewport to match the resolution Chrome MediaRecorder will produce. This prevents a resolution mismatch at the preroll-to-live discontinuity
|
|
@@ -136,7 +137,7 @@ export async function generatePreroll() {
|
|
|
136
137
|
const viewport = getEffectiveViewport(CONFIG);
|
|
137
138
|
const size = String(viewport.width) + "x" + String(viewport.height);
|
|
138
139
|
// Generate the H.264 variant. Baseline profile and level 3.1 match Chrome's MediaRecorder output (confirmed via parseMoovCodecConfig telemetry). Slow preset and
|
|
139
|
-
// CRF 18 produce higher quality
|
|
140
|
+
// CRF 18 produce higher quality - acceptable for a short duration of simple content generated once at startup.
|
|
140
141
|
await generateVariant(ffmpegBin, "h264", [
|
|
141
142
|
"-c:v", "libx264", "-preset", "slow", "-tune", "stillimage", "-profile:v", "baseline", "-level", "3.1", "-pix_fmt", "yuv420p",
|
|
142
143
|
"-crf", "18"
|
|
@@ -198,29 +199,26 @@ async function generateVariant(ffmpegBin, codec, videoArgs, size) {
|
|
|
198
199
|
* @returns Promise resolving to the complete stdout output as a Buffer.
|
|
199
200
|
*/
|
|
200
201
|
async function spawnAndCollect(ffmpegBin, args) {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
const
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
reject(new Error("FFmpeg exited with code " + String(code) + "."));
|
|
219
|
-
return;
|
|
220
|
-
}
|
|
221
|
-
resolve(Buffer.concat(chunks));
|
|
222
|
-
});
|
|
202
|
+
const ffmpeg = spawn(ffmpegBin, args, { stdio: ["ignore", "pipe", "pipe"] });
|
|
203
|
+
ffmpeg.stderr.on("data", (data) => {
|
|
204
|
+
const message = data.toString().trim();
|
|
205
|
+
if (message.length > 0) {
|
|
206
|
+
LOG.debug("streaming:preroll", "FFmpeg: %s", message);
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
// Race stdout-collection against the process exit. streamToBuffer resolves when stdout closes; the exit listener pins the success/failure of the spawn itself.
|
|
210
|
+
// eslint-disable-next-line @typescript-eslint/no-invalid-void-type -- Standard pattern for signal promises.
|
|
211
|
+
const { promise: exitPromise, resolve: signalExit, reject: signalExitFailure } = Promise.withResolvers();
|
|
212
|
+
ffmpeg.on("error", signalExitFailure);
|
|
213
|
+
ffmpeg.on("exit", (code) => {
|
|
214
|
+
if (code === 0) {
|
|
215
|
+
signalExit();
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
signalExitFailure(new Error("FFmpeg exited with code " + String(code) + "."));
|
|
223
219
|
});
|
|
220
|
+
const [output] = await Promise.all([streamToBuffer(ffmpeg.stdout), exitPromise]);
|
|
221
|
+
return output;
|
|
224
222
|
}
|
|
225
223
|
/**
|
|
226
224
|
* Splits an fMP4 buffer into an init segment (ftyp + moov) and individual media segments (moof + mdat pairs) using the MP4 box parser. The init segment contains codec
|
|
@@ -275,11 +273,11 @@ function splitPrerollBuffers(data) {
|
|
|
275
273
|
for (const [trackId, info] of trackInfoMap) {
|
|
276
274
|
timescales.set(trackId, info.timescale);
|
|
277
275
|
}
|
|
278
|
-
// Extract duration from each segment's moof box. The offsetMoofTimestamps function with an empty offset map acts as a pure reader
|
|
276
|
+
// Extract duration from each segment's moof box. The offsetMoofTimestamps function with an empty offset map acts as a pure reader - it returns per-track
|
|
279
277
|
// durations without modifying the buffer (it writes back the same tfdt values it read since the offset is 0). A fresh map is created per segment to prevent
|
|
280
278
|
// state accumulation across iterations.
|
|
281
279
|
for (const segment of mediaSegments) {
|
|
282
|
-
// The segment buffer is moof+mdat concatenated. The moof is the first box
|
|
280
|
+
// The segment buffer is moof+mdat concatenated. The moof is the first box - parse it to find its size.
|
|
283
281
|
if (segment.length < 8) {
|
|
284
282
|
durations.push(2);
|
|
285
283
|
continue;
|
|
@@ -312,7 +310,7 @@ const MAX_PREROLL_IN_WINDOW = 3;
|
|
|
312
310
|
/**
|
|
313
311
|
* Computes the sliding window start index for a composite playlist containing both preroll and real segments. The start index is determined by three constraints:
|
|
314
312
|
* (1) never negative, (2) the standard sliding window rule (current index minus window size), and (3) the preroll cap that limits how many preroll entries appear in
|
|
315
|
-
* the window. The third constraint is the key addition
|
|
313
|
+
* the window. The third constraint is the key addition - it prevents clients from playing through many seconds of remaining preroll before reaching live content.
|
|
316
314
|
*
|
|
317
315
|
* @param options - Window computation parameters.
|
|
318
316
|
* @returns The start index for the composite playlist window.
|
|
@@ -324,7 +322,7 @@ export function computePrerollWindow(options) {
|
|
|
324
322
|
}
|
|
325
323
|
/**
|
|
326
324
|
* Builds an array of playlist segment entries for preroll segments within the given index range. Each entry has an absolute URL pointing to the global /preroll/ route
|
|
327
|
-
* and the duration extracted from the preroll segment cache. No per-segment metadata tags (DISCONTINUITY, PROGRAM-DATE-TIME, etc.) are set
|
|
325
|
+
* and the duration extracted from the preroll segment cache. No per-segment metadata tags (DISCONTINUITY, PROGRAM-DATE-TIME, etc.) are set - preroll is synthetic
|
|
328
326
|
* placeholder content.
|
|
329
327
|
*
|
|
330
328
|
* @param options - Entry construction parameters.
|
|
@@ -343,7 +341,7 @@ export function buildPrerollEntries(options) {
|
|
|
343
341
|
/**
|
|
344
342
|
* Computes how many preroll segments should be visible based on elapsed wall-clock time since the preroll started. The initial window (PREROLL_INITIAL_WINDOW segments)
|
|
345
343
|
* is revealed immediately so the client has enough content to begin playback per the HLS 3-from-end rule. Additional segments are revealed one at a time as wall-clock
|
|
346
|
-
* time passes
|
|
344
|
+
* time passes - each new segment appears when enough time has elapsed for the client to have consumed the prior content beyond the initial window.
|
|
347
345
|
*
|
|
348
346
|
* @param codec - The preroll codec variant.
|
|
349
347
|
* @param prerollStartTime - Wall-clock time when the preroll began.
|
|
@@ -357,7 +355,7 @@ export function computeProgressiveReveal(codec, prerollStartTime) {
|
|
|
357
355
|
const totalSegments = variant.mediaSegments.length;
|
|
358
356
|
const elapsedSec = (Date.now() - prerollStartTime.getTime()) / 1000;
|
|
359
357
|
let revealCount = Math.min(PREROLL_INITIAL_WINDOW, totalSegments);
|
|
360
|
-
// Compute the total duration of the initial window. Segments beyond this threshold are revealed progressively
|
|
358
|
+
// Compute the total duration of the initial window. Segments beyond this threshold are revealed progressively - each one becomes visible when elapsed time
|
|
361
359
|
// exceeds the cumulative duration of all segments before it, minus the initial window's duration (since those were available from the start).
|
|
362
360
|
let initialWindowDuration = 0;
|
|
363
361
|
for (let i = 0; i < Math.min(PREROLL_INITIAL_WINDOW, totalSegments); i++) {
|
|
@@ -376,14 +374,14 @@ export function computeProgressiveReveal(codec, prerollStartTime) {
|
|
|
376
374
|
// Playlist Generation.
|
|
377
375
|
/**
|
|
378
376
|
* Generates a progressive HLS playlist referencing the global preroll segments for the specified codec. The playlist simulates a live stream by revealing segments
|
|
379
|
-
* based on elapsed wall-clock time since the preroll started. On each client poll, more segments become visible
|
|
377
|
+
* based on elapsed wall-clock time since the preroll started. On each client poll, more segments become visible - the client sees new content appear and keeps playing
|
|
380
378
|
* without stalling.
|
|
381
379
|
*
|
|
382
380
|
* The playlist uses absolute URLs because preroll segments are served at global routes (/preroll/:codec/*) while the playlist itself is served under /hls/:name/.
|
|
383
|
-
* Without absolute URLs, the client would request /hls/:name/preroll/... which does not exist. The playlist omits #EXT-X-ENDLIST so it behaves as a live playlist
|
|
381
|
+
* Without absolute URLs, the client would request /hls/:name/preroll/... which does not exist. The playlist omits #EXT-X-ENDLIST so it behaves as a live playlist -
|
|
384
382
|
* the client polls for updates and receives the real content playlist when ready.
|
|
385
383
|
*
|
|
386
|
-
* PROGRAM-DATE-TIME is intentionally omitted from the preroll playlist. Preroll is synthetic placeholder content
|
|
384
|
+
* PROGRAM-DATE-TIME is intentionally omitted from the preroll playlist. Preroll is synthetic placeholder content - assigning it wall-clock timestamps would be
|
|
387
385
|
* misleading and would create a backward time jump at the preroll-to-live boundary (preroll PDT would overshoot real content PDT because the preroll covers 30
|
|
388
386
|
* seconds of content but real content typically arrives in ~15 seconds). PDT is emitted only on real segments once the segmenter produces them.
|
|
389
387
|
*
|
|
@@ -415,7 +413,7 @@ export function generatePrerollPlaylist(baseUrl, codec, startingSequence, prerol
|
|
|
415
413
|
*/
|
|
416
414
|
export function setupPrerollRoutes(app) {
|
|
417
415
|
app.get("/preroll/:codec/init.mp4", (req, res) => {
|
|
418
|
-
const codec = req.params
|
|
416
|
+
const codec = req.params["codec"];
|
|
419
417
|
const variant = ((codec === "h264") || (codec === "hevc")) ? prerollVariants.get(codec) : undefined;
|
|
420
418
|
if (!variant) {
|
|
421
419
|
res.status(404).send("Preroll not available.");
|
|
@@ -428,21 +426,21 @@ export function setupPrerollRoutes(app) {
|
|
|
428
426
|
// Parameterized route serves individual preroll segment buffers. Each segment contains a distinct moof+mdat pair with unique PTS values from the continuous FFmpeg
|
|
429
427
|
// output. The init.mp4 exact route above takes priority over this catch-all for init segment requests.
|
|
430
428
|
app.get("/preroll/:codec/:segment", (req, res) => {
|
|
431
|
-
const codec = req.params
|
|
429
|
+
const codec = req.params["codec"];
|
|
432
430
|
const variant = ((codec === "h264") || (codec === "hevc")) ? prerollVariants.get(codec) : undefined;
|
|
433
431
|
if (!variant) {
|
|
434
432
|
res.status(404).send("Preroll not available.");
|
|
435
433
|
return;
|
|
436
434
|
}
|
|
437
435
|
// Extract the segment index from the filename (e.g., "segment5.m4s" -> 5).
|
|
438
|
-
const segmentParam = req.params
|
|
436
|
+
const segmentParam = req.params["segment"];
|
|
439
437
|
const match = (typeof segmentParam === "string") ? /^segment(\d+)\.m4s$/.exec(segmentParam) : null;
|
|
440
438
|
if (!match) {
|
|
441
439
|
res.status(404).send("Preroll not available.");
|
|
442
440
|
return;
|
|
443
441
|
}
|
|
444
|
-
const index = parseInt(match[1], 10);
|
|
445
|
-
if ((index < 0) || (index >= variant.mediaSegments.length)) {
|
|
442
|
+
const index = parseInt(match[1] ?? "", 10);
|
|
443
|
+
if (!Number.isFinite(index) || (index < 0) || (index >= variant.mediaSegments.length)) {
|
|
446
444
|
res.status(404).send("Preroll segment not found.");
|
|
447
445
|
return;
|
|
448
446
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preroll.js","sourceRoot":"","sources":["../../src/streaming/preroll.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"preroll.js","sourceRoot":"","sources":["../../src/streaming/preroll.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ import { initializeStream, validateChannel } from "./hls.js";
|
|
|
9
9
|
import { emitCurrentSystemStatus } from "../browser/index.js";
|
|
10
10
|
import { getStream } from "./registry.js";
|
|
11
11
|
/* This module polls the Channels DVR schedule API to discover upcoming recordings and pretunes channels 30 seconds before they start. When the DVR requests the
|
|
12
|
-
* stream, it's already live with buffered segments
|
|
12
|
+
* stream, it's already live with buffered segments - achieving near-instant tuning instead of 3-7 second cold starts.
|
|
13
13
|
*
|
|
14
14
|
* The polling loop runs every 60 seconds, checking for jobs starting within a 5-minute scheduling horizon. For each eligible job (PrismCast channel as the DVR's
|
|
15
15
|
* preferred source), a precise setTimeout is scheduled for 30 seconds before the recording start time. When the timer fires, the module validates the channel,
|
|
@@ -17,7 +17,7 @@ import { getStream } from "./registry.js";
|
|
|
17
17
|
*
|
|
18
18
|
* Key design decisions:
|
|
19
19
|
* - Only pretune when a PrismCast guide number is the FIRST entry in the job's channels array (DVR's preferred source).
|
|
20
|
-
* - Skip channels that are already streaming
|
|
20
|
+
* - Skip channels that are already streaming - no duplicate streams for the same channel.
|
|
21
21
|
* - Pretune alongside existing streams freely; capacity enforcement is handled by initializeStream().
|
|
22
22
|
* - Retry up to 5 times within the pretune window on failure.
|
|
23
23
|
* - Safety timeout at start_time + 90s handles cancelled jobs or missed client connections.
|
|
@@ -110,10 +110,10 @@ async function pollForUpcomingJobs() {
|
|
|
110
110
|
continue;
|
|
111
111
|
}
|
|
112
112
|
// Only consider jobs where the first (preferred) channel is a PrismCast channel.
|
|
113
|
-
|
|
113
|
+
const guideNumber = job.channels[0];
|
|
114
|
+
if (!guideNumber) {
|
|
114
115
|
continue;
|
|
115
116
|
}
|
|
116
|
-
const guideNumber = job.channels[0];
|
|
117
117
|
const channelId = resolveGuideNumber(mappings, guideNumber);
|
|
118
118
|
if (!channelId) {
|
|
119
119
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pretune.js","sourceRoot":"","sources":["../../src/streaming/pretune.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"pretune.js","sourceRoot":"","sources":["../../src/streaming/pretune.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Frame, Page } from "puppeteer-core";
|
|
2
|
-
import type { Nullable, VideoState } from "../types/index.
|
|
2
|
+
import type { Nullable, VideoState } from "../types/index.ts";
|
|
3
3
|
/**
|
|
4
4
|
* Recovery metrics tracked throughout the stream's lifetime. Returned when the monitor stops for inclusion in termination logs.
|
|
5
5
|
*/
|
|
@@ -94,8 +94,8 @@ export interface CircuitBreakerResult {
|
|
|
94
94
|
withinWindow: boolean;
|
|
95
95
|
}
|
|
96
96
|
/**
|
|
97
|
-
* Records a failure and checks whether the circuit breaker should trip. This
|
|
98
|
-
*
|
|
97
|
+
* Records a failure and checks whether the circuit breaker should trip. This is the single entry point for circuit breaker decisions across every recovery
|
|
98
|
+
* path - any code that wants to count a failure goes through this function. Updates the state in place and returns the trip decision along with diagnostic info.
|
|
99
99
|
* @param state - The circuit breaker state to update.
|
|
100
100
|
* @param now - The current timestamp.
|
|
101
101
|
* @returns Result indicating whether the circuit breaker should trip and diagnostic info.
|
|
@@ -169,13 +169,13 @@ export function formatRecoveryMetricsSummary(metrics) {
|
|
|
169
169
|
for (const [methodName, fieldName] of Object.entries(SUCCESS_FIELDS)) {
|
|
170
170
|
const count = metrics[fieldName];
|
|
171
171
|
if (count > 0) {
|
|
172
|
-
parts.push(String(count) + "
|
|
172
|
+
parts.push(String(count) + "x " + methodName);
|
|
173
173
|
}
|
|
174
174
|
}
|
|
175
175
|
// Calculate average recovery time.
|
|
176
176
|
const avgTimeMs = totalSuccesses > 0 ? metrics.totalRecoveryTimeMs / totalSuccesses : 0;
|
|
177
177
|
const avgTimeStr = (avgTimeMs / 1000).toFixed(1) + "s";
|
|
178
|
-
// Format: "Recoveries: 8 (
|
|
178
|
+
// Format: "Recoveries: 8 (5x source reload, 3x page navigation), avg 4.2s."
|
|
179
179
|
if (parts.length > 0) {
|
|
180
180
|
return "Recoveries: " + String(totalSuccesses) + " (" + parts.join(", ") + "), avg " + avgTimeStr + ".";
|
|
181
181
|
}
|
|
@@ -183,8 +183,8 @@ export function formatRecoveryMetricsSummary(metrics) {
|
|
|
183
183
|
return "Recoveries: " + String(totalAttempts) + " attempted, 0 succeeded.";
|
|
184
184
|
}
|
|
185
185
|
/**
|
|
186
|
-
* Records a failure and checks whether the circuit breaker should trip. This
|
|
187
|
-
*
|
|
186
|
+
* Records a failure and checks whether the circuit breaker should trip. This is the single entry point for circuit breaker decisions across every recovery
|
|
187
|
+
* path - any code that wants to count a failure goes through this function. Updates the state in place and returns the trip decision along with diagnostic info.
|
|
188
188
|
* @param state - The circuit breaker state to update.
|
|
189
189
|
* @param now - The current timestamp.
|
|
190
190
|
* @returns Result indicating whether the circuit breaker should trip and diagnostic info.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import type { Nullable, ResolvedSiteProfile, StreamingMode } from "../types/index.
|
|
2
|
-
import type { CaptureCodec } from "./codec.
|
|
1
|
+
import type { Nullable, ResolvedSiteProfile, StreamingMode } from "../types/index.ts";
|
|
2
|
+
import type { CaptureCodec } from "./codec.ts";
|
|
3
3
|
import { EventEmitter } from "node:events";
|
|
4
|
-
import type { FFmpegProcess } from "../utils/index.
|
|
5
|
-
import type { FMP4SegmenterResult } from "./fmp4Segmenter.
|
|
6
|
-
import type { NativeProxy } from "../native/proxy.
|
|
4
|
+
import type { FFmpegProcess } from "../utils/index.ts";
|
|
5
|
+
import type { FMP4SegmenterResult } from "./fmp4Segmenter.ts";
|
|
6
|
+
import type { NativeProxy } from "../native/proxy.ts";
|
|
7
7
|
import type { Page } from "puppeteer-core";
|
|
8
8
|
import type { Readable } from "node:stream";
|
|
9
|
-
import type { RecoveryMetrics } from "./recovery.
|
|
9
|
+
import type { RecoveryMetrics } from "./recovery.ts";
|
|
10
10
|
/**
|
|
11
11
|
* Typed event map for segment notifications. MPEG-TS consumers and lifecycle handlers subscribe to these events. Using a typed interface ensures event names and
|
|
12
12
|
* argument types are checked at compile time, preventing misspelled event names or incorrect payloads.
|