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/native/index.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
/* Copyright(C) 2024-2026, HJD (https://github.com/hjdhjd). All rights reserved.
|
|
2
2
|
*
|
|
3
|
-
* index.ts: Coordinator for native HLS streaming
|
|
3
|
+
* index.ts: Coordinator for native HLS streaming - manifest interception, DRM probe, and proxy lifecycle.
|
|
4
4
|
*/
|
|
5
|
-
import { LOG, formatError, startTimer } from "../utils/index.js";
|
|
5
|
+
import { LOG, cancellableTimeout, formatError, startTimer } from "../utils/index.js";
|
|
6
6
|
import { clearProbeCache, probeManifest } from "./probe.js";
|
|
7
|
-
import { installManifestInterceptor, removeManifestInterceptor } from "
|
|
7
|
+
import { installManifestInterceptor, removeManifestInterceptor } from "../browser/manifestInterceptor.js";
|
|
8
8
|
import { createNativeProxy } from "./proxy.js";
|
|
9
9
|
import { fetchDecryptionKey } from "./decrypt.js";
|
|
10
|
+
import { parseTokenExpiry } from "./tokenExpiry.js";
|
|
10
11
|
/* This module orchestrates the native streaming decision. After the browser navigates to a channel and video playback begins, we check whether the service's HLS
|
|
11
12
|
* stream can be consumed directly in Node (bypassing screen capture). The decision flow is:
|
|
12
13
|
*
|
|
@@ -28,7 +29,7 @@ const MIN_REFRESH_DELAY = 30000;
|
|
|
28
29
|
// Minimum remaining token lifetime (in milliseconds) for a direct-fetched variant URL to be considered usable. If the variant URL's token expires sooner than this,
|
|
29
30
|
// the direct fetch result is discarded and we fall back to a page reload to get a genuinely fresh token. This prevents handing the proxy a variant URL that expires
|
|
30
31
|
// almost immediately. Set low (5s) because the proxy only needs the variant URL to survive one poll cycle (~3s). A higher threshold (e.g., 30s) would cause Fox.com
|
|
31
|
-
// channels to reject perfectly usable variant URLs
|
|
32
|
+
// channels to reject perfectly usable variant URLs - Fox.com tokens have ~57s total lifetime, leaving ~27s at the 30s refresh point.
|
|
32
33
|
const MIN_USABLE_TOKEN_LIFETIME = 5000;
|
|
33
34
|
// Timeout for awaiting the manifest interception promise after playback init.
|
|
34
35
|
const INTERCEPTION_AWAIT_TIMEOUT = 5000;
|
|
@@ -44,51 +45,53 @@ export async function attemptNativeStreaming(options) {
|
|
|
44
45
|
const elapsed = startTimer();
|
|
45
46
|
LOG.debug("native:coordinator", "Attempting native streaming for %s.", channelName);
|
|
46
47
|
// Await the manifest interception with a short timeout. The CDP listener was installed before navigation, so by the time we get here the manifest should
|
|
47
|
-
// already be captured or close to it.
|
|
48
|
+
// already be captured or close to it. cancellableTimeout owns the underlying setTimeout so we clear it in finally when interceptionPromise wins the race;
|
|
49
|
+
// otherwise the ref'd timer would hold the event loop for up to INTERCEPTION_AWAIT_TIMEOUT after a successful tune.
|
|
48
50
|
let interception;
|
|
51
|
+
const timeout = cancellableTimeout(INTERCEPTION_AWAIT_TIMEOUT);
|
|
49
52
|
try {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
new Promise((resolve) => {
|
|
53
|
-
setTimeout(() => { resolve(null); }, INTERCEPTION_AWAIT_TIMEOUT);
|
|
54
|
-
})
|
|
55
|
-
]);
|
|
53
|
+
const result = await Promise.race([interceptionPromise, timeout.promise]);
|
|
54
|
+
interception = (result === false) ? null : result;
|
|
56
55
|
}
|
|
57
56
|
catch (error) {
|
|
58
57
|
LOG.debug("native:coordinator", "Manifest interception error for %s: %s.", channelName, formatError(error));
|
|
59
58
|
return null;
|
|
60
59
|
}
|
|
60
|
+
finally {
|
|
61
|
+
timeout.cancel();
|
|
62
|
+
}
|
|
61
63
|
if (!interception) {
|
|
62
64
|
LOG.debug("native:coordinator", "No manifest intercepted for %s in %sms. Falling back to capture.", channelName, elapsed());
|
|
63
65
|
return null;
|
|
64
66
|
}
|
|
65
67
|
LOG.debug("native:coordinator", "Manifest intercepted for %s in %sms.", channelName, elapsed());
|
|
66
|
-
// Probe the
|
|
67
|
-
|
|
68
|
-
|
|
68
|
+
// Probe the intercepted URL and normalize the result to a MediaFeed. The probe handles both master and media playlists transparently; this code path does not
|
|
69
|
+
// need to know which kind arrived.
|
|
70
|
+
const mediaFeed = await probeManifest(interception.masterManifestUrl, channelName);
|
|
71
|
+
if (!mediaFeed) {
|
|
69
72
|
LOG.debug("native:coordinator", "Probe failed for %s. Falling back to capture.", channelName);
|
|
70
73
|
removeManifestInterceptor(interception.cdpSession);
|
|
71
74
|
return null;
|
|
72
75
|
}
|
|
73
|
-
if (
|
|
76
|
+
if (mediaFeed.encryption === "drm") {
|
|
74
77
|
LOG.debug("native:coordinator", "Native streaming not viable for %s: DRM-protected stream.", channelName);
|
|
75
78
|
removeManifestInterceptor(interception.cdpSession);
|
|
76
79
|
return null;
|
|
77
80
|
}
|
|
78
81
|
// Separate audio renditions (e.g., Google DAI on BET/VH1) cannot be served to MPEG-TS clients because the independent video and audio MPEG-TS segments have
|
|
79
82
|
// incompatible PAT/PMT tables and variable packet sizes from ad splicing. HLS clients (Channels DVR) handle separate audio renditions natively via master playlist.
|
|
80
|
-
if (mpegTsClient &&
|
|
83
|
+
if (mpegTsClient && mediaFeed.audioVariantUrl) {
|
|
81
84
|
LOG.debug("native:coordinator", "Native streaming not viable for %s: separate audio rendition incompatible with MPEG-TS clients.", channelName);
|
|
82
85
|
removeManifestInterceptor(interception.cdpSession);
|
|
83
86
|
return null;
|
|
84
87
|
}
|
|
85
|
-
LOG.debug("native:coordinator", "Native streaming viable for %s (%s, variant: %s).", channelName,
|
|
88
|
+
LOG.debug("native:coordinator", "Native streaming viable for %s (%s, variant: %s).", channelName, mediaFeed.encryption, mediaFeed.bestVariantUrl.slice(0, 80));
|
|
86
89
|
// For AES-128 streams, pre-fetch the decryption key before committing to native mode. This validates key accessibility while the capture pipeline is still intact,
|
|
87
|
-
// allowing a seamless fallback to capture if the key is inaccessible. Without this, the proxy would discover the problem on its first segment fetch
|
|
90
|
+
// allowing a seamless fallback to capture if the key is inaccessible. Without this, the proxy would discover the problem on its first segment fetch - after the
|
|
88
91
|
// capture pipeline has already been torn down and no fallback is possible.
|
|
89
92
|
let prefetchedKey = null;
|
|
90
|
-
if ((
|
|
91
|
-
prefetchedKey = await fetchDecryptionKey(
|
|
93
|
+
if ((mediaFeed.encryption === "aes128") && mediaFeed.keyUrl) {
|
|
94
|
+
prefetchedKey = await fetchDecryptionKey(mediaFeed.keyUrl);
|
|
92
95
|
if (!prefetchedKey) {
|
|
93
96
|
LOG.debug("native:coordinator", "Native streaming not viable for %s: decryption key inaccessible.", channelName);
|
|
94
97
|
removeManifestInterceptor(interception.cdpSession);
|
|
@@ -100,21 +103,21 @@ export async function attemptNativeStreaming(options) {
|
|
|
100
103
|
// refresh occurs. For AES-128 streams, the pre-fetched key is passed so the proxy does not need to fetch it again on the first segment. The preroll segment count
|
|
101
104
|
// determines the segment index offset (reserving index space for preroll). Streams with separate audio cannot use preroll because the preroll content is muxed
|
|
102
105
|
// video+audio and can't be split into separate renditions.
|
|
103
|
-
const hasSeparateAudio =
|
|
106
|
+
const hasSeparateAudio = mediaFeed.audioVariantUrl !== null;
|
|
104
107
|
const proxyPrerollSegmentCount = (!hasSeparateAudio && options.prerollSegmentCount) ? options.prerollSegmentCount : 0;
|
|
105
108
|
const proxy = createNativeProxy({
|
|
106
|
-
audioVariantUrl:
|
|
109
|
+
audioVariantUrl: mediaFeed.audioVariantUrl,
|
|
107
110
|
cdpSession: interception.cdpSession,
|
|
108
111
|
channelName,
|
|
109
|
-
encryption:
|
|
110
|
-
keyUrl:
|
|
112
|
+
encryption: mediaFeed.encryption,
|
|
113
|
+
keyUrl: mediaFeed.keyUrl,
|
|
111
114
|
onError,
|
|
112
115
|
prefetchedKey,
|
|
113
116
|
prerollCodec: options.prerollCodec,
|
|
114
117
|
prerollSegmentCount: proxyPrerollSegmentCount,
|
|
115
118
|
streamId,
|
|
116
119
|
streamIdStr,
|
|
117
|
-
variantUrl:
|
|
120
|
+
variantUrl: mediaFeed.bestVariantUrl
|
|
118
121
|
});
|
|
119
122
|
// Schedule token refresh if the URL contains expiration tokens.
|
|
120
123
|
scheduleTokenRefresh({
|
|
@@ -126,32 +129,7 @@ export async function attemptNativeStreaming(options) {
|
|
|
126
129
|
url
|
|
127
130
|
});
|
|
128
131
|
LOG.debug("timing:native", "Native streaming setup completed for %s in %sms.", channelName, elapsed());
|
|
129
|
-
return { bandwidth:
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Parses token expiration from an HLS manifest or variant URL. Common patterns include `exp=N`, `hdnea=...~exp=N~...`, path-style `/exp=N~`, and `hdnts=exp%3DN`.
|
|
133
|
-
* Returns the expiration timestamp in milliseconds, or null if no expiration is found.
|
|
134
|
-
*
|
|
135
|
-
* @param url - The URL to parse for token expiration.
|
|
136
|
-
* @returns The expiration timestamp in milliseconds, or null.
|
|
137
|
-
*/
|
|
138
|
-
function parseTokenExpiry(url) {
|
|
139
|
-
// Each pattern captures a 10-13 digit expiration timestamp from a different token format. The patterns are tried in order; the first match wins.
|
|
140
|
-
const expiryPatterns = [
|
|
141
|
-
/[?&]exp=(\d{10,13})/, // Plain query parameter: exp=N.
|
|
142
|
-
/~exp=(\d{10,13})~/, // Akamai token in query parameter: hdnea=...~exp=N~...
|
|
143
|
-
/\/exp=(\d{10,13})~/, // Akamai token in URL path: /exp=N~acl=...
|
|
144
|
-
/exp%3D(\d{10,13})/ // URL-encoded hdnts parameter: exp%3DN.
|
|
145
|
-
];
|
|
146
|
-
for (const pattern of expiryPatterns) {
|
|
147
|
-
const match = pattern.exec(url);
|
|
148
|
-
if (match) {
|
|
149
|
-
const value = Number(match[1]);
|
|
150
|
-
// If the value is 10 digits, it's seconds; if 13, it's milliseconds.
|
|
151
|
-
return value < 1e12 ? value * 1000 : value;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return null;
|
|
132
|
+
return { bandwidth: mediaFeed.bandwidth, codec: mediaFeed.codec, hasAudio: mediaFeed.audioVariantUrl !== null, proxy, resolution: mediaFeed.resolution };
|
|
155
133
|
}
|
|
156
134
|
/**
|
|
157
135
|
* Schedules a token refresh timer if the manifest URL contains an expiration token. The refresh occurs TOKEN_REFRESH_MARGIN milliseconds before the token expires.
|
|
@@ -188,7 +166,7 @@ function scheduleTokenRefresh(options) {
|
|
|
188
166
|
*
|
|
189
167
|
* L2 recovery (failure-triggered) from the monitor omits masterUrl, going straight to page reload since the stream is already failing and needs a full refresh.
|
|
190
168
|
*
|
|
191
|
-
* @param options - Refresh options. masterUrl is optional
|
|
169
|
+
* @param options - Refresh options. masterUrl is optional - when provided, direct fetch is attempted first.
|
|
192
170
|
* @returns True if the refresh succeeded (proxy updated with new manifest), false otherwise.
|
|
193
171
|
*/
|
|
194
172
|
export async function refreshNativeManifest(options) {
|
|
@@ -265,8 +243,8 @@ export async function refreshNativeManifest(options) {
|
|
|
265
243
|
}
|
|
266
244
|
// Probe the new manifest to get the updated variant URL. We probe before handing the new CDP session to the proxy so that a probe failure does not leave the
|
|
267
245
|
// proxy holding a reference to a session we are about to clean up.
|
|
268
|
-
const
|
|
269
|
-
if (!
|
|
246
|
+
const refreshedFeed = await probeManifest(newInterception.masterManifestUrl, channelName);
|
|
247
|
+
if (!refreshedFeed) {
|
|
270
248
|
streamLog.debug("native:token", "Manifest refresh failed for %s: probe failed on new manifest.", channelName);
|
|
271
249
|
removeManifestInterceptor(newInterception.cdpSession);
|
|
272
250
|
return false;
|
|
@@ -279,9 +257,9 @@ export async function refreshNativeManifest(options) {
|
|
|
279
257
|
// Probe succeeded. Hand the new CDP session to the proxy. updateCdpSession cleans up the old session internally before replacing it.
|
|
280
258
|
proxy.updateCdpSession(newInterception.cdpSession);
|
|
281
259
|
// Update the proxy with the new variant URL(s).
|
|
282
|
-
proxy.updateVariantUrl(
|
|
283
|
-
if (
|
|
284
|
-
proxy.updateAudioVariantUrl(
|
|
260
|
+
proxy.updateVariantUrl(refreshedFeed.bestVariantUrl);
|
|
261
|
+
if (refreshedFeed.audioVariantUrl) {
|
|
262
|
+
proxy.updateAudioVariantUrl(refreshedFeed.audioVariantUrl);
|
|
285
263
|
}
|
|
286
264
|
streamLog.debug("native:token", "Manifest refresh completed for %s via page reload in %sms.", channelName, refreshElapsed());
|
|
287
265
|
// Schedule the next proactive token refresh with the NEW master URL from the fresh interception. Subsequent direct fetches will use this URL until it expires.
|
|
@@ -303,23 +281,23 @@ export async function refreshNativeManifest(options) {
|
|
|
303
281
|
}
|
|
304
282
|
}
|
|
305
283
|
/**
|
|
306
|
-
* Attempts to refresh the manifest by directly fetching the master manifest URL from Node.js. Returns
|
|
284
|
+
* Attempts to refresh the manifest by directly fetching the master manifest URL from Node.js. Returns a fresh MediaFeed if the fetch succeeds and the variant URL
|
|
307
285
|
* has sufficient token lifetime remaining, or null if the direct fetch should be abandoned in favor of a page reload.
|
|
308
286
|
*
|
|
309
287
|
* @param masterUrl - The master manifest URL to re-fetch.
|
|
310
288
|
* @param channelName - The channel name for logging and cache keys.
|
|
311
289
|
* @param streamLog - The stream-scoped logger.
|
|
312
|
-
* @returns
|
|
290
|
+
* @returns A MediaFeed with a fresh variant URL, or null on failure.
|
|
313
291
|
*/
|
|
314
292
|
async function tryDirectManifestRefresh(masterUrl, channelName, streamLog) {
|
|
315
|
-
const
|
|
316
|
-
if (!
|
|
293
|
+
const mediaFeed = await probeManifest(masterUrl, channelName);
|
|
294
|
+
if (!mediaFeed || (mediaFeed.encryption === "drm")) {
|
|
317
295
|
return null;
|
|
318
296
|
}
|
|
319
297
|
// Verify the variant URL's token hasn't already expired or is about to expire. Parse the expiry from the variant URL (not the master URL) since that's what the
|
|
320
|
-
// proxy will actually poll. If the token expires within MIN_USABLE_TOKEN_LIFETIME, the direct fetch result is stale
|
|
298
|
+
// proxy will actually poll. If the token expires within MIN_USABLE_TOKEN_LIFETIME, the direct fetch result is stale - the page reload path will generate a
|
|
321
299
|
// genuinely fresh token.
|
|
322
|
-
const variantExpiry = parseTokenExpiry(
|
|
300
|
+
const variantExpiry = parseTokenExpiry(mediaFeed.bestVariantUrl);
|
|
323
301
|
if (variantExpiry) {
|
|
324
302
|
const remaining = variantExpiry - Date.now();
|
|
325
303
|
if (remaining < MIN_USABLE_TOKEN_LIFETIME) {
|
|
@@ -327,6 +305,6 @@ async function tryDirectManifestRefresh(masterUrl, channelName, streamLog) {
|
|
|
327
305
|
return null;
|
|
328
306
|
}
|
|
329
307
|
}
|
|
330
|
-
return
|
|
308
|
+
return mediaFeed;
|
|
331
309
|
}
|
|
332
310
|
//# sourceMappingURL=index.js.map
|
package/dist/native/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"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"}
|
package/dist/native/probe.d.ts
CHANGED
|
@@ -1,12 +1,29 @@
|
|
|
1
|
-
import type { Nullable } from "../types/index.
|
|
1
|
+
import type { Nullable } from "../types/index.ts";
|
|
2
2
|
/**
|
|
3
3
|
* Encryption classification result from probing an HLS manifest.
|
|
4
4
|
*/
|
|
5
5
|
export type EncryptionType = "aes128" | "clear" | "drm";
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Kind of HLS playlist as defined by RFC 8216. A master (multivariant) playlist declares variant streams via #EXT-X-STREAM-INF; a media playlist declares
|
|
8
|
+
* segments directly via #EXTINF and #EXT-X-TARGETDURATION. Bodies that show neither signal classify as "unknown" so consumers can ignore them.
|
|
8
9
|
*/
|
|
9
|
-
export
|
|
10
|
+
export type HlsPlaylistKind = "master" | "media" | "unknown";
|
|
11
|
+
/**
|
|
12
|
+
* Classifies an HLS playlist body by inspecting its directives. Master detection short-circuits on the first #EXT-X-STREAM-INF tag because that directive only
|
|
13
|
+
* appears in master playlists; media detection accumulates positive signals (#EXTINF, #EXT-X-TARGETDURATION) across the body. Bodies with neither signal are
|
|
14
|
+
* not HLS playlists. This is the single source of truth for the master/media decision - both the manifest interceptor (transport-layer "is this HLS?" gate) and
|
|
15
|
+
* the probe orchestrator (resolution-layer master-vs-media branch) consume it so the classification cannot drift between call sites.
|
|
16
|
+
*
|
|
17
|
+
* @param body - The raw HLS playlist body text.
|
|
18
|
+
* @returns The kind of playlist, or "unknown" if the body is not a recognizable HLS playlist.
|
|
19
|
+
*/
|
|
20
|
+
export declare function classifyHlsPlaylist(body: string): HlsPlaylistKind;
|
|
21
|
+
/**
|
|
22
|
+
* Fully described HLS media feed ready for consumption by the native proxy. Every code path that produces this type (master-playlist resolution today; media-only
|
|
23
|
+
* passthrough in a follow-on change) emerges with the same shape, so downstream code (proxy creation, token refresh, status display) does not branch on which
|
|
24
|
+
* playlist kind originally arrived.
|
|
25
|
+
*/
|
|
26
|
+
export interface MediaFeed {
|
|
10
27
|
audioVariantUrl: Nullable<string>;
|
|
11
28
|
bandwidth: number;
|
|
12
29
|
bestVariantUrl: string;
|
|
@@ -30,15 +47,16 @@ export declare function getCachedEncryption(channelName: string): Nullable<Encry
|
|
|
30
47
|
*/
|
|
31
48
|
export declare function clearProbeCache(channelName: string): void;
|
|
32
49
|
/**
|
|
33
|
-
* Probes an HLS
|
|
34
|
-
*
|
|
35
|
-
* we
|
|
50
|
+
* Probes an HLS playlist URL and returns a fully described MediaFeed. The input may be either a master playlist or a media playlist; classifyHlsPlaylist()
|
|
51
|
+
* decides at runtime and the resolver dispatches accordingly. The probe cache is checked for DRM channels only - if a previous probe classified the channel as
|
|
52
|
+
* DRM, we return the cached result immediately since the caller will bail out regardless of URLs. For viable channels (clear or aes128), we always run the full
|
|
53
|
+
* probe because the variant URL and key URL contain auth tokens that expire between browser sessions.
|
|
36
54
|
*
|
|
37
|
-
* @param
|
|
55
|
+
* @param playlistUrl - The HLS playlist URL (master or media; contains auth tokens from the browser's original request).
|
|
38
56
|
* @param channelName - The channel name for cache lookup.
|
|
39
|
-
* @returns The
|
|
57
|
+
* @returns The MediaFeed, or null if probing fails.
|
|
40
58
|
*/
|
|
41
|
-
export declare function probeManifest(
|
|
59
|
+
export declare function probeManifest(playlistUrl: string, channelName: string): Promise<Nullable<MediaFeed>>;
|
|
42
60
|
/**
|
|
43
61
|
* Resolves a potentially relative URL against a base URL. Handles both absolute and relative URLs. Exported for reuse by the proxy module.
|
|
44
62
|
*
|