prismcast 1.3.1 → 1.3.2
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/browser/channelSelection.d.ts +17 -3
- package/dist/browser/channelSelection.js +79 -33
- package/dist/browser/channelSelection.js.map +1 -1
- package/dist/browser/index.js +2 -4
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/tuning/fox.d.ts +2 -19
- package/dist/browser/tuning/fox.js +2 -1
- package/dist/browser/tuning/fox.js.map +1 -1
- package/dist/browser/tuning/hbo.d.ts +2 -22
- package/dist/browser/tuning/hbo.js +86 -56
- package/dist/browser/tuning/hbo.js.map +1 -1
- package/dist/browser/tuning/hulu.d.ts +2 -30
- package/dist/browser/tuning/hulu.js +26 -2
- package/dist/browser/tuning/hulu.js.map +1 -1
- package/dist/browser/tuning/sling.d.ts +2 -22
- package/dist/browser/tuning/sling.js +230 -10
- package/dist/browser/tuning/sling.js.map +1 -1
- package/dist/browser/tuning/thumbnailRow.d.ts +2 -18
- package/dist/browser/tuning/thumbnailRow.js +2 -1
- package/dist/browser/tuning/thumbnailRow.js.map +1 -1
- package/dist/browser/tuning/tileClick.d.ts +2 -18
- package/dist/browser/tuning/tileClick.js +2 -1
- package/dist/browser/tuning/tileClick.js.map +1 -1
- package/dist/browser/tuning/youtubeTv.d.ts +2 -17
- package/dist/browser/tuning/youtubeTv.js +133 -93
- package/dist/browser/tuning/youtubeTv.js.map +1 -1
- package/dist/browser/video.d.ts +47 -12
- package/dist/browser/video.js +187 -56
- package/dist/browser/video.js.map +1 -1
- package/dist/channels/index.js +10 -2
- package/dist/channels/index.js.map +1 -1
- package/dist/config/profiles.js +2 -4
- package/dist/config/profiles.js.map +1 -1
- package/dist/config/providers.d.ts +1 -1
- package/dist/config/providers.js +5 -3
- package/dist/config/providers.js.map +1 -1
- package/dist/config/sites.js +2 -4
- package/dist/config/sites.js.map +1 -1
- package/dist/config/userConfig.js +6 -7
- package/dist/config/userConfig.js.map +1 -1
- package/dist/routes/config.js +16 -0
- package/dist/routes/config.js.map +1 -1
- package/dist/routes/logs.js +2 -2
- package/dist/routes/logs.js.map +1 -1
- package/dist/routes/root.js +84 -29
- package/dist/routes/root.js.map +1 -1
- package/dist/routes/streams.js +2 -2
- package/dist/routes/streams.js.map +1 -1
- package/dist/streaming/monitor.js +97 -85
- package/dist/streaming/monitor.js.map +1 -1
- package/dist/streaming/mpegts.js +4 -2
- package/dist/streaming/mpegts.js.map +1 -1
- package/dist/streaming/setup.js +19 -7
- package/dist/streaming/setup.js.map +1 -1
- package/dist/types/index.d.ts +33 -0
- package/dist/utils/ffmpeg.d.ts +6 -0
- package/dist/utils/ffmpeg.js +16 -0
- package/dist/utils/ffmpeg.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,11 +5,32 @@ import { CONFIG } from "../../config/index.js";
|
|
|
5
5
|
// parent .guide-row-container CSS class (gridGuideRow-{N}). Separate from the Hulu guideRowCache because Sling uses a different row index system (CSS class-based)
|
|
6
6
|
// and different scroll mechanics (.guide-cell scrollTop vs document.documentElement.scrollTop).
|
|
7
7
|
const slingRowCache = new Map();
|
|
8
|
+
// Channel GUID cache: maps normalized channel names to stable Sling channel GUIDs. Populated by intercepting guide grid API responses during guide page load.
|
|
9
|
+
// Channel GUIDs are permanent infrastructure identifiers that never change — only the per-program asset_id rotates.
|
|
10
|
+
const slingChannelGuidCache = new Map();
|
|
11
|
+
// Playback info URL template captured from the grid API response. The CDN hostname (e.g., cbd46b77.cdn.cms.movetv.com) may change, so we derive it at runtime
|
|
12
|
+
// from the first PLAY_CONTENT tile's playback_info.url rather than hardcoding it. The template stores everything up to and including "/channels" — the caller
|
|
13
|
+
// appends "/{channel_guid}/schedule/now/playback_info.qvt".
|
|
14
|
+
let slingPlaybackInfoBase = null;
|
|
15
|
+
// Tracks which pages have response interception listeners registered to avoid duplicate registrations.
|
|
16
|
+
const pagesWithListeners = new WeakSet();
|
|
17
|
+
// Base URL for constructing direct player URLs. This is the user-facing Sling domain, not a CDN edge — stable.
|
|
18
|
+
const SLING_PLAYER_BASE = "https://watch.sling.com/1/asset";
|
|
19
|
+
// Polling interval for the frontier-based cache wait. 300ms balances responsiveness (detecting newly arrived API pages quickly) against CPU overhead from cache
|
|
20
|
+
// scans. The API delivers pages in bursts, so shorter intervals provide diminishing returns.
|
|
21
|
+
const FRONTIER_POLL_INTERVAL = 300;
|
|
22
|
+
// Maximum time to wait for the target channel's GUID to appear in the cache. The full Sling channel alphabet takes 3-5 seconds to deliver via the paginated
|
|
23
|
+
// grid API. Five seconds ensures even the latest-alphabet channels are captured while bounding worst-case wait time for channels that genuinely aren't in the
|
|
24
|
+
// lineup (where the frontier never passes the target because it IS the last channel alphabetically).
|
|
25
|
+
const FRONTIER_MAX_WAIT = 5000;
|
|
8
26
|
/**
|
|
9
|
-
* Clears
|
|
27
|
+
* Clears all Sling TV caches: row index cache, channel GUID cache, and playback info base URL. Called by clearChannelSelectionCaches() in the coordinator when
|
|
28
|
+
* the browser restarts, since cached state may be stale in a new browser session.
|
|
10
29
|
*/
|
|
11
|
-
|
|
30
|
+
function clearSlingCache() {
|
|
12
31
|
slingRowCache.clear();
|
|
32
|
+
slingChannelGuidCache.clear();
|
|
33
|
+
slingPlaybackInfoBase = null;
|
|
13
34
|
}
|
|
14
35
|
/**
|
|
15
36
|
* Reads all rendered channel entries from the Sling TV guide grid in a single browser evaluate call. Extracts names from data-testid="channel-{NAME}" attributes
|
|
@@ -157,23 +178,184 @@ async function clickWithRetry(page, initialTarget, normalizedName, channelName)
|
|
|
157
178
|
}
|
|
158
179
|
return lastResult;
|
|
159
180
|
}
|
|
181
|
+
/**
|
|
182
|
+
* Looks up a channel GUID from the cache by normalized name. Falls back to local affiliate prefix matching where the cache key starts with the target name
|
|
183
|
+
* followed by " (" (e.g., "abc" matches "abc (wls)"). On a prefix match, caches the GUID under the primary name for O(1) on subsequent lookups.
|
|
184
|
+
* @param normalizedName - The normalized (lowercased, trimmed) channel name.
|
|
185
|
+
* @returns The channel GUID or null if not cached.
|
|
186
|
+
*/
|
|
187
|
+
function findChannelGuid(normalizedName) {
|
|
188
|
+
let channelGuid = slingChannelGuidCache.get(normalizedName) ?? null;
|
|
189
|
+
if (!channelGuid) {
|
|
190
|
+
for (const [key, guid] of slingChannelGuidCache) {
|
|
191
|
+
if (key.startsWith(normalizedName + " (")) {
|
|
192
|
+
channelGuid = guid;
|
|
193
|
+
// Cache under the primary name for O(1) on next lookup.
|
|
194
|
+
slingChannelGuidCache.set(normalizedName, guid);
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return channelGuid;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Returns the alphabetically latest key in the GUID cache. Used by the polling loop to detect when the API has delivered pages past the target's position —
|
|
203
|
+
* if the frontier sorts after the target name, the API page covering the target's range has already been processed and the channel is not in the lineup.
|
|
204
|
+
* @returns The alphabetically latest cache key, or null if the cache is empty.
|
|
205
|
+
*/
|
|
206
|
+
function getCacheFrontier() {
|
|
207
|
+
let max = null;
|
|
208
|
+
for (const key of slingChannelGuidCache.keys()) {
|
|
209
|
+
if (!max || (key > max)) {
|
|
210
|
+
max = key;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return max;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Fetches the current asset_id for a Sling channel from the public playback info endpoint. Returns null if the playback info base URL has not been captured yet
|
|
217
|
+
* (cold cache), the endpoint returns a non-200 response, or the response does not contain an asset GUID. Callers should catch network and JSON parse errors.
|
|
218
|
+
* @param channelGuid - The stable Sling channel GUID.
|
|
219
|
+
* @returns The current asset_id string or null.
|
|
220
|
+
*/
|
|
221
|
+
async function fetchSlingAssetId(channelGuid) {
|
|
222
|
+
if (!slingPlaybackInfoBase) {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
const response = await fetch(slingPlaybackInfoBase + "/" + channelGuid + "/schedule/now/playback_info.qvt");
|
|
226
|
+
if (!response.ok) {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
const data = await response.json();
|
|
230
|
+
return data.playback_info?.asset?.guid ?? null;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Resolves a direct player URL from the channel GUID cache. Looks up the channel GUID by normalized name (with local affiliate prefix fallback), fetches the
|
|
234
|
+
* current asset_id from the public playback info endpoint, and returns the full player URL. Returns null if the channel is not in the GUID cache, the playback
|
|
235
|
+
* info base URL is unknown, or the asset_id fetch fails. Shared by both resolveSlingDirectUrl (pre-navigation) and the slingGridStrategy fast path
|
|
236
|
+
* (post-guide-load).
|
|
237
|
+
* @param normalizedName - The normalized (lowercased, trimmed) channel name.
|
|
238
|
+
* @returns The direct player URL (e.g., "https://watch.sling.com/1/asset/{id}/watch") or null.
|
|
239
|
+
*/
|
|
240
|
+
async function resolvePlayerUrl(normalizedName) {
|
|
241
|
+
const channelGuid = findChannelGuid(normalizedName);
|
|
242
|
+
if (!channelGuid) {
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
const assetId = await fetchSlingAssetId(channelGuid);
|
|
246
|
+
if (!assetId) {
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
return SLING_PLAYER_BASE + "/" + assetId + "/watch";
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Processes a single Sling grid guide API response, extracting channel GUIDs and the playback info base URL. Called by the response interception listener for
|
|
253
|
+
* each paginated grid_guide_a_z response. Populates the slingChannelGuidCache and, on the first tile with a PLAY_CONTENT action, captures slingPlaybackInfoBase.
|
|
254
|
+
* @param data - The parsed JSON response from the grid guide API.
|
|
255
|
+
*/
|
|
256
|
+
function processGridApiResponse(data) {
|
|
257
|
+
if (!data.ribbons) {
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
for (const ribbon of data.ribbons) {
|
|
261
|
+
const tile = ribbon.tiles?.[0];
|
|
262
|
+
const channelName = tile?.actions?.DETAIL_VIEW?.adobe?.ChannelName;
|
|
263
|
+
const channelGuid = ribbon.stitch_id;
|
|
264
|
+
const isLive = !!tile?.actions?.PLAY_CONTENT;
|
|
265
|
+
// Only cache ribbons that have a PLAY_CONTENT action. AVOD/VOD variant channels (e.g., "truTV Sneak Peak", Freestream browse entries) share the same
|
|
266
|
+
// ChannelName as the live channel but have a different GUID that doesn't resolve via playback_info. Live channels always have PLAY_CONTENT; variants
|
|
267
|
+
// only have DETAIL_VIEW.
|
|
268
|
+
if (channelName && channelGuid && isLive) {
|
|
269
|
+
slingChannelGuidCache.set(normalizeChannelName(channelName), channelGuid);
|
|
270
|
+
}
|
|
271
|
+
// Extract the playback info base URL from the first tile that has one. The CDN hostname varies (e.g., cbd46b77.cdn.cms.movetv.com), so we derive it
|
|
272
|
+
// from the actual API response rather than hardcoding. We take everything up to and including "/channels" from the tile's playback_info.url.
|
|
273
|
+
if (!slingPlaybackInfoBase) {
|
|
274
|
+
const playbackUrl = tile?.actions?.PLAY_CONTENT?.playback_info?.url;
|
|
275
|
+
if ((typeof playbackUrl === "string") && playbackUrl.includes("/channels/")) {
|
|
276
|
+
slingPlaybackInfoBase = playbackUrl.substring(0, playbackUrl.indexOf("/channels/") + "/channels".length);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Sets up response interception on the page to capture Sling's grid guide API responses. As the guide page loads, Sling fetches paginated channel data from the
|
|
283
|
+
* grid_guide_a_z API. Each response contains ribbons with channel GUIDs (stitch_id) and channel names (DETAIL_VIEW.adobe.ChannelName). We intercept these to
|
|
284
|
+
* populate the slingChannelGuidCache, enabling the API fast path on subsequent tunes. Also extracts the playback info base URL from the first PLAY_CONTENT tile
|
|
285
|
+
* to avoid hardcoding the CDN hostname. Uses a WeakSet to prevent duplicate listener registration on the same page.
|
|
286
|
+
* @param page - The Puppeteer page object.
|
|
287
|
+
*/
|
|
288
|
+
function setupGridResponseInterception(page) {
|
|
289
|
+
if (pagesWithListeners.has(page)) {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
pagesWithListeners.add(page);
|
|
293
|
+
page.on("response", (response) => {
|
|
294
|
+
const url = response.url();
|
|
295
|
+
if (!url.includes("pres/grid_guide_a_z") || (response.status() !== 200)) {
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
void response.json().then((data) => {
|
|
299
|
+
processGridApiResponse(data);
|
|
300
|
+
}).catch(() => {
|
|
301
|
+
// Response parsing failed — binary search fallback handles it.
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Resolves a direct player URL for a Sling channel. When the channel GUID cache is warm (populated by grid API response interception), fetches the current
|
|
307
|
+
* asset_id from the public playback_info endpoint and returns a direct player URL. When the cache is cold, sets up response interception on the page so that
|
|
308
|
+
* the next guide page navigation will populate the cache for future tunes.
|
|
309
|
+
* @param channelSelector - The channel selector string (e.g., "ESPN", "ABC").
|
|
310
|
+
* @param page - The Puppeteer page for setting up response interception on cold cache.
|
|
311
|
+
* @returns The direct player URL or null.
|
|
312
|
+
*/
|
|
313
|
+
async function resolveSlingDirectUrl(channelSelector, page) {
|
|
314
|
+
const normalizedName = normalizeChannelName(channelSelector);
|
|
315
|
+
// Warm cache: resolve the player URL from the channel GUID cache and the public playback info endpoint.
|
|
316
|
+
try {
|
|
317
|
+
const playerUrl = await resolvePlayerUrl(normalizedName);
|
|
318
|
+
if (playerUrl) {
|
|
319
|
+
LOG.debug("tuning:sling", "Sling direct URL resolved for %s: %s.", channelSelector, playerUrl);
|
|
320
|
+
return playerUrl;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
LOG.debug("tuning:sling", "Sling playback info fetch failed for %s: %s.", channelSelector, formatError(error));
|
|
325
|
+
return null;
|
|
326
|
+
}
|
|
327
|
+
// Cold cache: set up response interception for the upcoming guide page navigation. The listener will populate slingChannelGuidCache as the guide loads,
|
|
328
|
+
// making the channel_guid available for the execute fast path and subsequent resolveDirectUrl calls.
|
|
329
|
+
setupGridResponseInterception(page);
|
|
330
|
+
return null;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Invalidates the cached channel GUID for the given channel selector. Called when a cached direct URL fails to produce a working stream.
|
|
334
|
+
* @param channelSelector - The channel selector string to invalidate.
|
|
335
|
+
*/
|
|
336
|
+
function invalidateSlingDirectUrl(channelSelector) {
|
|
337
|
+
slingChannelGuidCache.delete(normalizeChannelName(channelSelector));
|
|
338
|
+
}
|
|
160
339
|
/**
|
|
161
340
|
* Sling TV grid strategy: finds a channel in the virtualized, alphabetically sorted guide grid at watch.sling.com/dashboard/grid_guide/grid_guide_a_z using binary
|
|
162
341
|
* search on the .guide-cell scroll container, then clicks the on-now program cell to navigate to the player page. The guide renders ~8-10 of ~638 rows at a time,
|
|
163
342
|
* each 120px tall, sorted A-Z by channel name. Channel identification uses data-testid="channel-{NAME}" attributes.
|
|
164
343
|
*
|
|
165
344
|
* The selection process:
|
|
166
|
-
* 1. Wait for channel entries to appear in the DOM (confirms guide grid has loaded)
|
|
167
|
-
* 2.
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
345
|
+
* 1. Wait for channel entries to appear in the DOM (confirms guide grid has loaded and API data is flowing)
|
|
346
|
+
* 2. API fast path with frontier polling: poll the GUID cache until the target channel appears, the cache frontier passes the target's position, or 5 seconds
|
|
347
|
+
* elapse — then fetch the current asset_id and navigate directly, skipping all steps below
|
|
348
|
+
* 3. Read grid metadata: locate the .guide-cell scroll host and compute total rows from scrollHeight / 120
|
|
349
|
+
* 4. Check the slingRowCache for a direct-scroll shortcut from a previous tune
|
|
350
|
+
* 5. Binary search: scroll .guide-cell to the midpoint row, read rendered channels, compare alphabetically to adjust bounds
|
|
351
|
+
* 6. Click the on-now program cell via clickWithRetry() — retries up to 3 times on navigation timeout before giving up
|
|
171
352
|
* @param page - The Puppeteer page object.
|
|
172
353
|
* @param profile - The resolved site profile with a non-null channelSelector (channel name).
|
|
173
354
|
* @returns Result object with success status and optional failure reason.
|
|
174
355
|
*/
|
|
175
|
-
|
|
356
|
+
async function slingGridStrategy(page, profile) {
|
|
176
357
|
const channelName = profile.channelSelector;
|
|
358
|
+
const normalizedName = normalizeChannelName(channelName);
|
|
177
359
|
// Phase 1: Wait for the guide grid to render. Channel entries appear as data-testid="channel-{NAME}" elements within the virtualized list.
|
|
178
360
|
try {
|
|
179
361
|
await page.waitForSelector("[data-testid^=\"channel-\"]", { timeout: 5000, visible: true });
|
|
@@ -181,6 +363,39 @@ export async function slingGridStrategy(page, profile) {
|
|
|
181
363
|
catch {
|
|
182
364
|
return { reason: "Sling TV guide grid did not load.", success: false };
|
|
183
365
|
}
|
|
366
|
+
// API fast path with frontier-based polling. The GUID cache populates progressively as paginated grid API responses arrive in alphabetical order during page
|
|
367
|
+
// load. Rather than checking the cache once (missing late-alphabet channels whose API page hasn't arrived yet), poll until one of three conditions is met:
|
|
368
|
+
// (1) the target channel's GUID appears in the cache, (2) the cache frontier (alphabetically latest entry) passes the target's position (confirming the
|
|
369
|
+
// channel is not in the lineup), or (3) the maximum wait time is exceeded. This ensures the cache is fully populated for all subsequent tunes — a one-time
|
|
370
|
+
// cost that eliminates binary search for the rest of the session.
|
|
371
|
+
const pollStart = Date.now();
|
|
372
|
+
while ((Date.now() - pollStart) < FRONTIER_MAX_WAIT) {
|
|
373
|
+
if (findChannelGuid(normalizedName)) {
|
|
374
|
+
break;
|
|
375
|
+
}
|
|
376
|
+
// Check if the cache frontier has passed the target's alphabetical position. If the latest cache key sorts after the target, the API page covering
|
|
377
|
+
// the target's range has already been processed — the channel is not in the lineup and further polling won't help.
|
|
378
|
+
const frontier = getCacheFrontier();
|
|
379
|
+
if (frontier && (frontier > normalizedName)) {
|
|
380
|
+
LOG.debug("tuning:sling", "Cache frontier \"%s\" passed target \"%s\". Channel not in Sling lineup.", frontier, normalizedName);
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
383
|
+
// eslint-disable-next-line no-await-in-loop
|
|
384
|
+
await delay(FRONTIER_POLL_INTERVAL);
|
|
385
|
+
}
|
|
386
|
+
// After polling, attempt the full resolve pipeline: GUID lookup → asset_id fetch → player URL construction.
|
|
387
|
+
const playerUrl = await resolvePlayerUrl(normalizedName).catch(() => null);
|
|
388
|
+
if (playerUrl) {
|
|
389
|
+
LOG.debug("tuning:sling", "Sling API fast path for %s (%sms): %s.", channelName, Date.now() - pollStart, playerUrl);
|
|
390
|
+
try {
|
|
391
|
+
await page.goto(playerUrl, { timeout: CONFIG.streaming.navigationTimeout, waitUntil: "domcontentloaded" });
|
|
392
|
+
return { success: true };
|
|
393
|
+
}
|
|
394
|
+
catch (error) {
|
|
395
|
+
return { reason: "Sling TV API fast path navigation failed: " + formatError(error) + ".", success: false };
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
LOG.debug("tuning:sling", "Sling binary search fallback for %s after %sms polling (GUID cache: %s, base URL: %s).", channelName, Date.now() - pollStart, slingChannelGuidCache.size, slingPlaybackInfoBase ? "yes" : "no");
|
|
184
399
|
// Phase 2: Read grid metadata. The .guide-cell element is the scroll host for the virtualized channel list. Each row is 120px tall with a 30px offset for the
|
|
185
400
|
// time header row at the top of the grid.
|
|
186
401
|
const ROW_HEIGHT = 120;
|
|
@@ -200,7 +415,6 @@ export async function slingGridStrategy(page, profile) {
|
|
|
200
415
|
return { reason: "Could not locate Sling TV guide grid scroll container.", success: false };
|
|
201
416
|
}
|
|
202
417
|
const { totalRows } = gridMeta;
|
|
203
|
-
const normalizedName = normalizeChannelName(channelName);
|
|
204
418
|
// Helper: scroll the .guide-cell container to a specific row index and wait for the virtualizer to render.
|
|
205
419
|
const scrollToRow = async (rowIndex) => {
|
|
206
420
|
await page.evaluate((scrollTo) => {
|
|
@@ -214,7 +428,7 @@ export async function slingGridStrategy(page, profile) {
|
|
|
214
428
|
// Phase 3: Check the cache for a direct-scroll shortcut. If we've tuned to this channel before, skip binary search and scroll directly.
|
|
215
429
|
const cachedRow = slingRowCache.get(normalizedName);
|
|
216
430
|
if (cachedRow !== undefined) {
|
|
217
|
-
LOG.debug("tuning:sling", "Sling cache hit for %s at row %s.", channelName, cachedRow);
|
|
431
|
+
LOG.debug("tuning:sling", "Sling row cache hit for %s at row %s.", channelName, cachedRow);
|
|
218
432
|
await scrollToRow(cachedRow);
|
|
219
433
|
const { channels, clickTarget } = await readSlingChannelsAndLocate(page, normalizedName);
|
|
220
434
|
if (channels && clickTarget) {
|
|
@@ -295,4 +509,10 @@ export async function slingGridStrategy(page, profile) {
|
|
|
295
509
|
// without tearing down the entire attempt and reloading the guide page.
|
|
296
510
|
return await clickWithRetry(page, foundClickTarget, normalizedName, channelName);
|
|
297
511
|
}
|
|
512
|
+
export const slingStrategy = {
|
|
513
|
+
clearCache: clearSlingCache,
|
|
514
|
+
execute: slingGridStrategy,
|
|
515
|
+
invalidateDirectUrl: invalidateSlingDirectUrl,
|
|
516
|
+
resolveDirectUrl: resolveSlingDirectUrl
|
|
517
|
+
};
|
|
298
518
|
//# sourceMappingURL=sling.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sling.js","sourceRoot":"","sources":["../../../src/browser/tuning/sling.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sling.js","sourceRoot":"","sources":["../../../src/browser/tuning/sling.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,2 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Thumbnail row strategy: finds a channel by matching the slug in thumbnail image URLs, then clicks an adjacent clickable element on the same row. This strategy
|
|
5
|
-
* works for sites like USA Network where channels are displayed as rows with a thumbnail on the left and program entries to the right.
|
|
6
|
-
*
|
|
7
|
-
* The selection process:
|
|
8
|
-
* 1. Search all images on the page for one whose src URL contains the channel slug
|
|
9
|
-
* 2. Verify the image has dimensions (is rendered and visible)
|
|
10
|
-
* 3. Walk up the DOM to find a container wide enough to hold both thumbnail and guide entries
|
|
11
|
-
* 4. Search for clickable elements (links, buttons, cards) to the right of the thumbnail on the same row
|
|
12
|
-
* 5. Fall back to divs with cursor:pointer if no semantic clickables found
|
|
13
|
-
* 6. Click the found element to switch to the channel
|
|
14
|
-
* @param page - The Puppeteer page object.
|
|
15
|
-
* @param profile - The resolved site profile with a non-null channelSelector (image URL slug).
|
|
16
|
-
* @returns Result object with success status and optional failure reason.
|
|
17
|
-
*/
|
|
18
|
-
export declare function thumbnailRowStrategy(page: Page, profile: ChannelSelectionProfile): Promise<ChannelSelectorResult>;
|
|
1
|
+
import type { ChannelStrategyEntry } from "../../types/index.js";
|
|
2
|
+
export declare const thumbnailRowStrategy: ChannelStrategyEntry;
|
|
@@ -16,7 +16,7 @@ import { scrollAndClick } from "../channelSelection.js";
|
|
|
16
16
|
* @param profile - The resolved site profile with a non-null channelSelector (image URL slug).
|
|
17
17
|
* @returns Result object with success status and optional failure reason.
|
|
18
18
|
*/
|
|
19
|
-
|
|
19
|
+
async function thumbnailRowStrategyFn(page, profile) {
|
|
20
20
|
const channelSlug = profile.channelSelector;
|
|
21
21
|
// Find clickable element by evaluating DOM. The logic walks through the page looking for channel thumbnail images, then finds clickable show entries on the
|
|
22
22
|
// same row.
|
|
@@ -104,4 +104,5 @@ export async function thumbnailRowStrategy(page, profile) {
|
|
|
104
104
|
}
|
|
105
105
|
return { reason: "Channel thumbnail not found in page images.", success: false };
|
|
106
106
|
}
|
|
107
|
+
export const thumbnailRowStrategy = { execute: thumbnailRowStrategyFn, usesImageSlug: true };
|
|
107
108
|
//# sourceMappingURL=thumbnailRow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thumbnailRow.js","sourceRoot":"","sources":["../../../src/browser/tuning/thumbnailRow.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD;;;;;;;;;;;;;;GAcG;AACH,
|
|
1
|
+
{"version":3,"file":"thumbnailRow.js","sourceRoot":"","sources":["../../../src/browser/tuning/thumbnailRow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,2 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Tile click strategy: finds a channel by matching the slug in tile image URLs, clicks the tile to open an entity modal, then clicks a "watch live" play button on
|
|
5
|
-
* the modal. This strategy works for sites like Disney+ where live channels are displayed as tiles in a horizontal shelf, and selecting one opens a modal with a
|
|
6
|
-
* play button to start the live stream.
|
|
7
|
-
*
|
|
8
|
-
* The selection process:
|
|
9
|
-
* 1. Search all images on the page for one whose src URL contains the channel slug
|
|
10
|
-
* 2. Walk up the DOM to find the nearest clickable ancestor (the tile container)
|
|
11
|
-
* 3. Scroll the tile into view and click it
|
|
12
|
-
* 4. Wait for the play button to appear on the resulting modal
|
|
13
|
-
* 5. Click the play button to start live playback
|
|
14
|
-
* @param page - The Puppeteer page object.
|
|
15
|
-
* @param profile - The resolved site profile with a non-null channelSelector (image URL slug).
|
|
16
|
-
* @returns Result object with success status and optional failure reason.
|
|
17
|
-
*/
|
|
18
|
-
export declare function tileClickStrategy(page: Page, profile: ChannelSelectionProfile): Promise<ChannelSelectorResult>;
|
|
1
|
+
import type { ChannelStrategyEntry } from "../../types/index.js";
|
|
2
|
+
export declare const tileClickStrategy: ChannelStrategyEntry;
|
|
@@ -16,7 +16,7 @@ import { scrollAndClick } from "../channelSelection.js";
|
|
|
16
16
|
* @param profile - The resolved site profile with a non-null channelSelector (image URL slug).
|
|
17
17
|
* @returns Result object with success status and optional failure reason.
|
|
18
18
|
*/
|
|
19
|
-
|
|
19
|
+
async function tileClickStrategyFn(page, profile) {
|
|
20
20
|
const channelSlug = profile.channelSelector;
|
|
21
21
|
// Step 1: Find the channel tile by matching the slug in a descendant image's src URL. Live channels are displayed as tiles in a horizontal shelf, each containing
|
|
22
22
|
// an image with the network name in the URL label parameter (e.g., "poster_linear_espn_none"). We match the image, then walk up the DOM to find the nearest
|
|
@@ -99,4 +99,5 @@ export async function tileClickStrategy(page, profile) {
|
|
|
99
99
|
await scrollAndClick(page, playTarget);
|
|
100
100
|
return { success: true };
|
|
101
101
|
}
|
|
102
|
+
export const tileClickStrategy = { execute: tileClickStrategyFn, usesImageSlug: true };
|
|
102
103
|
//# sourceMappingURL=tileClick.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tileClick.js","sourceRoot":"","sources":["../../../src/browser/tuning/tileClick.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD;;;;;;;;;;;;;;GAcG;AACH,
|
|
1
|
+
{"version":3,"file":"tileClick.js","sourceRoot":"","sources":["../../../src/browser/tuning/tileClick.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,2 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* YouTube TV grid strategy: finds a channel in the non-virtualized EPG grid at tv.youtube.com/live by querying the aria-label attribute on thumbnail endpoint
|
|
5
|
-
* elements. All ~256 channel rows are present in the DOM simultaneously, so a single querySelector locates the target channel. The strategy extracts the watch
|
|
6
|
-
* URL from the matching anchor element and navigates directly — no scrolling, clicking, or timing workarounds needed.
|
|
7
|
-
*
|
|
8
|
-
* The selection process:
|
|
9
|
-
* 1. Wait for ytu-epg-row elements to confirm the guide grid has loaded.
|
|
10
|
-
* 2. Find the target channel using a case-insensitive aria-label CSS selector.
|
|
11
|
-
* 3. Extract the href attribute and validate it starts with "watch/" (not "live" or "browse/").
|
|
12
|
-
* 4. Navigate to the full watch URL via page.goto().
|
|
13
|
-
* @param page - The Puppeteer page object.
|
|
14
|
-
* @param profile - The resolved site profile with a non-null channelSelector (channel name, e.g., "CNN", "ESPN", "NBC").
|
|
15
|
-
* @returns Result object with success status and optional failure reason.
|
|
16
|
-
*/
|
|
17
|
-
export declare function youtubeGridStrategy(page: Page, profile: ChannelSelectionProfile): Promise<ChannelSelectorResult>;
|
|
1
|
+
import type { ChannelStrategyEntry } from "../../types/index.js";
|
|
2
|
+
export declare const yttvStrategy: ChannelStrategyEntry;
|