prismcast 1.5.2 → 1.7.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/README.md +44 -28
- package/dist/app.d.ts +5 -0
- package/dist/app.js +63 -5
- package/dist/app.js.map +1 -1
- package/dist/browser/cdp.js +1 -1
- package/dist/browser/cdp.js.map +1 -1
- package/dist/browser/channelSelection.d.ts +10 -34
- package/dist/browser/channelSelection.js +31 -96
- package/dist/browser/channelSelection.js.map +1 -1
- package/dist/browser/display.d.ts +19 -0
- package/dist/browser/display.js +16 -11
- package/dist/browser/display.js.map +1 -1
- package/dist/browser/index.d.ts +31 -54
- package/dist/browser/index.js +334 -272
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/login.d.ts +65 -0
- package/dist/browser/login.js +193 -0
- package/dist/browser/login.js.map +1 -0
- package/dist/browser/precaching.js +15 -3
- package/dist/browser/precaching.js.map +1 -1
- package/dist/browser/tuning/comcastPolymer.d.ts +23 -0
- package/dist/browser/tuning/comcastPolymer.js +655 -0
- package/dist/browser/tuning/comcastPolymer.js.map +1 -0
- package/dist/browser/tuning/cox.d.ts +2 -0
- package/dist/browser/tuning/cox.js +14 -0
- package/dist/browser/tuning/cox.js.map +1 -0
- package/dist/browser/tuning/directv.js +14 -1
- package/dist/browser/tuning/directv.js.map +1 -1
- package/dist/browser/tuning/fox.js +14 -2
- package/dist/browser/tuning/fox.js.map +1 -1
- package/dist/browser/tuning/hbo.js +12 -1
- package/dist/browser/tuning/hbo.js.map +1 -1
- package/dist/browser/tuning/hulu.js +24 -1
- package/dist/browser/tuning/hulu.js.map +1 -1
- package/dist/browser/tuning/shared.d.ts +46 -0
- package/dist/browser/tuning/shared.js +100 -0
- package/dist/browser/tuning/shared.js.map +1 -0
- package/dist/browser/tuning/sling.js +35 -5
- package/dist/browser/tuning/sling.js.map +1 -1
- package/dist/browser/tuning/spectrum.js +13 -1
- package/dist/browser/tuning/spectrum.js.map +1 -1
- package/dist/browser/tuning/thumbnailRow.js +1 -1
- package/dist/browser/tuning/thumbnailRow.js.map +1 -1
- package/dist/browser/tuning/tileClick.js +1 -1
- package/dist/browser/tuning/tileClick.js.map +1 -1
- package/dist/browser/tuning/xfinity.d.ts +2 -0
- package/dist/browser/tuning/xfinity.js +14 -0
- package/dist/browser/tuning/xfinity.js.map +1 -0
- package/dist/browser/tuning/youtubeTv.js +15 -1
- package/dist/browser/tuning/youtubeTv.js.map +1 -1
- package/dist/browser/video.d.ts +20 -0
- package/dist/browser/video.js +168 -124
- package/dist/browser/video.js.map +1 -1
- package/dist/channels/index.d.ts +2 -2
- package/dist/channels/index.js +2075 -683
- package/dist/channels/index.js.map +1 -1
- package/dist/config/health.d.ts +28 -28
- package/dist/config/health.js +72 -54
- package/dist/config/health.js.map +1 -1
- package/dist/config/index.js +29 -64
- package/dist/config/index.js.map +1 -1
- package/dist/config/paths.d.ts +12 -0
- package/dist/config/paths.js +16 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/config/profiles.d.ts +3 -2
- package/dist/config/profiles.js +45 -34
- package/dist/config/profiles.js.map +1 -1
- package/dist/config/providerPacks.js +4 -1
- package/dist/config/providerPacks.js.map +1 -1
- package/dist/config/providers.d.ts +19 -5
- package/dist/config/providers.js +123 -93
- package/dist/config/providers.js.map +1 -1
- package/dist/config/sites.d.ts +28 -0
- package/dist/config/sites.js +104 -127
- package/dist/config/sites.js.map +1 -1
- package/dist/config/userChannels.d.ts +53 -2
- package/dist/config/userChannels.js +222 -13
- package/dist/config/userChannels.js.map +1 -1
- package/dist/config/userConfig.d.ts +2 -1
- package/dist/config/userConfig.js +6 -15
- package/dist/config/userConfig.js.map +1 -1
- package/dist/config/userProfiles.d.ts +0 -1
- package/dist/config/userProfiles.js +18 -10
- package/dist/config/userProfiles.js.map +1 -1
- package/dist/hdhr/channelMap.d.ts +1 -1
- package/dist/hdhr/channelMap.js +4 -4
- package/dist/hdhr/channelMap.js.map +1 -1
- package/dist/index.js +25 -22
- package/dist/index.js.map +1 -1
- package/dist/native/decrypt.d.ts +32 -0
- package/dist/native/decrypt.js +85 -0
- package/dist/native/decrypt.js.map +1 -0
- package/dist/native/index.d.ts +61 -0
- package/dist/native/index.js +342 -0
- package/dist/native/index.js.map +1 -0
- package/dist/native/intercept.d.ts +35 -0
- package/dist/native/intercept.js +184 -0
- package/dist/native/intercept.js.map +1 -0
- package/dist/native/probe.d.ts +49 -0
- package/dist/native/probe.js +294 -0
- package/dist/native/probe.js.map +1 -0
- package/dist/native/proxy.d.ts +54 -0
- package/dist/native/proxy.js +947 -0
- package/dist/native/proxy.js.map +1 -0
- package/dist/routes/components.d.ts +43 -0
- package/dist/routes/components.js +122 -0
- package/dist/routes/components.js.map +1 -1
- package/dist/routes/config/channels/index.d.ts +2 -2
- 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.js +443 -65
- package/dist/routes/config/channels/routes.js.map +1 -1
- package/dist/routes/config/channels/table.d.ts +76 -0
- package/dist/routes/config/channels/table.js +369 -89
- package/dist/routes/config/channels/table.js.map +1 -1
- package/dist/routes/config/index.d.ts +1 -1
- package/dist/routes/config/index.js +1 -1
- package/dist/routes/config/index.js.map +1 -1
- package/dist/routes/config/providers.d.ts +6 -6
- package/dist/routes/config/providers.js +73 -99
- package/dist/routes/config/providers.js.map +1 -1
- package/dist/routes/debug.js +5 -5
- package/dist/routes/debug.js.map +1 -1
- package/dist/routes/hls.js +12 -2
- package/dist/routes/hls.js.map +1 -1
- package/dist/routes/index.d.ts +0 -15
- package/dist/routes/index.js +2 -16
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/providers.js +106 -3
- package/dist/routes/providers.js.map +1 -1
- package/dist/routes/root/content.js +124 -47
- package/dist/routes/root/content.js.map +1 -1
- package/dist/routes/root/index.js +2 -1
- package/dist/routes/root/index.js.map +1 -1
- package/dist/routes/root/scripts/channels.js +772 -312
- package/dist/routes/root/scripts/channels.js.map +1 -1
- package/dist/routes/root/scripts/config.js +596 -544
- package/dist/routes/root/scripts/config.js.map +1 -1
- package/dist/routes/root/scripts/index.d.ts +1 -0
- package/dist/routes/root/scripts/index.js +1 -0
- package/dist/routes/root/scripts/index.js.map +1 -1
- package/dist/routes/root/scripts/shared.d.ts +6 -0
- package/dist/routes/root/scripts/shared.js +391 -0
- package/dist/routes/root/scripts/shared.js.map +1 -0
- package/dist/routes/root/scripts/status.js +49 -33
- package/dist/routes/root/scripts/status.js.map +1 -1
- package/dist/routes/root/styles.js +117 -10
- package/dist/routes/root/styles.js.map +1 -1
- package/dist/service/commands.js +2 -1
- package/dist/service/commands.js.map +1 -1
- package/dist/streaming/fmp4Segmenter.d.ts +5 -0
- package/dist/streaming/fmp4Segmenter.js +146 -42
- package/dist/streaming/fmp4Segmenter.js.map +1 -1
- package/dist/streaming/hls.d.ts +24 -19
- package/dist/streaming/hls.js +603 -297
- package/dist/streaming/hls.js.map +1 -1
- package/dist/streaming/hlsResume.d.ts +16 -3
- package/dist/streaming/hlsResume.js +35 -8
- package/dist/streaming/hlsResume.js.map +1 -1
- package/dist/streaming/hlsSegments.d.ts +41 -2
- package/dist/streaming/hlsSegments.js +131 -28
- package/dist/streaming/hlsSegments.js.map +1 -1
- package/dist/streaming/lifecycle.js +27 -13
- package/dist/streaming/lifecycle.js.map +1 -1
- package/dist/streaming/monitor.d.ts +1 -0
- package/dist/streaming/monitor.js +862 -474
- package/dist/streaming/monitor.js.map +1 -1
- package/dist/streaming/mp4Parser.d.ts +52 -6
- package/dist/streaming/mp4Parser.js +156 -30
- package/dist/streaming/mp4Parser.js.map +1 -1
- package/dist/streaming/mpegts.d.ts +2 -2
- package/dist/streaming/mpegts.js +156 -109
- package/dist/streaming/mpegts.js.map +1 -1
- package/dist/streaming/playlistBuilder.d.ts +38 -0
- package/dist/streaming/playlistBuilder.js +66 -0
- package/dist/streaming/playlistBuilder.js.map +1 -0
- package/dist/streaming/preroll.d.ts +126 -0
- package/dist/streaming/preroll.js +434 -0
- package/dist/streaming/preroll.js.map +1 -0
- package/dist/streaming/pretune.d.ts +8 -0
- package/dist/streaming/pretune.js +226 -0
- package/dist/streaming/pretune.js.map +1 -0
- package/dist/streaming/recovery.d.ts +0 -6
- package/dist/streaming/recovery.js +0 -8
- package/dist/streaming/recovery.js.map +1 -1
- package/dist/streaming/registry.d.ts +57 -9
- package/dist/streaming/registry.js +26 -7
- package/dist/streaming/registry.js.map +1 -1
- package/dist/streaming/setup.d.ts +8 -1
- package/dist/streaming/setup.js +71 -27
- package/dist/streaming/setup.js.map +1 -1
- package/dist/streaming/showInfo.d.ts +29 -4
- package/dist/streaming/showInfo.js +210 -38
- package/dist/streaming/showInfo.js.map +1 -1
- package/dist/streaming/statusEmitter.d.ts +20 -6
- package/dist/streaming/statusEmitter.js +31 -7
- package/dist/streaming/statusEmitter.js.map +1 -1
- package/dist/types/channels.d.ts +32 -0
- package/dist/types/config.d.ts +2 -2
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/profiles.d.ts +13 -1
- package/dist/types/selection.d.ts +5 -1
- package/dist/types/shared.d.ts +1 -1
- package/dist/types/streaming.d.ts +7 -0
- package/dist/utils/chromeFetch.d.ts +20 -0
- package/dist/utils/chromeFetch.js +43 -0
- package/dist/utils/chromeFetch.js.map +1 -0
- package/dist/utils/debugFilter.d.ts +0 -5
- package/dist/utils/debugFilter.js +20 -11
- package/dist/utils/debugFilter.js.map +1 -1
- package/dist/utils/delay.d.ts +28 -0
- package/dist/utils/delay.js +35 -1
- package/dist/utils/delay.js.map +1 -1
- package/dist/utils/evaluate.js +6 -11
- package/dist/utils/evaluate.js.map +1 -1
- package/dist/utils/ffmpeg.d.ts +14 -12
- package/dist/utils/ffmpeg.js +114 -134
- package/dist/utils/ffmpeg.js.map +1 -1
- package/dist/utils/format.d.ts +6 -0
- package/dist/utils/format.js +8 -0
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logEmitter.js +1 -1
- package/dist/utils/logEmitter.js.map +1 -1
- package/dist/utils/pid.d.ts +40 -0
- package/dist/utils/pid.js +83 -0
- package/dist/utils/pid.js.map +1 -0
- package/dist/utils/retry.d.ts +15 -9
- package/dist/utils/retry.js +7 -23
- package/dist/utils/retry.js.map +1 -1
- package/dist/utils/timing.d.ts +5 -0
- package/dist/utils/timing.js +13 -0
- package/dist/utils/timing.js.map +1 -0
- package/dist/utils/version.js +2 -2
- package/dist/utils/version.js.map +1 -1
- package/package.json +7 -7
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { LOG, delay, evaluateWithAbort } from "../utils/index.js";
|
|
2
|
-
import {
|
|
2
|
+
import { getDomainConfig, registerProviderModuleProfile } from "../config/sites.js";
|
|
3
3
|
import { CONFIG } from "../config/index.js";
|
|
4
|
+
import { coxProvider } from "./tuning/cox.js";
|
|
4
5
|
import { directvProvider } from "./tuning/directv.js";
|
|
5
6
|
import { foxProvider } from "./tuning/fox.js";
|
|
6
7
|
import { hboProvider } from "./tuning/hbo.js";
|
|
7
8
|
import { huluProvider } from "./tuning/hulu.js";
|
|
8
9
|
import { isChannelSelectionProfile } from "../types/index.js";
|
|
10
|
+
import { resolveMatchSelector } from "./tuning/shared.js";
|
|
9
11
|
import { slingProvider } from "./tuning/sling.js";
|
|
10
12
|
import { spectrumProvider } from "./tuning/spectrum.js";
|
|
11
13
|
import { thumbnailRowStrategy } from "./tuning/thumbnailRow.js";
|
|
12
14
|
import { tileClickStrategy } from "./tuning/tileClick.js";
|
|
15
|
+
import { xfinityProvider } from "./tuning/xfinity.js";
|
|
13
16
|
import { yttvProvider } from "./tuning/youtubeTv.js";
|
|
14
17
|
/* Multi-channel streaming sites (like USA Network) present multiple channels on a single page, with a program guide for each channel. Users must select which
|
|
15
18
|
* channel they want to watch by clicking on a show in the guide. This module coordinates the dispatch to per-provider strategy functions in the tuning/ directory.
|
|
@@ -18,8 +21,8 @@ import { yttvProvider } from "./tuning/youtubeTv.js";
|
|
|
18
21
|
* discoverChannels implementation. The coordinator builds its strategy dispatch lookup from provider modules at evaluation time. Generic strategies
|
|
19
22
|
* (thumbnailRow, tileClick) remain bare ChannelStrategyEntry objects — they are site-specific interaction patterns, not provider-level registrations.
|
|
20
23
|
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
24
|
+
* Shared utilities (scrollAndClick, normalizeChannelName, resolveMatchSelector, logAvailableChannels) live in tuning/shared.ts so that tuning strategy files can
|
|
25
|
+
* import them without creating a circular dependency with this coordinator. This module re-exports them for backward compatibility.
|
|
23
26
|
*/
|
|
24
27
|
/* Adding a new channel selection provider:
|
|
25
28
|
*
|
|
@@ -27,11 +30,12 @@ import { yttvProvider } from "./tuning/youtubeTv.js";
|
|
|
27
30
|
* 2. Export a single ProviderModule object from the file. Set the required fields:
|
|
28
31
|
* - slug, label, guideUrl: Identity metadata for API endpoints and logging.
|
|
29
32
|
* - strategyName: The ChannelSelectionStrategy union value that site profiles reference.
|
|
33
|
+
* - profile, profileName: The SiteProfile definition and its name (e.g., "huluLive"). Registered automatically by the coordinator at import time.
|
|
30
34
|
* - strategy: A ChannelStrategyEntry with at minimum an execute hook. Also set clearCache, resolveDirectUrl, and invalidateDirectUrl as needed.
|
|
31
35
|
* - discoverChannels: Reads the provider's guide for all available channels, returning DiscoveredChannel[].
|
|
32
36
|
* 3. Import the provider here and add it to the providerModules array.
|
|
33
37
|
* 4. Add the strategy name to the ChannelSelectionStrategy union type in types/index.ts.
|
|
34
|
-
* 5. Add a
|
|
38
|
+
* 5. Add a DOMAIN_CONFIG entry in config/sites.ts mapping the provider's domain to the profileName.
|
|
35
39
|
*
|
|
36
40
|
* The coordinator handles all cross-cutting concerns (dispatch, cache clearing, direct URL resolution, matchSelector polling) through the ChannelStrategyEntry
|
|
37
41
|
* interface. Strategy files may import scrollAndClick(), normalizeChannelName(), resolveMatchSelector(), and logAvailableChannels() from this module for shared
|
|
@@ -39,13 +43,22 @@ import { yttvProvider } from "./tuning/youtubeTv.js";
|
|
|
39
43
|
*/
|
|
40
44
|
// Provider module registry. The primary registry for all provider-level operations. Each entry bundles identity metadata, tuning strategy, and channel discovery.
|
|
41
45
|
// Future capabilities become additional methods on ProviderModule — no new registries needed.
|
|
42
|
-
const providerModules = [
|
|
46
|
+
const providerModules = [
|
|
47
|
+
coxProvider, directvProvider, foxProvider, hboProvider, huluProvider, slingProvider, spectrumProvider, xfinityProvider, yttvProvider
|
|
48
|
+
];
|
|
43
49
|
// Strategy dispatch registry. Derived from provider modules (keyed by strategyName) plus generic strategies that are not provider-level registrations.
|
|
44
50
|
const strategies = Object.fromEntries([
|
|
45
51
|
...providerModules.map((p) => [p.strategyName, p.strategy]),
|
|
46
52
|
["thumbnailRow", thumbnailRowStrategy],
|
|
47
53
|
["tileClick", tileClickStrategy]
|
|
48
54
|
]);
|
|
55
|
+
// Register provider module profiles with the profile resolution system. This happens at module evaluation time so profiles are available before any startup
|
|
56
|
+
// code runs. Providers that define a profile and profileName have their profile registered via the setter in sites.ts, avoiding circular dependencies.
|
|
57
|
+
for (const provider of providerModules) {
|
|
58
|
+
if (provider.profile && provider.profileName) {
|
|
59
|
+
registerProviderModuleProfile(provider.profileName, provider.profile);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
49
62
|
/**
|
|
50
63
|
* Returns a direct watch URL for the channel specified in the profile, if one can be resolved. Looks up the strategy entry's resolveDirectUrl hook and calls it
|
|
51
64
|
* with the channelSelector and page. Returns null if the strategy has no resolver, the profile has no channelSelector, or the resolver returns null.
|
|
@@ -99,11 +112,17 @@ export function getProviderSlugs() {
|
|
|
99
112
|
return providerModules.map((p) => p.slug);
|
|
100
113
|
}
|
|
101
114
|
/**
|
|
102
|
-
* Returns slug and
|
|
103
|
-
*
|
|
115
|
+
* Returns slug, label, domain, and optional icon URL for all registered provider modules. Used by the checkboxList setting for precache labels and by the
|
|
116
|
+
* browse modal for provider picker cards with icons. The domain is extracted from the guide URL. The icon URL is derived from the provider's DOMAIN_CONFIG
|
|
117
|
+
* entry — the single source of truth for provider icon URLs.
|
|
118
|
+
* @returns Array of objects with domain, iconUrl, label, noDirectTuneOptimization, and slug properties.
|
|
104
119
|
*/
|
|
105
120
|
export function getProviderModuleInfo() {
|
|
106
|
-
return providerModules.map((p) =>
|
|
121
|
+
return providerModules.map((p) => {
|
|
122
|
+
const domain = new URL(p.guideUrl).hostname;
|
|
123
|
+
const domainConfig = getDomainConfig(p.guideUrl);
|
|
124
|
+
return { domain, iconUrl: domainConfig?.iconUrl, label: p.label, noDirectTuneOptimization: p.noDirectTuneOptimization, slug: p.slug };
|
|
125
|
+
});
|
|
107
126
|
}
|
|
108
127
|
/**
|
|
109
128
|
* Returns a mapping of provider guide URL hostnames to provider slugs for all registered provider modules. Used by the channels panel to embed a client-side
|
|
@@ -142,98 +161,14 @@ export function getCachedProviderChannels() {
|
|
|
142
161
|
continue;
|
|
143
162
|
}
|
|
144
163
|
const hostname = new URL(provider.guideUrl).hostname;
|
|
145
|
-
const entries = cached.map((ch) => ({ label: ch.name, value: ch.channelSelector }));
|
|
164
|
+
const entries = cached.map((ch) => ({ label: ch.name, stationId: ch.stationId, value: ch.channelSelector }));
|
|
146
165
|
results.push({ entries, hostname });
|
|
147
166
|
}
|
|
148
167
|
return results;
|
|
149
168
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
* Exported for use by tuning strategy files (thumbnailRow, tileClick, hulu).
|
|
154
|
-
* @param page - The Puppeteer page object.
|
|
155
|
-
* @param target - The x/y coordinates to click.
|
|
156
|
-
* @returns True if the click was executed.
|
|
157
|
-
*/
|
|
158
|
-
export async function scrollAndClick(page, target) {
|
|
159
|
-
// Brief delay after scrolling for any animations or lazy-loaded content to settle.
|
|
160
|
-
await delay(200);
|
|
161
|
-
// Click the target coordinates to switch to the channel.
|
|
162
|
-
await page.mouse.click(target.x, target.y);
|
|
163
|
-
return true;
|
|
164
|
-
}
|
|
165
|
-
// Normalizes a channel name for case-insensitive, whitespace-tolerant comparison. Trims leading and trailing whitespace, collapses internal whitespace sequences
|
|
166
|
-
// (including non-breaking spaces, tabs, and other Unicode whitespace matched by \s) into a single regular space, and lowercases. This handles data-testid values
|
|
167
|
-
// with trailing spaces, double spaces, or non-breaking space characters that would otherwise cause exact match failures.
|
|
168
|
-
// Exported for use by tuning strategy files (hulu, sling).
|
|
169
|
-
export function normalizeChannelName(name) {
|
|
170
|
-
return name.trim().replace(/\s+/g, " ").toLowerCase();
|
|
171
|
-
}
|
|
172
|
-
// Resolves the CSS selector for finding a channel element. Interpolates the {channel} placeholder in the profile's matchSelector template with the channelSelector
|
|
173
|
-
// value. When matchSelector is not configured, falls back to image URL matching for backward compatibility.
|
|
174
|
-
// Exported for use by tuning strategy files (tileClick, thumbnailRow).
|
|
175
|
-
export function resolveMatchSelector(profile) {
|
|
176
|
-
const template = profile.channelSelection.matchSelector;
|
|
177
|
-
if (template) {
|
|
178
|
-
return template.replaceAll("{channel}", profile.channelSelector);
|
|
179
|
-
}
|
|
180
|
-
// Default to image URL slug matching for backward compatibility with profiles that don't specify matchSelector.
|
|
181
|
-
return "img[src*=\"" + profile.channelSelector + "\" i]";
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Logs available channel names from a provider's guide grid when channel selection fails. Produces an actionable log message listing channel names that users can
|
|
185
|
-
* use as `channelSelector` values in user-defined channels. When `presetSuffix` is provided, channels already covered by built-in preset definitions are filtered
|
|
186
|
-
* out so users see only channels that require manual configuration. When omitted (small channel sets like Fox or HBO), all channels are logged unfiltered.
|
|
187
|
-
* @param options - Diagnostic dump configuration.
|
|
188
|
-
* @param options.additionalKnownNames - Extra names to exclude from the filtered list (e.g., CHANNEL_ALTERNATES values for YTTV).
|
|
189
|
-
* @param options.availableChannels - Sorted list of channel names discovered in the guide grid.
|
|
190
|
-
* @param options.channelName - The channelSelector value that failed to match, for the log message.
|
|
191
|
-
* @param options.guideUrl - The URL of the provider's guide page, included in the log message so users know what to set as the channel URL.
|
|
192
|
-
* @param options.presetSuffix - Key suffix to filter preset channels (e.g., "-yttv", "-hulu"). Omit for small unfiltered channel sets.
|
|
193
|
-
* @param options.providerName - Human-readable provider name for the log message (e.g., "YouTube TV", "Hulu").
|
|
194
|
-
*/
|
|
195
|
-
export function logAvailableChannels(options) {
|
|
196
|
-
const { additionalKnownNames, availableChannels, channelName, guideUrl, presetSuffix, providerName } = options;
|
|
197
|
-
if (availableChannels.length === 0) {
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
let filteredChannels;
|
|
201
|
-
let countLabel;
|
|
202
|
-
if (presetSuffix) {
|
|
203
|
-
// Collect all channelSelector values from preset channels with this suffix, lowercased for case-insensitive comparison.
|
|
204
|
-
const knownSelectors = Object.entries(CHANNELS)
|
|
205
|
-
.filter(([key]) => key.endsWith(presetSuffix))
|
|
206
|
-
.map(([, ch]) => (ch.channelSelector ?? "").toLowerCase())
|
|
207
|
-
.filter((s) => s.length > 0);
|
|
208
|
-
// Include additional known names (e.g., CHANNEL_ALTERNATES values for YTTV) so those are also filtered out.
|
|
209
|
-
if (additionalKnownNames) {
|
|
210
|
-
for (const name of additionalKnownNames) {
|
|
211
|
-
knownSelectors.push(name.toLowerCase());
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
// Filter to channels not matched by any known selector. A channel is "covered" if a preset would find it via exact match (with parenthetical suffix stripped)
|
|
215
|
-
// or prefix+digit match. This mirrors the strategy's own matching tiers so users see only channels that genuinely need manual configuration.
|
|
216
|
-
filteredChannels = availableChannels.filter((name) => {
|
|
217
|
-
const lower = name.toLowerCase();
|
|
218
|
-
const stripped = lower.replace(/ \(.*\)$/, "");
|
|
219
|
-
return !knownSelectors.some((sel) => {
|
|
220
|
-
return (stripped === sel) ||
|
|
221
|
-
(lower.startsWith(sel + " ") && (lower.length > sel.length + 1) && (lower.charCodeAt(sel.length + 1) >= 48) && (lower.charCodeAt(sel.length + 1) <= 57));
|
|
222
|
-
});
|
|
223
|
-
});
|
|
224
|
-
countLabel = "uncovered (" + String(filteredChannels.length) + " of " + String(availableChannels.length) + ")";
|
|
225
|
-
}
|
|
226
|
-
else {
|
|
227
|
-
// No preset suffix — log all available channels unfiltered. Used for small channel sets (Fox, HBO) where the full list is actionable without filtering.
|
|
228
|
-
filteredChannels = availableChannels;
|
|
229
|
-
countLabel = String(filteredChannels.length);
|
|
230
|
-
}
|
|
231
|
-
if (filteredChannels.length === 0) {
|
|
232
|
-
return;
|
|
233
|
-
}
|
|
234
|
-
LOG.warn("Channel \"%s\" not found in %s guide. Create a user-defined channel with one of the names below as the Channel Selector and %s as the URL. " +
|
|
235
|
-
"Available channels (%s): %s.", channelName, providerName, guideUrl, countLabel, filteredChannels.join(", "));
|
|
236
|
-
}
|
|
169
|
+
// Re-export shared tuning utilities so external callers that import from channelSelection.ts continue to work. The implementations live in tuning/shared.ts to
|
|
170
|
+
// break the circular import between the coordinator (which imports tuning modules) and tuning modules (which need these utilities).
|
|
171
|
+
export { logAvailableChannels, normalizeChannelName, resolveMatchSelector, scrollAndClick } from "./tuning/shared.js";
|
|
237
172
|
/**
|
|
238
173
|
* Selects a channel from a multi-channel player UI using the strategy specified in the profile. This is the main entry point for channel selection, called by
|
|
239
174
|
* tuneToChannel() after page navigation.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channelSelection.js","sourceRoot":"","sources":["../../src/browser/channelSelection.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"channelSelection.js","sourceRoot":"","sources":["../../src/browser/channelSelection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import type { Nullable } from "../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* GPU capabilities detected from the browser at startup via CDP SystemInfo, WebGL renderer identification, and MediaRecorder probing.
|
|
4
|
+
*/
|
|
5
|
+
export interface GpuCapabilities {
|
|
6
|
+
av1HardwareEncoding: boolean;
|
|
7
|
+
h264HardwareEncoding: boolean;
|
|
8
|
+
hevcHardwareEncoding: boolean;
|
|
9
|
+
renderer: string;
|
|
10
|
+
}
|
|
2
11
|
/**
|
|
3
12
|
* Sets the maximum supported viewport dimensions. Called by browser initialization after detecting the display size and accounting for browser chrome.
|
|
4
13
|
* @param width - Maximum viewport width in pixels.
|
|
@@ -28,3 +37,13 @@ export declare function getBrowserChrome(): Nullable<{
|
|
|
28
37
|
height: number;
|
|
29
38
|
width: number;
|
|
30
39
|
}>;
|
|
40
|
+
/**
|
|
41
|
+
* Sets the GPU capabilities detected from the browser. Called by browser initialization after probing CDP SystemInfo, WebGL, and MediaRecorder.
|
|
42
|
+
* @param capabilities - The detected GPU capabilities.
|
|
43
|
+
*/
|
|
44
|
+
export declare function setGpuCapabilities(capabilities: GpuCapabilities): void;
|
|
45
|
+
/**
|
|
46
|
+
* Returns the cached GPU capabilities, or null if GPU detection has not yet completed.
|
|
47
|
+
* @returns The GPU capabilities, or null before detection.
|
|
48
|
+
*/
|
|
49
|
+
export declare function getGpuCapabilities(): Nullable<GpuCapabilities>;
|
package/dist/browser/display.js
CHANGED
|
@@ -1,18 +1,9 @@
|
|
|
1
|
-
/* This module provides a simple cache for display-related dimensions detected during browser initialization. Two sets of values are cached:
|
|
2
|
-
*
|
|
3
|
-
* 1. Maximum supported viewport: The largest viewport that fits on the display after accounting for browser chrome. Used by the preset system to determine if the
|
|
4
|
-
* configured preset needs to be degraded.
|
|
5
|
-
*
|
|
6
|
-
* 2. Browser chrome dimensions: The height and width of browser UI elements (title bar, toolbar, borders). Used when resizing the browser window to calculate the
|
|
7
|
-
* total window size needed for a given viewport size.
|
|
8
|
-
*
|
|
9
|
-
* This module is intentionally minimal with no imports from other project modules to avoid circular dependencies. The browser module detects dimensions and calls
|
|
10
|
-
* the setters. Other modules call the getters to access cached values.
|
|
11
|
-
*/
|
|
12
1
|
// Cached maximum supported viewport dimensions. Null before browser initialization completes display detection.
|
|
13
2
|
let maxSupportedViewport = null;
|
|
14
3
|
// Cached browser chrome dimensions (title bar, toolbar, borders). Null before browser initialization completes display detection.
|
|
15
4
|
let browserChrome = null;
|
|
5
|
+
// Cached GPU capabilities. Null before browser initialization completes GPU detection.
|
|
6
|
+
let gpuCapabilities = null;
|
|
16
7
|
/**
|
|
17
8
|
* Sets the maximum supported viewport dimensions. Called by browser initialization after detecting the display size and accounting for browser chrome.
|
|
18
9
|
* @param width - Maximum viewport width in pixels.
|
|
@@ -44,4 +35,18 @@ export function setBrowserChrome(width, height) {
|
|
|
44
35
|
export function getBrowserChrome() {
|
|
45
36
|
return browserChrome;
|
|
46
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Sets the GPU capabilities detected from the browser. Called by browser initialization after probing CDP SystemInfo, WebGL, and MediaRecorder.
|
|
40
|
+
* @param capabilities - The detected GPU capabilities.
|
|
41
|
+
*/
|
|
42
|
+
export function setGpuCapabilities(capabilities) {
|
|
43
|
+
gpuCapabilities = capabilities;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Returns the cached GPU capabilities, or null if GPU detection has not yet completed.
|
|
47
|
+
* @returns The GPU capabilities, or null before detection.
|
|
48
|
+
*/
|
|
49
|
+
export function getGpuCapabilities() {
|
|
50
|
+
return gpuCapabilities;
|
|
51
|
+
}
|
|
47
52
|
//# sourceMappingURL=display.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/browser/display.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/browser/display.ts"],"names":[],"mappings":"AAuCA,gHAAgH;AAChH,IAAI,oBAAoB,GAAgD,IAAI,CAAC;AAE7E,kIAAkI;AAClI,IAAI,aAAa,GAAgD,IAAI,CAAC;AAEtE,uFAAuF;AACvF,IAAI,eAAe,GAA8B,IAAI,CAAC;AAEtD;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAa,EAAE,MAAc;IAEnE,oBAAoB,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB;IAErC,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,MAAc;IAE5D,aAAa,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAE9B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,YAA6B;IAE9D,eAAe,GAAG,YAAY,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAEhC,OAAO,eAAe,CAAC;AACzB,CAAC"}
|
package/dist/browser/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Browser, LaunchOptions, Page } from "puppeteer-core";
|
|
2
|
+
import { clearLoginState, isLoginModeActive } from "./login.js";
|
|
2
3
|
import { getStream } from "puppeteer-stream";
|
|
3
4
|
import type { Nullable } from "../types/index.js";
|
|
4
5
|
/**
|
|
@@ -9,14 +10,8 @@ export declare function isGracefulShutdown(): boolean;
|
|
|
9
10
|
* Sets the graceful shutdown flag. Call this at the start of shutdown, before terminating streams, so that page close errors are suppressed.
|
|
10
11
|
*/
|
|
11
12
|
export declare function setGracefulShutdown(value: boolean): void;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
*/
|
|
15
|
-
export interface LoginStatus {
|
|
16
|
-
active: boolean;
|
|
17
|
-
startTime: Nullable<number>;
|
|
18
|
-
url: Nullable<string>;
|
|
19
|
-
}
|
|
13
|
+
export { clearLoginState, isLoginModeActive };
|
|
14
|
+
export { type LoginStatus, endLoginMode, getLoginPage, getLoginStatus, startLoginMode } from "./login.js";
|
|
20
15
|
/**
|
|
21
16
|
* Computes the current system status and emits it to SSE subscribers. Called when browser state changes significantly or when streams are added/removed.
|
|
22
17
|
*/
|
|
@@ -47,21 +42,29 @@ export declare function unregisterManagedPage(page: Page): void;
|
|
|
47
42
|
export declare function ensureDataDirectory(): Promise<void>;
|
|
48
43
|
/**
|
|
49
44
|
* Ensures a clean slate for browser launch by terminating any stale Chrome processes and removing orphaned profile lock files. Chrome locks its profile directory
|
|
50
|
-
* while running, and if a previous instance crashed without releasing the lock, we cannot launch a new browser with the same profile. This function uses
|
|
51
|
-
* find and terminate
|
|
52
|
-
*
|
|
45
|
+
* while running, and if a previous instance crashed without releasing the lock, we cannot launch a new browser with the same profile. This function uses the
|
|
46
|
+
* saved Chrome PID to find and terminate the process via process.kill(), then polls for exit using signal 0. This approach is fully cross-platform — it does not
|
|
47
|
+
* rely on Unix-only tools like pkill or pgrep.
|
|
53
48
|
*
|
|
54
49
|
* The termination strategy escalates from SIGTERM to SIGKILL. SIGTERM is sent first, giving Chrome up to 5 seconds to flush its profile databases (LevelDB,
|
|
55
50
|
* extension state, session storage) and exit cleanly. If Chrome does not exit, SIGKILL is sent as a fallback. This escalation is critical when called from the
|
|
56
51
|
* process exit handler — Chrome may be running normally (e.g., after a capture probe timeout), and an immediate SIGKILL would corrupt its profile databases,
|
|
57
52
|
* poisoning the Docker volume for subsequent container restarts.
|
|
58
53
|
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
54
|
+
* If no PID is available (first run or clean shutdown where the PID file was already removed), process killing is skipped entirely and only lock file cleanup
|
|
55
|
+
* runs. When a PID file does exist but the process is gone (Docker restart with a mounted volume — the PID belongs to the previous container's PID namespace),
|
|
56
|
+
* process.kill() throws ESRCH, which is caught gracefully.
|
|
61
57
|
*
|
|
62
|
-
* This is called at startup before launching the browser and
|
|
58
|
+
* This is called at startup before launching the browser and from the process exit handler as a crash recovery fallback. It's safe to call even when no stale
|
|
59
|
+
* processes or files exist.
|
|
63
60
|
*/
|
|
64
61
|
export declare function killStaleChrome(): void;
|
|
62
|
+
/**
|
|
63
|
+
* Returns whether this process has taken ownership of Chrome cleanup by running killStaleChrome() during startup. Used by the exit handler to avoid killing
|
|
64
|
+
* Chrome that belongs to another running PrismCast instance.
|
|
65
|
+
* @returns True if killStaleChrome() has run in this process.
|
|
66
|
+
*/
|
|
67
|
+
export declare function canCleanupChrome(): boolean;
|
|
65
68
|
/**
|
|
66
69
|
* Locates the Google Chrome executable on the system. The CHROME_BIN environment variable takes precedence, allowing operators to specify a non-standard
|
|
67
70
|
* installation. Otherwise, we search common installation paths across macOS, Linux, and Windows.
|
|
@@ -97,6 +100,12 @@ export declare function getCurrentBrowser(): Promise<Browser>;
|
|
|
97
100
|
* @returns The Chrome version string (e.g., "Chrome/144.0.7559.110") or null.
|
|
98
101
|
*/
|
|
99
102
|
export declare function getChromeVersion(): Nullable<string>;
|
|
103
|
+
/**
|
|
104
|
+
* Returns the current browser instance, or null if not launched. Unlike getCurrentBrowser(), this does not lazily launch. Used by modules that need to check
|
|
105
|
+
* browser state without triggering a launch (e.g., login mode checking connectivity before opening a tab).
|
|
106
|
+
* @returns The browser instance, or null if not running.
|
|
107
|
+
*/
|
|
108
|
+
export declare function getBrowserInstance(): Nullable<Browser>;
|
|
100
109
|
/**
|
|
101
110
|
* Checks if the browser is currently connected and usable. This is a synchronous check that can be used before attempting browser operations.
|
|
102
111
|
* @returns True if the browser is connected and ready for use, false otherwise.
|
|
@@ -120,49 +129,17 @@ export declare function getBrowserPages(): Promise<Page[]>;
|
|
|
120
129
|
* Closes the browser and cleans up resources. This is called during graceful shutdown to ensure Chrome exits cleanly. After this call, the browser reference is
|
|
121
130
|
* cleared and any subsequent stream requests will launch a fresh browser.
|
|
122
131
|
*
|
|
123
|
-
*
|
|
124
|
-
* 1. Try browser.close() with a 5-second timeout (DevTools Protocol graceful close)
|
|
125
|
-
* 2. Run killStaleChrome() to catch anything Stage 1 missed, using SIGTERM→SIGKILL escalation to give Chrome a chance to flush its profile databases
|
|
126
|
-
*/
|
|
127
|
-
export declare function closeBrowser(): Promise<void>;
|
|
128
|
-
/**
|
|
129
|
-
* Starts login mode by opening a new browser tab with the specified URL and un-minimizing the browser window. The user can then authenticate with their TV
|
|
130
|
-
* provider in the visible browser.
|
|
132
|
+
* Chrome termination uses Puppeteer's ChildProcess handle and its `exit` event for detection:
|
|
131
133
|
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
|
|
136
|
-
export declare function startLoginMode(url: string): Promise<{
|
|
137
|
-
error?: string;
|
|
138
|
-
success: boolean;
|
|
139
|
-
}>;
|
|
140
|
-
/**
|
|
141
|
-
* Ends login mode by closing the login tab (if still open) and re-minimizing the browser window. This function is idempotent - it's safe to call multiple times
|
|
142
|
-
* or when login mode is not active.
|
|
134
|
+
* - browserRef.close() sends CDP Browser.close and waits for WebSocket teardown, which hangs 3-5 seconds even after Chrome exits.
|
|
135
|
+
* - browserRef.disconnect() drops the WebSocket instantly but orphans Chrome as a Node child process, creating a zombie that process.kill(pid, 0) cannot detect.
|
|
136
|
+
* - Synchronous polling (Atomics.wait) blocks the event loop, preventing Node from processing SIGCHLD to reap the child — Chrome becomes a zombie regardless
|
|
137
|
+
* of how SIGTERM was sent.
|
|
143
138
|
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
* - Tab close detection (user closes the tab manually)
|
|
147
|
-
* - 15-minute timeout
|
|
148
|
-
* - Browser disconnect handler (cleanup)
|
|
139
|
+
* Instead, we send SIGTERM through the ChildProcess handle and listen for the `exit` event. This keeps the event loop running so Node can process SIGCHLD and
|
|
140
|
+
* reap Chrome properly. The exit event fires only after the process is fully reaped — no zombies, no polling, no event loop blocking.
|
|
149
141
|
*/
|
|
150
|
-
export declare function
|
|
151
|
-
/**
|
|
152
|
-
* Returns whether login mode is currently active. Used by the stream handler to block new stream requests during login.
|
|
153
|
-
* @returns True if login mode is active, false otherwise.
|
|
154
|
-
*/
|
|
155
|
-
export declare function isLoginModeActive(): boolean;
|
|
156
|
-
/**
|
|
157
|
-
* Returns the current login status including whether active, the URL being used, and when login started. Used by the /auth/status API endpoint.
|
|
158
|
-
* @returns Login status object.
|
|
159
|
-
*/
|
|
160
|
-
export declare function getLoginStatus(): LoginStatus;
|
|
161
|
-
/**
|
|
162
|
-
* Returns the active login page if login mode is currently active. Used by the profile test flow to evaluate CSS selectors against the live page DOM.
|
|
163
|
-
* @returns The login page, or null if login mode is not active.
|
|
164
|
-
*/
|
|
165
|
-
export declare function getLoginPage(): Nullable<Page>;
|
|
142
|
+
export declare function closeBrowser(): Promise<void>;
|
|
166
143
|
/**
|
|
167
144
|
* Cleans up browser pages that are not associated with active streams. This function runs periodically to catch any pages that were not properly closed during
|
|
168
145
|
* stream termination.
|