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/probe.js
CHANGED
|
@@ -1,23 +1,60 @@
|
|
|
1
1
|
/* Copyright(C) 2024-2026, HJD (https://github.com/hjdhjd). All rights reserved.
|
|
2
2
|
*
|
|
3
|
-
* probe.ts:
|
|
3
|
+
* probe.ts: HLS manifest probe and media-feed normalizer.
|
|
4
4
|
*/
|
|
5
5
|
import { LOG, chromeFetch, startTimer } from "../utils/index.js";
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
import { inferMediaCodec } from "./codecInference.js";
|
|
7
|
+
/* This module probes an intercepted HLS playlist URL and produces a fully described MediaFeed - the canonical input to the native proxy. The HLS spec defines
|
|
8
|
+
* exactly two playlist kinds, and this module normalizes both to the same shape so downstream code does not branch on which kind arrived:
|
|
8
9
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* -
|
|
12
|
-
*
|
|
10
|
+
* - Master (multivariant) playlists declare variant streams via #EXT-X-STREAM-INF and reference media playlist URLs. We select the highest-bandwidth variant,
|
|
11
|
+
* resolve any separate audio rendition declared via #EXT-X-MEDIA:TYPE=AUDIO, fetch the chosen variant body, and classify its encryption.
|
|
12
|
+
* - Media playlists declare segments directly via #EXTINF and #EXT-X-TARGETDURATION. The input URL is itself the media feed; we fetch the body once and
|
|
13
|
+
* classify its encryption.
|
|
14
|
+
*
|
|
15
|
+
* In both cases the output is a MediaFeed carrying the variant URL the proxy will poll, the encryption classification, the AES-128 key URL when applicable, the
|
|
16
|
+
* optional separate-audio rendition URL, and the codec/resolution/bandwidth metadata that the status display reads. Encryption classification logic is identical
|
|
17
|
+
* across both kinds because it operates on the media body, not the master:
|
|
18
|
+
*
|
|
19
|
+
* - No #EXT-X-KEY or METHOD=NONE -> "clear" (no encryption, direct pass-through)
|
|
20
|
+
* - METHOD=AES-128 with accessible key URL -> "aes128" (Node can decrypt with crypto.createDecipheriv)
|
|
21
|
+
* - METHOD=SAMPLE-AES, SAMPLE-AES-CTR, or any other method -> "drm" (requires CDM, not viable)
|
|
22
|
+
*
|
|
23
|
+
* Playlist-kind detection is centralized in classifyHlsPlaylist() so the manifest interceptor and the probe share one source of truth for the master/media
|
|
24
|
+
* decision.
|
|
13
25
|
*/
|
|
14
26
|
// Timeout for individual manifest/key fetches.
|
|
15
27
|
const FETCH_TIMEOUT = 10000;
|
|
28
|
+
/**
|
|
29
|
+
* 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
|
|
30
|
+
* appears in master playlists; media detection accumulates positive signals (#EXTINF, #EXT-X-TARGETDURATION) across the body. Bodies with neither signal are
|
|
31
|
+
* 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
|
|
32
|
+
* the probe orchestrator (resolution-layer master-vs-media branch) consume it so the classification cannot drift between call sites.
|
|
33
|
+
*
|
|
34
|
+
* @param body - The raw HLS playlist body text.
|
|
35
|
+
* @returns The kind of playlist, or "unknown" if the body is not a recognizable HLS playlist.
|
|
36
|
+
*/
|
|
37
|
+
export function classifyHlsPlaylist(body) {
|
|
38
|
+
let mediaSignal = false;
|
|
39
|
+
for (const rawLine of body.split("\n")) {
|
|
40
|
+
const line = rawLine.trim();
|
|
41
|
+
if (!line.startsWith("#")) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (line.startsWith("#EXT-X-STREAM-INF")) {
|
|
45
|
+
return "master";
|
|
46
|
+
}
|
|
47
|
+
if (line.startsWith("#EXTINF") || line.startsWith("#EXT-X-TARGETDURATION")) {
|
|
48
|
+
mediaSignal = true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return mediaSignal ? "media" : "unknown";
|
|
52
|
+
}
|
|
16
53
|
// Cache of encryption types keyed by channel name. Stores the classification (clear/aes128/drm) with a timestamp for TTL expiration. Variant URLs and key URLs
|
|
17
|
-
// contain session-bound auth tokens that expire between tunes, so they must never be cached
|
|
54
|
+
// contain session-bound auth tokens that expire between tunes, so they must never be cached - only the stable encryption type is safe to persist across sessions.
|
|
18
55
|
// The DRM skip optimization in setup.ts uses this cache to avoid installing the CDP interceptor for channels known to use DRM.
|
|
19
56
|
const probeCache = new Map();
|
|
20
|
-
// Cache entries older than this are considered stale and re-probed. 24 hours covers the case where a service changes a channel's encryption profile (e.g., free
|
|
57
|
+
// Cache entries older than this are considered stale and re-probed. 24 hours covers the case where a service changes a channel's encryption profile (e.g., free ->
|
|
21
58
|
// premium DRM). The DRM short-circuit in probeManifest() still applies within the TTL, so frequently-tuned DRM channels avoid repeated probe overhead.
|
|
22
59
|
const PROBE_CACHE_TTL = 24 * 60 * 60 * 1000;
|
|
23
60
|
/**
|
|
@@ -47,15 +84,16 @@ export function clearProbeCache(channelName) {
|
|
|
47
84
|
probeCache.delete(channelName);
|
|
48
85
|
}
|
|
49
86
|
/**
|
|
50
|
-
* Probes an HLS
|
|
51
|
-
*
|
|
52
|
-
* we
|
|
87
|
+
* Probes an HLS playlist URL and returns a fully described MediaFeed. The input may be either a master playlist or a media playlist; classifyHlsPlaylist()
|
|
88
|
+
* 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
|
|
89
|
+
* 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
|
|
90
|
+
* probe because the variant URL and key URL contain auth tokens that expire between browser sessions.
|
|
53
91
|
*
|
|
54
|
-
* @param
|
|
92
|
+
* @param playlistUrl - The HLS playlist URL (master or media; contains auth tokens from the browser's original request).
|
|
55
93
|
* @param channelName - The channel name for cache lookup.
|
|
56
|
-
* @returns The
|
|
94
|
+
* @returns The MediaFeed, or null if probing fails.
|
|
57
95
|
*/
|
|
58
|
-
export async function probeManifest(
|
|
96
|
+
export async function probeManifest(playlistUrl, channelName) {
|
|
59
97
|
// Short-circuit for DRM channels only. The cached DRM classification is stable within the TTL window (services rarely change DRM type), and the caller returns
|
|
60
98
|
// null immediately on DRM without using any URLs. For clear/aes128 channels, we must re-probe to get fresh variant and key URLs with current auth tokens.
|
|
61
99
|
const cached = getCachedEncryption(channelName);
|
|
@@ -65,34 +103,27 @@ export async function probeManifest(masterUrl, channelName) {
|
|
|
65
103
|
}
|
|
66
104
|
const elapsed = startTimer();
|
|
67
105
|
try {
|
|
68
|
-
// Fetch the
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
106
|
+
// Fetch the playlist body once and let classifyHlsPlaylist() decide which branch to take. The interceptor has already done a similar classification at the
|
|
107
|
+
// network-observer layer, but we re-classify here because (a) the body can change between the interceptor's read and ours when the master URL serves a
|
|
108
|
+
// live, mutating playlist, and (b) probeManifest() is also invoked directly by the token-refresh path which has no interceptor classification to inherit.
|
|
109
|
+
const body = await fetchManifestText(playlistUrl);
|
|
110
|
+
if (!body) {
|
|
111
|
+
LOG.debug("native:probe", "Failed to fetch playlist for %s.", channelName);
|
|
72
112
|
return null;
|
|
73
113
|
}
|
|
74
|
-
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
LOG.debug("native:probe", "Best variant selected for %s: %s.", channelName, bestVariant.url.slice(0, 120));
|
|
81
|
-
// Check for a separate audio rendition in the master manifest.
|
|
82
|
-
const audioVariantUrl = parseAudioRendition(masterBody, masterUrl);
|
|
83
|
-
if (audioVariantUrl) {
|
|
84
|
-
LOG.debug("native:probe", "Separate audio rendition found for %s: %s.", channelName, audioVariantUrl.slice(0, 120));
|
|
85
|
-
}
|
|
86
|
-
// Fetch the variant manifest.
|
|
87
|
-
const variantBody = await fetchManifestText(bestVariant.url);
|
|
88
|
-
if (!variantBody) {
|
|
89
|
-
LOG.debug("native:probe", "Failed to fetch variant manifest for %s.", channelName);
|
|
114
|
+
const kind = classifyHlsPlaylist(body);
|
|
115
|
+
const resolved = (kind === "master") ? await resolveMasterPlaylist(body, playlistUrl) :
|
|
116
|
+
(kind === "media") ? await resolveMediaPlaylist(body, playlistUrl) :
|
|
117
|
+
null;
|
|
118
|
+
if (!resolved) {
|
|
119
|
+
LOG.debug("native:probe", "Could not resolve %s playlist for %s.", kind, channelName);
|
|
90
120
|
return null;
|
|
91
121
|
}
|
|
92
|
-
// Classify encryption.
|
|
93
|
-
|
|
122
|
+
// Classify encryption from the media body. This branch is identical for master-derived and media-only feeds because #EXT-X-KEY tags live on the media
|
|
123
|
+
// playlist regardless of which playlist kind originally arrived.
|
|
124
|
+
const result = await classifyEncryption(resolved, channelName);
|
|
94
125
|
probeCache.set(channelName, { encryption: result.encryption, timestamp: Date.now() });
|
|
95
|
-
LOG.debug("native:probe", "Probe completed for %s in %sms: %s.", channelName, elapsed(), result.encryption);
|
|
126
|
+
LOG.debug("native:probe", "Probe completed for %s in %sms: %s (%s).", channelName, elapsed(), result.encryption, kind);
|
|
96
127
|
return result;
|
|
97
128
|
}
|
|
98
129
|
catch (error) {
|
|
@@ -120,6 +151,63 @@ async function fetchManifestText(url) {
|
|
|
120
151
|
return null;
|
|
121
152
|
}
|
|
122
153
|
}
|
|
154
|
+
/**
|
|
155
|
+
* Resolves a master playlist into a ResolvedMedia by selecting the highest-bandwidth variant, finding the optional separate-audio rendition, and fetching the
|
|
156
|
+
* chosen variant body.
|
|
157
|
+
*
|
|
158
|
+
* @param masterBody - The master manifest text.
|
|
159
|
+
* @param masterUrl - The master manifest URL for resolving relative variant URLs.
|
|
160
|
+
* @returns The resolved media feed metadata, or null when the master cannot be resolved.
|
|
161
|
+
*/
|
|
162
|
+
async function resolveMasterPlaylist(masterBody, masterUrl) {
|
|
163
|
+
// Parse variant streams and select the highest bandwidth.
|
|
164
|
+
const bestVariant = selectBestVariant(masterBody, masterUrl);
|
|
165
|
+
if (!bestVariant) {
|
|
166
|
+
LOG.debug("native:probe", "No variant streams found in master manifest.");
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
LOG.debug("native:probe", "Best variant selected: %s.", bestVariant.url.slice(0, 120));
|
|
170
|
+
// Check for a separate audio rendition in the master manifest.
|
|
171
|
+
const audioVariantUrl = parseAudioRendition(masterBody, masterUrl);
|
|
172
|
+
if (audioVariantUrl) {
|
|
173
|
+
LOG.debug("native:probe", "Separate audio rendition found: %s.", audioVariantUrl.slice(0, 120));
|
|
174
|
+
}
|
|
175
|
+
// Fetch the chosen variant manifest. The variant is what classifyEncryption() will inspect for #EXT-X-KEY tags and what the proxy will poll for segments.
|
|
176
|
+
const variantBody = await fetchManifestText(bestVariant.url);
|
|
177
|
+
if (!variantBody) {
|
|
178
|
+
LOG.debug("native:probe", "Failed to fetch variant manifest for %s.", bestVariant.url);
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
audioVariantUrl,
|
|
183
|
+
bandwidth: bestVariant.bandwidth,
|
|
184
|
+
codec: bestVariant.codec,
|
|
185
|
+
mediaBody: variantBody,
|
|
186
|
+
mediaUrl: bestVariant.url,
|
|
187
|
+
resolution: bestVariant.resolution
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Resolves a media playlist into a ResolvedMedia. The input URL is itself the media feed - there is no master to traverse - so the resolver wraps the body and
|
|
192
|
+
* URL verbatim, infers the codec from the first segment via codecInference.ts, and returns. Resolution stays null because TS PMT does not carry resolution and
|
|
193
|
+
* SPS-level inference is out of scope.
|
|
194
|
+
*
|
|
195
|
+
* @param mediaBody - The media playlist text.
|
|
196
|
+
* @param mediaUrl - The media playlist URL (the proxy will poll this).
|
|
197
|
+
* @returns The resolved media feed metadata.
|
|
198
|
+
*/
|
|
199
|
+
async function resolveMediaPlaylist(mediaBody, mediaUrl) {
|
|
200
|
+
// Best-effort codec inference. Returns codec=null on any failure (no segment, fetch error, unrecognized format) so the rest of the pipeline continues unimpaired.
|
|
201
|
+
const inferred = await inferMediaCodec({ baseUrl: mediaUrl, playlistBody: mediaBody });
|
|
202
|
+
return {
|
|
203
|
+
audioVariantUrl: null,
|
|
204
|
+
bandwidth: 0,
|
|
205
|
+
codec: inferred.codec,
|
|
206
|
+
mediaBody,
|
|
207
|
+
mediaUrl,
|
|
208
|
+
resolution: null
|
|
209
|
+
};
|
|
210
|
+
}
|
|
123
211
|
/**
|
|
124
212
|
* Parses #EXT-X-STREAM-INF lines from a master manifest and returns the highest-bandwidth variant with its metadata.
|
|
125
213
|
*
|
|
@@ -137,27 +225,24 @@ function selectBestVariant(masterBody, masterUrl) {
|
|
|
137
225
|
let bestUrl = null;
|
|
138
226
|
const bandwidths = [];
|
|
139
227
|
for (let i = 0; i < lines.length; i++) {
|
|
140
|
-
const line = lines[i]
|
|
228
|
+
const line = lines[i]?.trim() ?? "";
|
|
141
229
|
if (!line.startsWith("#EXT-X-STREAM-INF:")) {
|
|
142
230
|
continue;
|
|
143
231
|
}
|
|
144
232
|
// Parse BANDWIDTH attribute.
|
|
145
|
-
const
|
|
146
|
-
const bandwidth = bandwidthMatch ? Number(bandwidthMatch[1]) : 0;
|
|
233
|
+
const bandwidth = Number(/BANDWIDTH=(\d+)/.exec(line)?.[1] ?? 0);
|
|
147
234
|
// Parse RESOLUTION attribute (e.g., RESOLUTION=1920x1080).
|
|
148
|
-
const
|
|
149
|
-
const resolution = resolutionMatch ? resolutionMatch[1] : null;
|
|
235
|
+
const resolution = /RESOLUTION=(\d+x\d+)/.exec(line)?.[1] ?? null;
|
|
150
236
|
// Parse CODECS attribute and map the video codec prefix to a human-readable label. The CODECS value contains comma-separated codec strings (e.g.,
|
|
151
|
-
// "avc1.640028,mp4a.40.2"). The video codec is identified by its prefix: avc1/avc3
|
|
152
|
-
const
|
|
237
|
+
// "avc1.640028,mp4a.40.2"). The video codec is identified by its prefix: avc1/avc3 -> H264, hvc1/hev1 -> HEVC, av01 -> AV1, vp09 -> VP9.
|
|
238
|
+
const codecsValue = /CODECS="([^"]+)"/.exec(line)?.[1];
|
|
153
239
|
let codec = null;
|
|
154
|
-
if (
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
codec = codecPrefixes[prefix] ?? null;
|
|
240
|
+
if (codecsValue) {
|
|
241
|
+
const prefix = codecsValue.split(",")[0]?.trim().split(".")[0];
|
|
242
|
+
codec = prefix ? (codecPrefixes[prefix] ?? null) : null;
|
|
158
243
|
}
|
|
159
244
|
// The variant URL is on the next line.
|
|
160
|
-
const variantLine =
|
|
245
|
+
const variantLine = lines[i + 1]?.trim() ?? "";
|
|
161
246
|
if (!variantLine || variantLine.startsWith("#")) {
|
|
162
247
|
continue;
|
|
163
248
|
}
|
|
@@ -177,16 +262,15 @@ function selectBestVariant(masterBody, masterUrl) {
|
|
|
177
262
|
return { bandwidth: bestBandwidth, codec: bestCodec, resolution: bestResolution, url: resolveUrl(bestUrl, masterUrl) };
|
|
178
263
|
}
|
|
179
264
|
/**
|
|
180
|
-
* Classifies the encryption type of a
|
|
265
|
+
* Classifies the encryption type of a media playlist by parsing its #EXT-X-KEY tags. Operates uniformly on master-derived and media-only ResolvedMedia inputs
|
|
266
|
+
* because #EXT-X-KEY tags are a media-playlist-level concept regardless of whether a master playlist sat above the media.
|
|
181
267
|
*
|
|
182
|
-
* @param
|
|
183
|
-
* @param variant - The selected variant metadata (URL, bandwidth, resolution).
|
|
184
|
-
* @param audioVariantUrl - The audio rendition URL, or null when audio is muxed.
|
|
268
|
+
* @param resolved - The resolved media feed metadata.
|
|
185
269
|
* @param channelName - The channel name for logging.
|
|
186
|
-
* @returns The
|
|
270
|
+
* @returns The MediaFeed with the classified encryption type and (when applicable) the AES-128 key URL.
|
|
187
271
|
*/
|
|
188
|
-
async function classifyEncryption(
|
|
189
|
-
const lines =
|
|
272
|
+
async function classifyEncryption(resolved, channelName) {
|
|
273
|
+
const lines = resolved.mediaBody.split("\n");
|
|
190
274
|
let encryption = "clear";
|
|
191
275
|
let keyUrl = null;
|
|
192
276
|
for (const line of lines) {
|
|
@@ -195,20 +279,19 @@ async function classifyEncryption(variantBody, variant, audioVariantUrl, channel
|
|
|
195
279
|
continue;
|
|
196
280
|
}
|
|
197
281
|
// Parse METHOD attribute.
|
|
198
|
-
const
|
|
199
|
-
const method = methodMatch ? methodMatch[1].toUpperCase() : "NONE";
|
|
282
|
+
const method = /METHOD=([A-Za-z0-9-]+)/.exec(trimmed)?.[1]?.toUpperCase() ?? "NONE";
|
|
200
283
|
if (method === "NONE") {
|
|
201
284
|
continue;
|
|
202
285
|
}
|
|
203
286
|
if (method === "AES-128") {
|
|
204
287
|
// Parse URI attribute for the key URL.
|
|
205
|
-
const
|
|
206
|
-
if (!
|
|
288
|
+
const uri = /URI="([^"]+)"/.exec(trimmed)?.[1];
|
|
289
|
+
if (!uri) {
|
|
207
290
|
LOG.debug("native:probe", "AES-128 key tag has no URI for %s.", channelName);
|
|
208
291
|
encryption = "drm";
|
|
209
292
|
break;
|
|
210
293
|
}
|
|
211
|
-
const rawKeyUrl = resolveUrl(
|
|
294
|
+
const rawKeyUrl = resolveUrl(uri, resolved.mediaUrl);
|
|
212
295
|
// Test that the key is accessible and is exactly 16 bytes.
|
|
213
296
|
// eslint-disable-next-line no-await-in-loop
|
|
214
297
|
const keyAccessible = await testKeyAccessibility(rawKeyUrl);
|
|
@@ -227,7 +310,15 @@ async function classifyEncryption(variantBody, variant, audioVariantUrl, channel
|
|
|
227
310
|
encryption = "drm";
|
|
228
311
|
break;
|
|
229
312
|
}
|
|
230
|
-
return {
|
|
313
|
+
return {
|
|
314
|
+
audioVariantUrl: resolved.audioVariantUrl,
|
|
315
|
+
bandwidth: resolved.bandwidth,
|
|
316
|
+
bestVariantUrl: resolved.mediaUrl,
|
|
317
|
+
codec: resolved.codec,
|
|
318
|
+
encryption,
|
|
319
|
+
keyUrl,
|
|
320
|
+
resolution: resolved.resolution
|
|
321
|
+
};
|
|
231
322
|
}
|
|
232
323
|
/**
|
|
233
324
|
* Tests whether an AES-128 key URL is accessible and returns a 16-byte key.
|
|
@@ -268,10 +359,10 @@ function parseAudioRendition(masterBody, masterUrl) {
|
|
|
268
359
|
if (!trimmed.includes("TYPE=AUDIO")) {
|
|
269
360
|
continue;
|
|
270
361
|
}
|
|
271
|
-
// Extract the URI attribute. Not all #EXT-X-MEDIA:TYPE=AUDIO tags have a URI
|
|
272
|
-
const
|
|
273
|
-
if (
|
|
274
|
-
return resolveUrl(
|
|
362
|
+
// Extract the URI attribute. Not all #EXT-X-MEDIA:TYPE=AUDIO tags have a URI - some are descriptive-only when audio is muxed into the video variant.
|
|
363
|
+
const uri = /URI="([^"]+)"/.exec(trimmed)?.[1];
|
|
364
|
+
if (uri) {
|
|
365
|
+
return resolveUrl(uri, masterUrl);
|
|
275
366
|
}
|
|
276
367
|
}
|
|
277
368
|
return null;
|
package/dist/native/probe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/native/probe.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/native/probe.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;;;;;;;;;;;;;;;;;GAkBG;AAEH,+CAA+C;AAC/C,MAAM,aAAa,GAAG,KAAK,CAAC;AAa5B;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAE9C,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,KAAI,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAEtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAE5B,IAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAEzB,SAAS;QACX,CAAC;QAED,IAAG,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAExC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,IAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;YAE1E,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3C,CAAC;AAgCD,+JAA+J;AAC/J,kKAAkK;AAClK,+HAA+H;AAC/H,MAAM,UAAU,GAAG,IAAI,GAAG,EAA6D,CAAC;AAExF,mKAAmK;AACnK,uJAAuJ;AACvJ,MAAM,eAAe,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IAErD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAE1C,IAAG,CAAC,KAAK,EAAE,CAAC;QAEV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,eAAe,EAAE,CAAC;QAEpD,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAE/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC,UAAU,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB;IAEjD,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,WAAmB,EAAE,WAAmB;IAE1E,+JAA+J;IAC/J,0JAA0J;IAC1J,MAAM,MAAM,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAEhD,IAAG,MAAM,KAAK,KAAK,EAAE,CAAC;QAEpB,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,8BAA8B,EAAE,WAAW,CAAC,CAAC;QAEvE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACrI,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,IAAI,CAAC;QAEH,2JAA2J;QAC3J,uJAAuJ;QACvJ,0JAA0J;QAC1J,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAElD,IAAG,CAAC,IAAI,EAAE,CAAC;YAET,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,kCAAkC,EAAE,WAAW,CAAC,CAAC;YAE3E,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,qBAAqB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;YACrF,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,oBAAoB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;gBAClE,IAAI,CAAC;QAET,IAAG,CAAC,QAAQ,EAAE,CAAC;YAEb,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,uCAAuC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;YAEtF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,sJAAsJ;QACtJ,iEAAiE;QACjE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAE/D,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAEtF,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,0CAA0C,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAEvH,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAM,KAAK,EAAE,CAAC;QAEd,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAElF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAE1C,IAAI,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAExF,IAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAEhB,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,kCAAkC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAE/E,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAM,KAAK,EAAE,CAAC;QAEd,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,2BAA2B,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAEtE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAiCD;;;;;;;GAOG;AACH,KAAK,UAAU,qBAAqB,CAAC,UAAkB,EAAE,SAAiB;IAExE,0DAA0D;IAC1D,MAAM,WAAW,GAAG,iBAAiB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAE7D,IAAG,CAAC,WAAW,EAAE,CAAC;QAEhB,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,8CAA8C,CAAC,CAAC;QAE1E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,4BAA4B,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAEvF,+DAA+D;IAC/D,MAAM,eAAe,GAAG,mBAAmB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAEnE,IAAG,eAAe,EAAE,CAAC;QAEnB,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,qCAAqC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAClG,CAAC;IAED,0JAA0J;IAC1J,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAE7D,IAAG,CAAC,WAAW,EAAE,CAAC;QAEhB,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,0CAA0C,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;QAEvF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QAEL,eAAe;QACf,SAAS,EAAE,WAAW,CAAC,SAAS;QAChC,KAAK,EAAE,WAAW,CAAC,KAAK;QACxB,SAAS,EAAE,WAAW;QACtB,QAAQ,EAAE,WAAW,CAAC,GAAG;QACzB,UAAU,EAAE,WAAW,CAAC,UAAU;KACnC,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,oBAAoB,CAAC,SAAiB,EAAE,QAAgB;IAErE,kKAAkK;IAClK,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;IAEvF,OAAO;QAEL,eAAe,EAAE,IAAI;QACrB,SAAS,EAAE,CAAC;QACZ,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,SAAS;QACT,QAAQ;QACR,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC;AAoBD;;;;;;GAMG;AACH,SAAS,iBAAiB,CAAC,UAAkB,EAAE,SAAiB;IAE9D,oJAAoJ;IACpJ,MAAM,aAAa,GAA2B,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAE/I,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,SAAS,GAAqB,IAAI,CAAC;IACvC,IAAI,cAAc,GAAqB,IAAI,CAAC;IAC5C,IAAI,OAAO,GAAqB,IAAI,CAAC;IACrC,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAErC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAEpC,IAAG,CAAC,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;YAE1C,SAAS;QACX,CAAC;QAED,6BAA6B;QAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAEjE,2DAA2D;QAC3D,MAAM,UAAU,GAAqB,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAEpF,kJAAkJ;QAClJ,yIAAyI;QACzI,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,KAAK,GAAqB,IAAI,CAAC;QAEnC,IAAG,WAAW,EAAE,CAAC;YAEf,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAE/D,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1D,CAAC;QAED,uCAAuC;QACvC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAE/C,IAAG,CAAC,WAAW,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAE/C,SAAS;QACX,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE3B,IAAG,SAAS,GAAG,aAAa,EAAE,CAAC;YAE7B,aAAa,GAAG,SAAS,CAAC;YAC1B,SAAS,GAAG,KAAK,CAAC;YAClB,cAAc,GAAG,UAAU,CAAC;YAC5B,OAAO,GAAG,WAAW,CAAC;QACxB,CAAC;IACH,CAAC;IAED,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,0CAA0C,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhH,IAAG,CAAC,OAAO,EAAE,CAAC;QAEZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yDAAyD;IACzD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,EAAE,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;AACzH,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,kBAAkB,CAAC,QAAuB,EAAE,WAAmB;IAE5E,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,UAAU,GAAmB,OAAO,CAAC;IACzC,IAAI,MAAM,GAAqB,IAAI,CAAC;IAEpC,KAAI,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAExB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,IAAG,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAEtC,SAAS;QACX,CAAC;QAED,0BAA0B;QAC1B,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,MAAM,CAAC;QAEpF,IAAG,MAAM,KAAK,MAAM,EAAE,CAAC;YAErB,SAAS;QACX,CAAC;QAED,IAAG,MAAM,KAAK,SAAS,EAAE,CAAC;YAExB,uCAAuC;YACvC,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAE/C,IAAG,CAAC,GAAG,EAAE,CAAC;gBAER,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,oCAAoC,EAAE,WAAW,CAAC,CAAC;gBAC7E,UAAU,GAAG,KAAK,CAAC;gBAEnB,MAAM;YACR,CAAC;YAED,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAErD,2DAA2D;YAC3D,4CAA4C;YAC5C,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;YAE5D,IAAG,aAAa,EAAE,CAAC;gBAEjB,UAAU,GAAG,QAAQ,CAAC;gBACtB,MAAM,GAAG,SAAS,CAAC;YACrB,CAAC;iBAAM,CAAC;gBAEN,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,gDAAgD,EAAE,WAAW,CAAC,CAAC;gBACzF,UAAU,GAAG,KAAK,CAAC;YACrB,CAAC;YAED,MAAM;QACR,CAAC;QAED,iEAAiE;QACjE,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,4CAA4C,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAC7F,UAAU,GAAG,KAAK,CAAC;QAEnB,MAAM;IACR,CAAC;IAED,OAAO;QAEL,eAAe,EAAE,QAAQ,CAAC,eAAe;QACzC,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,cAAc,EAAE,QAAQ,CAAC,QAAQ;QACjC,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,UAAU;QACV,MAAM;QACN,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,oBAAoB,CAAC,MAAc;IAEhD,IAAI,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAE3F,IAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAEhB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;QAE5C,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,8BAA8B,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAE7E,OAAO,MAAM,CAAC,UAAU,KAAK,EAAE,CAAC;IAClC,CAAC;IAAC,OAAM,KAAK,EAAE,CAAC;QAEd,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,oCAAoC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAE/E,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,mBAAmB,CAAC,UAAkB,EAAE,SAAiB;IAEhE,KAAI,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAEzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,IAAG,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YAExC,SAAS;QACX,CAAC;QAED,+BAA+B;QAC/B,IAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAEnC,SAAS;QACX,CAAC;QAED,qJAAqJ;QACrJ,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE/C,IAAG,GAAG,EAAE,CAAC;YAEP,OAAO,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,OAAe;IAErD,sDAAsD;IACtD,IAAG,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAE3D,OAAO,GAAG,CAAC;IACb,CAAC;IAED,qEAAqE;IACrE,OAAO,IAAI,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;AACpC,CAAC"}
|
package/dist/native/proxy.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { type Clock } from "../utils/index.ts";
|
|
1
2
|
import type { CDPSession } from "puppeteer-core";
|
|
2
|
-
import type { CaptureCodec } from "../streaming/codec.
|
|
3
|
-
import type { Nullable } from "../types/index.
|
|
3
|
+
import type { CaptureCodec } from "../streaming/codec.ts";
|
|
4
|
+
import type { Nullable } from "../types/index.ts";
|
|
4
5
|
/**
|
|
5
6
|
* Options for creating a native HLS proxy.
|
|
6
7
|
*/
|
|
@@ -8,6 +9,7 @@ export interface NativeProxyOptions {
|
|
|
8
9
|
audioVariantUrl: Nullable<string>;
|
|
9
10
|
cdpSession: CDPSession;
|
|
10
11
|
channelName: string;
|
|
12
|
+
clock?: Clock;
|
|
11
13
|
encryption: "aes128" | "clear";
|
|
12
14
|
keyUrl: Nullable<string>;
|
|
13
15
|
onError: (error: string) => void;
|