prismcast 1.10.2 → 1.11.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 +6 -3
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +140 -86
- package/dist/app.js.map +1 -1
- package/dist/browser/blockedPage.d.ts +80 -0
- package/dist/browser/blockedPage.d.ts.map +1 -0
- package/dist/browser/blockedPage.js +209 -0
- package/dist/browser/blockedPage.js.map +1 -0
- package/dist/browser/browserSupervisor.d.ts +80 -0
- package/dist/browser/browserSupervisor.d.ts.map +1 -0
- package/dist/browser/browserSupervisor.js +186 -0
- package/dist/browser/browserSupervisor.js.map +1 -0
- package/dist/browser/cdp.d.ts +1 -0
- package/dist/browser/cdp.d.ts.map +1 -0
- package/dist/browser/cdp.js +6 -5
- package/dist/browser/cdp.js.map +1 -1
- package/dist/browser/channelSelection.d.ts +45 -14
- package/dist/browser/channelSelection.d.ts.map +1 -0
- package/dist/browser/channelSelection.js +81 -18
- package/dist/browser/channelSelection.js.map +1 -1
- package/dist/browser/consent.d.ts +152 -0
- package/dist/browser/consent.d.ts.map +1 -0
- package/dist/browser/consent.js +418 -0
- package/dist/browser/consent.js.map +1 -0
- package/dist/browser/display.d.ts +1 -0
- package/dist/browser/display.d.ts.map +1 -0
- package/dist/browser/hlsPlaylistObserver.d.ts +55 -0
- package/dist/browser/hlsPlaylistObserver.d.ts.map +1 -0
- package/dist/browser/hlsPlaylistObserver.js +132 -0
- package/dist/browser/hlsPlaylistObserver.js.map +1 -0
- package/dist/browser/index.d.ts +67 -40
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +508 -300
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/launchGovernor.d.ts +89 -0
- package/dist/browser/launchGovernor.d.ts.map +1 -0
- package/dist/browser/launchGovernor.js +96 -0
- package/dist/browser/launchGovernor.js.map +1 -0
- package/dist/browser/login.d.ts +10 -2
- package/dist/browser/login.d.ts.map +1 -0
- package/dist/browser/login.js +36 -5
- package/dist/browser/login.js.map +1 -1
- package/dist/browser/manifestInterceptor.d.ts +102 -49
- package/dist/browser/manifestInterceptor.d.ts.map +1 -0
- package/dist/browser/manifestInterceptor.js +219 -237
- package/dist/browser/manifestInterceptor.js.map +1 -1
- package/dist/browser/pageStaleness.d.ts +30 -0
- package/dist/browser/pageStaleness.d.ts.map +1 -0
- package/dist/browser/pageStaleness.js +76 -0
- package/dist/browser/pageStaleness.js.map +1 -0
- package/dist/browser/precaching.d.ts +95 -3
- package/dist/browser/precaching.d.ts.map +1 -0
- package/dist/browser/precaching.js +499 -65
- package/dist/browser/precaching.js.map +1 -1
- package/dist/browser/tabNetworkObserver.d.ts +49 -0
- package/dist/browser/tabNetworkObserver.d.ts.map +1 -0
- package/dist/browser/tabNetworkObserver.js +144 -0
- package/dist/browser/tabNetworkObserver.js.map +1 -0
- package/dist/browser/tuning/cache.d.ts +61 -0
- package/dist/browser/tuning/cache.d.ts.map +1 -0
- package/dist/browser/tuning/cache.js +62 -0
- package/dist/browser/tuning/cache.js.map +1 -0
- package/dist/browser/tuning/comcastPolymer.d.ts +3 -2
- package/dist/browser/tuning/comcastPolymer.d.ts.map +1 -0
- package/dist/browser/tuning/comcastPolymer.js +79 -102
- package/dist/browser/tuning/comcastPolymer.js.map +1 -1
- package/dist/browser/tuning/cox.d.ts +1 -0
- package/dist/browser/tuning/cox.d.ts.map +1 -0
- package/dist/browser/tuning/directv.d.ts +1 -0
- package/dist/browser/tuning/directv.d.ts.map +1 -0
- package/dist/browser/tuning/directv.js +52 -46
- package/dist/browser/tuning/directv.js.map +1 -1
- package/dist/browser/tuning/fox.d.ts +1 -0
- package/dist/browser/tuning/fox.d.ts.map +1 -0
- package/dist/browser/tuning/fox.js +13 -12
- package/dist/browser/tuning/fox.js.map +1 -1
- package/dist/browser/tuning/gridSearch.d.ts +68 -0
- package/dist/browser/tuning/gridSearch.d.ts.map +1 -0
- package/dist/browser/tuning/gridSearch.js +85 -0
- package/dist/browser/tuning/gridSearch.js.map +1 -0
- package/dist/browser/tuning/hbo.d.ts +1 -0
- package/dist/browser/tuning/hbo.d.ts.map +1 -0
- package/dist/browser/tuning/hbo.js +73 -45
- package/dist/browser/tuning/hbo.js.map +1 -1
- package/dist/browser/tuning/hulu.d.ts +1 -0
- package/dist/browser/tuning/hulu.d.ts.map +1 -0
- package/dist/browser/tuning/hulu.js +128 -173
- package/dist/browser/tuning/hulu.js.map +1 -1
- package/dist/browser/tuning/shared.d.ts +75 -5
- package/dist/browser/tuning/shared.d.ts.map +1 -0
- package/dist/browser/tuning/shared.js +216 -6
- package/dist/browser/tuning/shared.js.map +1 -1
- package/dist/browser/tuning/sling.d.ts +1 -0
- package/dist/browser/tuning/sling.d.ts.map +1 -0
- package/dist/browser/tuning/sling.js +105 -126
- package/dist/browser/tuning/sling.js.map +1 -1
- package/dist/browser/tuning/spectrum.d.ts +1 -0
- package/dist/browser/tuning/spectrum.d.ts.map +1 -0
- package/dist/browser/tuning/spectrum.js +80 -125
- package/dist/browser/tuning/spectrum.js.map +1 -1
- package/dist/browser/tuning/thumbnailRow.d.ts +1 -0
- package/dist/browser/tuning/thumbnailRow.d.ts.map +1 -0
- package/dist/browser/tuning/thumbnailRow.js +8 -2
- package/dist/browser/tuning/thumbnailRow.js.map +1 -1
- package/dist/browser/tuning/tileClick.d.ts +1 -0
- package/dist/browser/tuning/tileClick.d.ts.map +1 -0
- package/dist/browser/tuning/tileClick.js +3 -2
- package/dist/browser/tuning/tileClick.js.map +1 -1
- package/dist/browser/tuning/xfinity.d.ts +1 -0
- package/dist/browser/tuning/xfinity.d.ts.map +1 -0
- package/dist/browser/tuning/youtubeTv.d.ts +1 -0
- package/dist/browser/tuning/youtubeTv.d.ts.map +1 -0
- package/dist/browser/tuning/youtubeTv.js +74 -127
- package/dist/browser/tuning/youtubeTv.js.map +1 -1
- package/dist/browser/video.d.ts +54 -14
- package/dist/browser/video.d.ts.map +1 -0
- package/dist/browser/video.js +296 -138
- package/dist/browser/video.js.map +1 -1
- package/dist/channels/index.d.ts +1 -0
- package/dist/channels/index.d.ts.map +1 -0
- package/dist/channels/index.js +12 -9
- package/dist/channels/index.js.map +1 -1
- package/dist/config/channelForm.d.ts +15 -1
- package/dist/config/channelForm.d.ts.map +1 -0
- package/dist/config/channelForm.js +28 -12
- package/dist/config/channelForm.js.map +1 -1
- package/dist/config/consistencyProbe.d.ts +1 -0
- package/dist/config/consistencyProbe.d.ts.map +1 -0
- package/dist/config/consistencyProbe.js +27 -21
- package/dist/config/consistencyProbe.js.map +1 -1
- package/dist/config/health.d.ts +41 -8
- package/dist/config/health.d.ts.map +1 -0
- package/dist/config/health.js +189 -38
- package/dist/config/health.js.map +1 -1
- package/dist/config/index.d.ts +55 -3
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +320 -69
- package/dist/config/index.js.map +1 -1
- package/dist/config/paths.d.ts +10 -9
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +11 -11
- package/dist/config/paths.js.map +1 -1
- package/dist/config/persistence.context.d.ts +1 -0
- package/dist/config/persistence.context.d.ts.map +1 -0
- package/dist/config/persistence.d.ts +13 -10
- package/dist/config/persistence.d.ts.map +1 -0
- package/dist/config/persistence.js +40 -21
- package/dist/config/persistence.js.map +1 -1
- package/dist/config/presets.d.ts +1 -0
- package/dist/config/presets.d.ts.map +1 -0
- package/dist/config/profiles.d.ts +22 -15
- package/dist/config/profiles.d.ts.map +1 -0
- package/dist/config/profiles.js +81 -47
- package/dist/config/profiles.js.map +1 -1
- package/dist/config/providerLineups.d.ts +47 -0
- package/dist/config/providerLineups.d.ts.map +1 -0
- package/dist/config/providerLineups.js +137 -0
- package/dist/config/providerLineups.js.map +1 -0
- package/dist/config/reactivity.d.ts +84 -0
- package/dist/config/reactivity.d.ts.map +1 -0
- package/dist/config/reactivity.js +226 -0
- package/dist/config/reactivity.js.map +1 -0
- package/dist/config/servicePacks.d.ts +18 -2
- package/dist/config/servicePacks.d.ts.map +1 -0
- package/dist/config/servicePacks.js +53 -11
- package/dist/config/servicePacks.js.map +1 -1
- package/dist/config/services.d.ts +21 -15
- package/dist/config/services.d.ts.map +1 -0
- package/dist/config/services.js +35 -24
- package/dist/config/services.js.map +1 -1
- package/dist/config/sites.d.ts +6 -4
- package/dist/config/sites.d.ts.map +1 -0
- package/dist/config/sites.js +15 -11
- package/dist/config/sites.js.map +1 -1
- package/dist/config/userChannels.d.ts +129 -30
- package/dist/config/userChannels.d.ts.map +1 -0
- package/dist/config/userChannels.js +333 -68
- package/dist/config/userChannels.js.map +1 -1
- package/dist/config/userConfig.d.ts +14 -9
- package/dist/config/userConfig.d.ts.map +1 -0
- package/dist/config/userConfig.js +87 -25
- package/dist/config/userConfig.js.map +1 -1
- package/dist/config/userProfiles.d.ts +10 -6
- package/dist/config/userProfiles.d.ts.map +1 -0
- package/dist/config/userProfiles.js +64 -39
- package/dist/config/userProfiles.js.map +1 -1
- package/dist/hdhr/channelMap.d.ts +1 -0
- package/dist/hdhr/channelMap.d.ts.map +1 -0
- package/dist/hdhr/deviceId.d.ts +1 -0
- package/dist/hdhr/deviceId.d.ts.map +1 -0
- package/dist/hdhr/discover.d.ts +1 -0
- package/dist/hdhr/discover.d.ts.map +1 -0
- package/dist/hdhr/discover.js +48 -47
- package/dist/hdhr/discover.js.map +1 -1
- package/dist/hdhr/getHandlers.d.ts +29 -0
- package/dist/hdhr/getHandlers.d.ts.map +1 -0
- package/dist/hdhr/getHandlers.js +196 -0
- package/dist/hdhr/getHandlers.js.map +1 -0
- package/dist/hdhr/identity.d.ts +36 -0
- package/dist/hdhr/identity.d.ts.map +1 -0
- package/dist/hdhr/identity.js +51 -0
- package/dist/hdhr/identity.js.map +1 -0
- package/dist/hdhr/index.d.ts +22 -4
- package/dist/hdhr/index.d.ts.map +1 -0
- package/dist/hdhr/index.js +229 -54
- package/dist/hdhr/index.js.map +1 -1
- package/dist/hdhr/protocol.d.ts +75 -0
- package/dist/hdhr/protocol.d.ts.map +1 -0
- package/dist/hdhr/protocol.js +264 -0
- package/dist/hdhr/protocol.js.map +1 -0
- package/dist/hdhr/tunerState.d.ts +24 -0
- package/dist/hdhr/tunerState.d.ts.map +1 -0
- package/dist/hdhr/tunerState.js +67 -0
- package/dist/hdhr/tunerState.js.map +1 -0
- package/dist/hdhr/udp.d.ts +43 -0
- package/dist/hdhr/udp.d.ts.map +1 -0
- package/dist/hdhr/udp.js +277 -0
- package/dist/hdhr/udp.js.map +1 -0
- package/dist/identity.d.ts +1 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +13 -11
- package/dist/identity.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -12
- package/dist/index.js.map +1 -1
- package/dist/native/codecInference.d.ts +1 -0
- package/dist/native/codecInference.d.ts.map +1 -0
- package/dist/native/codecInference.js +50 -5
- package/dist/native/codecInference.js.map +1 -1
- package/dist/native/decrypt.d.ts +6 -2
- package/dist/native/decrypt.d.ts.map +1 -0
- package/dist/native/decrypt.js +15 -8
- package/dist/native/decrypt.js.map +1 -1
- package/dist/native/index.d.ts +40 -17
- package/dist/native/index.d.ts.map +1 -0
- package/dist/native/index.js +281 -120
- package/dist/native/index.js.map +1 -1
- package/dist/native/probe.d.ts +114 -18
- package/dist/native/probe.d.ts.map +1 -0
- package/dist/native/probe.js +452 -115
- package/dist/native/probe.js.map +1 -1
- package/dist/native/proxy.d.ts +57 -5
- package/dist/native/proxy.d.ts.map +1 -0
- package/dist/native/proxy.js +604 -170
- package/dist/native/proxy.js.map +1 -1
- package/dist/native/tokenExpiry.d.ts +1 -0
- package/dist/native/tokenExpiry.d.ts.map +1 -0
- package/dist/native/tokenExpiry.js +1 -1
- package/dist/routes/assets.d.ts +1 -0
- package/dist/routes/assets.d.ts.map +1 -0
- package/dist/routes/assets.js +4 -2
- package/dist/routes/assets.js.map +1 -1
- package/dist/routes/auth.d.ts +1 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +0 -1
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/cdp.d.ts +5 -5
- package/dist/routes/cdp.d.ts.map +1 -0
- package/dist/routes/cdp.js +59 -20
- package/dist/routes/cdp.js.map +1 -1
- package/dist/routes/channels.d.ts +1 -0
- package/dist/routes/channels.d.ts.map +1 -0
- package/dist/routes/channels.js +2 -1
- package/dist/routes/channels.js.map +1 -1
- package/dist/routes/clientActions.d.ts +98 -0
- package/dist/routes/clientActions.d.ts.map +1 -0
- package/dist/routes/clientActions.js +113 -0
- package/dist/routes/clientActions.js.map +1 -0
- package/dist/routes/components.d.ts +5 -3
- package/dist/routes/components.d.ts.map +1 -0
- package/dist/routes/components.js +36 -39
- package/dist/routes/components.js.map +1 -1
- package/dist/routes/config/channels/endpoints/browse.d.ts +1 -0
- package/dist/routes/config/channels/endpoints/browse.d.ts.map +1 -0
- package/dist/routes/config/channels/endpoints/browse.js +23 -10
- package/dist/routes/config/channels/endpoints/browse.js.map +1 -1
- package/dist/routes/config/channels/endpoints/bulk.d.ts +1 -0
- package/dist/routes/config/channels/endpoints/bulk.d.ts.map +1 -0
- package/dist/routes/config/channels/endpoints/bulk.js +5 -3
- package/dist/routes/config/channels/endpoints/bulk.js.map +1 -1
- package/dist/routes/config/channels/endpoints/crud.d.ts +1 -0
- package/dist/routes/config/channels/endpoints/crud.d.ts.map +1 -0
- package/dist/routes/config/channels/endpoints/crud.js +85 -93
- package/dist/routes/config/channels/endpoints/crud.js.map +1 -1
- package/dist/routes/config/channels/endpoints/importExport.d.ts +1 -0
- package/dist/routes/config/channels/endpoints/importExport.d.ts.map +1 -0
- package/dist/routes/config/channels/endpoints/importExport.js +6 -3
- package/dist/routes/config/channels/endpoints/importExport.js.map +1 -1
- package/dist/routes/config/channels/endpoints/predefined.d.ts +1 -0
- package/dist/routes/config/channels/endpoints/predefined.d.ts.map +1 -0
- package/dist/routes/config/channels/endpoints/prefs.d.ts +1 -0
- package/dist/routes/config/channels/endpoints/prefs.d.ts.map +1 -0
- package/dist/routes/config/channels/endpoints/prefs.js +2 -1
- package/dist/routes/config/channels/endpoints/prefs.js.map +1 -1
- package/dist/routes/config/channels/endpoints/service.d.ts +2 -1
- package/dist/routes/config/channels/endpoints/service.d.ts.map +1 -0
- package/dist/routes/config/channels/endpoints/service.js +3 -1
- package/dist/routes/config/channels/endpoints/service.js.map +1 -1
- package/dist/routes/config/channels/endpoints/tags.d.ts +1 -0
- package/dist/routes/config/channels/endpoints/tags.d.ts.map +1 -0
- package/dist/routes/config/channels/endpoints/tags.js +13 -7
- package/dist/routes/config/channels/endpoints/tags.js.map +1 -1
- package/dist/routes/config/channels/healthBridge.d.ts +24 -0
- package/dist/routes/config/channels/healthBridge.d.ts.map +1 -0
- package/dist/routes/config/channels/healthBridge.js +71 -0
- package/dist/routes/config/channels/healthBridge.js.map +1 -0
- package/dist/routes/config/channels/http/handler.d.ts +1 -0
- package/dist/routes/config/channels/http/handler.d.ts.map +1 -0
- package/dist/routes/config/channels/http/playlistHint.d.ts +2 -1
- package/dist/routes/config/channels/http/playlistHint.d.ts.map +1 -0
- package/dist/routes/config/channels/http/playlistHint.js +16 -2
- package/dist/routes/config/channels/http/playlistHint.js.map +1 -1
- package/dist/routes/config/channels/http/serviceWarning.d.ts +4 -2
- package/dist/routes/config/channels/http/serviceWarning.d.ts.map +1 -0
- package/dist/routes/config/channels/http/serviceWarning.js +3 -2
- package/dist/routes/config/channels/http/serviceWarning.js.map +1 -1
- package/dist/routes/config/channels/index.d.ts +1 -0
- package/dist/routes/config/channels/index.d.ts.map +1 -0
- package/dist/routes/config/channels/setup.d.ts +1 -0
- package/dist/routes/config/channels/setup.d.ts.map +1 -0
- package/dist/routes/config/channels/table.d.ts +3 -3
- package/dist/routes/config/channels/table.d.ts.map +1 -0
- package/dist/routes/config/channels/table.js +148 -107
- package/dist/routes/config/channels/table.js.map +1 -1
- package/dist/routes/config/http/envelope.d.ts +1 -0
- package/dist/routes/config/http/envelope.d.ts.map +1 -0
- package/dist/routes/config/index.d.ts +35 -3
- package/dist/routes/config/index.d.ts.map +1 -0
- package/dist/routes/config/index.js +51 -2
- package/dist/routes/config/index.js.map +1 -1
- package/dist/routes/config/services.d.ts +5 -4
- package/dist/routes/config/services.d.ts.map +1 -0
- package/dist/routes/config/services.js +57 -43
- package/dist/routes/config/services.js.map +1 -1
- package/dist/routes/config/settings.d.ts +1 -0
- package/dist/routes/config/settings.d.ts.map +1 -0
- package/dist/routes/config/settings.js +98 -49
- package/dist/routes/config/settings.js.map +1 -1
- package/dist/routes/debug.d.ts +1 -0
- package/dist/routes/debug.d.ts.map +1 -0
- package/dist/routes/debug.js +277 -139
- package/dist/routes/debug.js.map +1 -1
- package/dist/routes/health.d.ts +39 -1
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +33 -27
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/hls.d.ts +1 -0
- package/dist/routes/hls.d.ts.map +1 -0
- package/dist/routes/icons.d.ts +1 -0
- package/dist/routes/icons.d.ts.map +1 -0
- package/dist/routes/icons.js +1 -1
- package/dist/routes/index.d.ts +1 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/logs.d.ts +1 -0
- package/dist/routes/logs.d.ts.map +1 -0
- package/dist/routes/logs.js +14 -4
- package/dist/routes/logs.js.map +1 -1
- package/dist/routes/mpegts.d.ts +1 -0
- package/dist/routes/mpegts.d.ts.map +1 -0
- package/dist/routes/play.d.ts +1 -0
- package/dist/routes/play.d.ts.map +1 -0
- package/dist/routes/playlist.d.ts +1 -0
- package/dist/routes/playlist.d.ts.map +1 -0
- package/dist/routes/playlist.js +7 -2
- package/dist/routes/playlist.js.map +1 -1
- package/dist/routes/root/content.d.ts +8 -5
- package/dist/routes/root/content.d.ts.map +1 -0
- package/dist/routes/root/content.js +29 -26
- package/dist/routes/root/content.js.map +1 -1
- package/dist/routes/root/index.d.ts +2 -1
- package/dist/routes/root/index.d.ts.map +1 -0
- package/dist/routes/root/index.js +26 -21
- package/dist/routes/root/index.js.map +1 -1
- package/dist/routes/root/scripts/channels.d.ts +6 -0
- package/dist/routes/root/scripts/channels.d.ts.map +1 -0
- package/dist/routes/root/scripts/channels.js +197 -118
- package/dist/routes/root/scripts/channels.js.map +1 -1
- package/dist/routes/root/scripts/clientEscape.d.ts +22 -0
- package/dist/routes/root/scripts/clientEscape.d.ts.map +1 -0
- package/dist/routes/root/scripts/clientEscape.js +41 -0
- package/dist/routes/root/scripts/clientEscape.js.map +1 -0
- package/dist/routes/root/scripts/clientUrl.d.ts +23 -0
- package/dist/routes/root/scripts/clientUrl.d.ts.map +1 -0
- package/dist/routes/root/scripts/clientUrl.js +44 -0
- package/dist/routes/root/scripts/clientUrl.js.map +1 -0
- package/dist/routes/root/scripts/config.d.ts +6 -0
- package/dist/routes/root/scripts/config.d.ts.map +1 -0
- package/dist/routes/root/scripts/config.js +110 -24
- 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.d.ts.map +1 -0
- package/dist/routes/root/scripts/shared.d.ts +1 -0
- package/dist/routes/root/scripts/shared.d.ts.map +1 -0
- package/dist/routes/root/scripts/shared.js +112 -26
- package/dist/routes/root/scripts/shared.js.map +1 -1
- package/dist/routes/root/scripts/status.d.ts +1 -0
- package/dist/routes/root/scripts/status.d.ts.map +1 -0
- package/dist/routes/root/scripts/status.handlers.d.ts +23 -33
- package/dist/routes/root/scripts/status.handlers.d.ts.map +1 -0
- package/dist/routes/root/scripts/status.handlers.js +46 -92
- package/dist/routes/root/scripts/status.handlers.js.map +1 -1
- package/dist/routes/root/scripts/status.js +21 -8
- package/dist/routes/root/scripts/status.js.map +1 -1
- package/dist/routes/root/styles.d.ts +1 -0
- package/dist/routes/root/styles.d.ts.map +1 -0
- package/dist/routes/root/styles.js +7 -4
- package/dist/routes/root/styles.js.map +1 -1
- package/dist/routes/services.d.ts +13 -1
- package/dist/routes/services.d.ts.map +1 -0
- package/dist/routes/services.js +81 -68
- package/dist/routes/services.js.map +1 -1
- package/dist/routes/sse.d.ts +1 -0
- package/dist/routes/sse.d.ts.map +1 -0
- package/dist/routes/sse.js +1 -1
- package/dist/routes/sse.js.map +1 -1
- package/dist/routes/streams.d.ts +2 -1
- package/dist/routes/streams.d.ts.map +1 -0
- package/dist/routes/streams.js +6 -4
- package/dist/routes/streams.js.map +1 -1
- package/dist/routes/theme.d.ts +3 -2
- package/dist/routes/theme.d.ts.map +1 -0
- package/dist/routes/theme.js +6 -5
- package/dist/routes/theme.js.map +1 -1
- package/dist/routes/ui.d.ts +3 -1
- package/dist/routes/ui.d.ts.map +1 -0
- package/dist/routes/ui.js +16 -4
- package/dist/routes/ui.js.map +1 -1
- package/dist/routes/upgrade.d.ts +1 -0
- package/dist/routes/upgrade.d.ts.map +1 -0
- package/dist/routes/upgrade.js +6 -2
- package/dist/routes/upgrade.js.map +1 -1
- package/dist/service/commands.context.d.ts +1 -0
- package/dist/service/commands.context.d.ts.map +1 -0
- package/dist/service/commands.context.js +4 -3
- package/dist/service/commands.context.js.map +1 -1
- package/dist/service/commands.d.ts +1 -0
- package/dist/service/commands.d.ts.map +1 -0
- package/dist/service/commands.js +10 -13
- package/dist/service/commands.js.map +1 -1
- package/dist/service/generators.context.d.ts +1 -0
- package/dist/service/generators.context.d.ts.map +1 -0
- package/dist/service/generators.context.js +1 -1
- package/dist/service/generators.context.js.map +1 -1
- package/dist/service/generators.d.ts +4 -3
- package/dist/service/generators.d.ts.map +1 -0
- package/dist/service/generators.js +111 -31
- package/dist/service/generators.js.map +1 -1
- package/dist/service/index.d.ts +1 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/streaming/captureLock.d.ts +44 -0
- package/dist/streaming/captureLock.d.ts.map +1 -0
- package/dist/streaming/captureLock.js +95 -0
- package/dist/streaming/captureLock.js.map +1 -0
- package/dist/streaming/captureSession.d.ts +31 -0
- package/dist/streaming/captureSession.d.ts.map +1 -0
- package/dist/streaming/captureSession.js +54 -0
- package/dist/streaming/captureSession.js.map +1 -0
- package/dist/streaming/clients.d.ts +1 -0
- package/dist/streaming/clients.d.ts.map +1 -0
- package/dist/streaming/codec.d.ts +1 -0
- package/dist/streaming/codec.d.ts.map +1 -0
- package/dist/streaming/fmp4Segmenter.d.ts +29 -2
- package/dist/streaming/fmp4Segmenter.d.ts.map +1 -0
- package/dist/streaming/fmp4Segmenter.js +79 -26
- package/dist/streaming/fmp4Segmenter.js.map +1 -1
- package/dist/streaming/hls.d.ts +18 -7
- package/dist/streaming/hls.d.ts.map +1 -0
- package/dist/streaming/hls.js +220 -120
- package/dist/streaming/hls.js.map +1 -1
- package/dist/streaming/hlsResume.d.ts +1 -0
- package/dist/streaming/hlsResume.d.ts.map +1 -0
- package/dist/streaming/hlsResume.js +1 -1
- package/dist/streaming/hlsResume.js.map +1 -1
- package/dist/streaming/hlsSegments.d.ts +59 -2
- package/dist/streaming/hlsSegments.d.ts.map +1 -0
- package/dist/streaming/hlsSegments.js +147 -17
- package/dist/streaming/hlsSegments.js.map +1 -1
- package/dist/streaming/lifecycle.d.ts +4 -1
- package/dist/streaming/lifecycle.d.ts.map +1 -0
- package/dist/streaming/lifecycle.js +65 -85
- package/dist/streaming/lifecycle.js.map +1 -1
- package/dist/streaming/monitor.d.ts +6 -4
- package/dist/streaming/monitor.d.ts.map +1 -0
- package/dist/streaming/monitor.js +343 -145
- package/dist/streaming/monitor.js.map +1 -1
- package/dist/streaming/mp4Parser.d.ts +5 -4
- package/dist/streaming/mp4Parser.d.ts.map +1 -0
- package/dist/streaming/mp4Parser.js +36 -13
- package/dist/streaming/mp4Parser.js.map +1 -1
- package/dist/streaming/mpegts.d.ts +16 -0
- package/dist/streaming/mpegts.d.ts.map +1 -0
- package/dist/streaming/mpegts.js +61 -17
- package/dist/streaming/mpegts.js.map +1 -1
- package/dist/streaming/playlistBuilder.d.ts +1 -0
- package/dist/streaming/playlistBuilder.d.ts.map +1 -0
- package/dist/streaming/preroll.d.ts +32 -5
- package/dist/streaming/preroll.d.ts.map +1 -0
- package/dist/streaming/preroll.js +70 -32
- package/dist/streaming/preroll.js.map +1 -1
- package/dist/streaming/pretune.d.ts +26 -1
- package/dist/streaming/pretune.d.ts.map +1 -0
- package/dist/streaming/pretune.js +22 -24
- package/dist/streaming/pretune.js.map +1 -1
- package/dist/streaming/pretuneTimers.d.ts +24 -0
- package/dist/streaming/pretuneTimers.d.ts.map +1 -0
- package/dist/streaming/pretuneTimers.js +56 -0
- package/dist/streaming/pretuneTimers.js.map +1 -0
- package/dist/streaming/recovery.d.ts +139 -5
- package/dist/streaming/recovery.d.ts.map +1 -0
- package/dist/streaming/recovery.js +160 -16
- package/dist/streaming/recovery.js.map +1 -1
- package/dist/streaming/registry.d.ts +27 -9
- package/dist/streaming/registry.d.ts.map +1 -0
- package/dist/streaming/registry.js +21 -3
- package/dist/streaming/registry.js.map +1 -1
- package/dist/streaming/setup.d.ts +157 -29
- package/dist/streaming/setup.d.ts.map +1 -0
- package/dist/streaming/setup.js +1034 -458
- package/dist/streaming/setup.js.map +1 -1
- package/dist/streaming/showInfo.d.ts +21 -1
- package/dist/streaming/showInfo.d.ts.map +1 -0
- package/dist/streaming/showInfo.js +31 -16
- package/dist/streaming/showInfo.js.map +1 -1
- package/dist/streaming/statusEmitter.d.ts +10 -10
- package/dist/streaming/statusEmitter.d.ts.map +1 -0
- package/dist/streaming/statusEmitter.js +5 -8
- package/dist/streaming/statusEmitter.js.map +1 -1
- package/dist/types/channels.d.ts +16 -4
- package/dist/types/channels.d.ts.map +1 -0
- package/dist/types/channels.js +4 -2
- package/dist/types/channels.js.map +1 -1
- package/dist/types/config.d.ts +16 -5
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/index.d.ts +3 -2
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/profiles.d.ts +6 -4
- package/dist/types/profiles.d.ts.map +1 -0
- package/dist/types/selection.d.ts +31 -3
- package/dist/types/selection.d.ts.map +1 -0
- package/dist/types/selection.js +4 -2
- package/dist/types/selection.js.map +1 -1
- package/dist/types/shared.d.ts +1 -0
- package/dist/types/shared.d.ts.map +1 -0
- package/dist/types/streaming.d.ts +8 -0
- package/dist/types/streaming.d.ts.map +1 -0
- package/dist/upgrade/commands.context.d.ts +1 -0
- package/dist/upgrade/commands.context.d.ts.map +1 -0
- package/dist/upgrade/commands.context.js +14 -10
- package/dist/upgrade/commands.context.js.map +1 -1
- package/dist/upgrade/commands.d.ts +8 -15
- package/dist/upgrade/commands.d.ts.map +1 -0
- package/dist/upgrade/commands.js +27 -28
- package/dist/upgrade/commands.js.map +1 -1
- package/dist/upgrade/detection.context.d.ts +1 -0
- package/dist/upgrade/detection.context.d.ts.map +1 -0
- package/dist/upgrade/detection.context.js +4 -1
- package/dist/upgrade/detection.context.js.map +1 -1
- package/dist/upgrade/detection.d.ts +9 -7
- package/dist/upgrade/detection.d.ts.map +1 -0
- package/dist/upgrade/detection.js +23 -54
- package/dist/upgrade/detection.js.map +1 -1
- package/dist/upgrade/index.d.ts +2 -0
- package/dist/upgrade/index.d.ts.map +1 -0
- package/dist/upgrade/index.js +1 -0
- package/dist/upgrade/index.js.map +1 -1
- package/dist/upgrade/lifecycle.context.d.ts +20 -0
- package/dist/upgrade/lifecycle.context.d.ts.map +1 -0
- package/dist/upgrade/lifecycle.context.js +47 -0
- package/dist/upgrade/lifecycle.context.js.map +1 -0
- package/dist/upgrade/lifecycle.d.ts +72 -0
- package/dist/upgrade/lifecycle.d.ts.map +1 -0
- package/dist/upgrade/lifecycle.js +175 -0
- package/dist/upgrade/lifecycle.js.map +1 -0
- package/dist/upgrade/pathHandle.d.ts +30 -0
- package/dist/upgrade/pathHandle.d.ts.map +1 -0
- package/dist/upgrade/pathHandle.js +102 -0
- package/dist/upgrade/pathHandle.js.map +1 -0
- package/dist/utils/bootSession.context.d.ts +16 -0
- package/dist/utils/bootSession.context.d.ts.map +1 -0
- package/dist/utils/bootSession.context.js +60 -0
- package/dist/utils/bootSession.context.js.map +1 -0
- package/dist/utils/bootSession.d.ts +17 -0
- package/dist/utils/bootSession.d.ts.map +1 -0
- package/dist/utils/bootSession.js +20 -0
- package/dist/utils/bootSession.js.map +1 -0
- package/dist/utils/chromeFetch.d.ts +1 -0
- package/dist/utils/chromeFetch.d.ts.map +1 -0
- package/dist/utils/cliOutput.d.ts +1 -0
- package/dist/utils/cliOutput.d.ts.map +1 -0
- package/dist/utils/clock.d.ts +5 -4
- package/dist/utils/clock.d.ts.map +1 -0
- package/dist/utils/clock.js +19 -16
- package/dist/utils/clock.js.map +1 -1
- package/dist/utils/debugFilter.d.ts +9 -1
- package/dist/utils/debugFilter.d.ts.map +1 -0
- package/dist/utils/debugFilter.js +60 -33
- package/dist/utils/debugFilter.js.map +1 -1
- package/dist/utils/delay.d.ts +48 -15
- package/dist/utils/delay.d.ts.map +1 -0
- package/dist/utils/delay.js +73 -20
- package/dist/utils/delay.js.map +1 -1
- package/dist/utils/errors.d.ts +32 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +45 -4
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/evaluate.d.ts +1 -0
- package/dist/utils/evaluate.d.ts.map +1 -0
- package/dist/utils/evaluate.js +29 -23
- package/dist/utils/evaluate.js.map +1 -1
- package/dist/utils/ffmpeg.context.d.ts +1 -0
- package/dist/utils/ffmpeg.context.d.ts.map +1 -0
- package/dist/utils/ffmpeg.context.js.map +1 -1
- package/dist/utils/ffmpeg.d.ts +29 -7
- package/dist/utils/ffmpeg.d.ts.map +1 -0
- package/dist/utils/ffmpeg.js +32 -14
- package/dist/utils/ffmpeg.js.map +1 -1
- package/dist/utils/fileLogger.d.ts +3 -1
- package/dist/utils/fileLogger.d.ts.map +1 -0
- package/dist/utils/fileLogger.js +64 -29
- package/dist/utils/fileLogger.js.map +1 -1
- package/dist/utils/format.d.ts +14 -1
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +19 -5
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logEmitter.d.ts +1 -0
- package/dist/utils/logEmitter.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +10 -6
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/m3u.d.ts +3 -2
- package/dist/utils/m3u.d.ts.map +1 -0
- package/dist/utils/m3u.js +4 -3
- package/dist/utils/m3u.js.map +1 -1
- package/dist/utils/markup.d.ts +13 -1
- package/dist/utils/markup.d.ts.map +1 -0
- package/dist/utils/markup.js +28 -4
- package/dist/utils/markup.js.map +1 -1
- package/dist/utils/memo.d.ts +3 -2
- package/dist/utils/memo.d.ts.map +1 -0
- package/dist/utils/memo.js +3 -3
- package/dist/utils/morganStream.d.ts +1 -0
- package/dist/utils/morganStream.d.ts.map +1 -0
- package/dist/utils/network.d.ts +1 -0
- package/dist/utils/network.d.ts.map +1 -0
- package/dist/utils/network.js +2 -2
- package/dist/utils/pid.d.ts +3 -25
- package/dist/utils/pid.d.ts.map +1 -0
- package/dist/utils/pid.js +10 -49
- package/dist/utils/pid.js.map +1 -1
- package/dist/utils/platform.d.ts +3 -1
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +2 -1
- package/dist/utils/platform.js.map +1 -1
- package/dist/utils/processInspector.context.d.ts +8 -0
- package/dist/utils/processInspector.context.d.ts.map +1 -0
- package/dist/utils/processInspector.context.js +106 -0
- package/dist/utils/processInspector.context.js.map +1 -0
- package/dist/utils/processInspector.d.ts +55 -0
- package/dist/utils/processInspector.d.ts.map +1 -0
- package/dist/utils/processInspector.js +127 -0
- package/dist/utils/processInspector.js.map +1 -0
- package/dist/utils/retry.d.ts +25 -2
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +33 -6
- package/dist/utils/retry.js.map +1 -1
- package/dist/utils/runtimeIdentity.context.d.ts +7 -0
- package/dist/utils/runtimeIdentity.context.d.ts.map +1 -0
- package/dist/utils/runtimeIdentity.context.js +43 -0
- package/dist/utils/runtimeIdentity.context.js.map +1 -0
- package/dist/utils/runtimeIdentity.d.ts +98 -0
- package/dist/utils/runtimeIdentity.d.ts.map +1 -0
- package/dist/utils/runtimeIdentity.js +181 -0
- package/dist/utils/runtimeIdentity.js.map +1 -0
- package/dist/utils/sanitize.d.ts +1 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/streamContext.d.ts +2 -1
- package/dist/utils/streamContext.d.ts.map +1 -0
- package/dist/utils/streamContext.js +1 -1
- package/dist/utils/timing.d.ts +2 -1
- package/dist/utils/timing.d.ts.map +1 -0
- package/dist/utils/timing.js +0 -5
- package/dist/utils/timing.js.map +1 -1
- package/dist/utils/version.d.ts +1 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +47 -13
- package/dist/utils/version.js.map +1 -1
- package/package.json +26 -20
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
import { LOG, evaluateWithAbort, formatError } from "../../utils/index.js";
|
|
2
|
+
import { attemptGuideRecovery, createEmptyDiscoveryGuard, logAvailableChannels } from "./shared.js";
|
|
3
|
+
import { createProviderChannelCache, dedupeCacheEntries } from "./cache.js";
|
|
2
4
|
import { CONFIG } from "../../config/index.js";
|
|
3
|
-
import { logAvailableChannels } from "./shared.js";
|
|
4
5
|
// Base URL for YouTube TV watch page navigation.
|
|
5
6
|
const YOUTUBE_TV_BASE_URL = "https://tv.youtube.com";
|
|
6
7
|
// Unified channel cache for YouTube TV. Maps lowercased guide names (e.g., "cnn", "nbc 5", "espn") to their combined discovery and tuning data. Populated during
|
|
7
8
|
// the first tune (when the strategy enumerates all ~256 channels from the non-virtualized EPG grid) or the first discovery call. Both tuning (via findWatchUrl) and
|
|
8
9
|
// discovery (via getCachedChannels / discoverYttvChannels) read from this single cache. Cleared on browser disconnect via clearYttvCache().
|
|
9
|
-
const
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
|
|
14
|
-
// Number of consecutive empty discoveries before attempting site data recovery via CDP.
|
|
15
|
-
const EMPTY_DISCOVERY_RECOVERY_THRESHOLD = 3;
|
|
10
|
+
const yttvCache = createProviderChannelCache((entry) => entry.discovered);
|
|
11
|
+
// Recovery guard for the degraded guide state where the grid container renders but channel entries are not populated, which stale browser session state -
|
|
12
|
+
// service workers and cached SPA code after a Chrome update - produces. The guard counts the empty loads and signals when clearing YTTV site data (service
|
|
13
|
+
// workers and cache storage) via CDP is warranted. Reset on any successful discovery (> 0 channels found) and on browser restart (via clearYttvCache).
|
|
14
|
+
const emptyDiscoveryGuard = createEmptyDiscoveryGuard("YouTube TV");
|
|
16
15
|
// Known alternate channel names for affiliates that vary by market. CW appears as "WGN" in some markets. PBS affiliates appear under local call letters (e.g.,
|
|
17
16
|
// WTTW, KQED) or branded names (e.g., "Cascade PBS", "Lakeshore PBS") rather than "PBS", so we list the major market call letters and branded names to cover most
|
|
18
17
|
// users. Each alternate is tried after the primary name fails both exact and prefix+digit matching. Users in smaller markets override via custom channel entries with
|
|
@@ -33,63 +32,70 @@ const CHANNEL_ALTERNATES = {
|
|
|
33
32
|
* "abc 7") while excluding unrelated channels that share the prefix (e.g., "nbc sports").
|
|
34
33
|
* 3. Parenthetical suffix: cache key starts with the name followed by " (". Catches timezone/region variants like "magnolia network (pacific)".
|
|
35
34
|
*
|
|
36
|
-
* When a non-exact match succeeds, the result is also cached under the primary channelSelector key for O(1) lookup on subsequent calls. This function
|
|
37
|
-
*
|
|
38
|
-
* page.
|
|
35
|
+
* When a non-exact match succeeds, the result is also cached under the primary channelSelector key for O(1) lookup on subsequent calls. This function backs the
|
|
36
|
+
* resolveDirectUrl hook via the async resolveYttvDirectUrl wrapper - after the first tune populates the cache via channel discovery, every subsequent YTTV tune
|
|
37
|
+
* resolves here without loading the guide page.
|
|
39
38
|
* @param channelName - The channelSelector value (e.g., "CNN", "NBC", "CW").
|
|
40
39
|
* @returns The full watch URL or null if no match is found.
|
|
41
40
|
*/
|
|
42
41
|
function findWatchUrl(channelName) {
|
|
43
42
|
const lower = channelName.toLowerCase();
|
|
44
|
-
// Build the candidate list: primary name first, then any known alternates for markets where the affiliate uses a different name.
|
|
45
|
-
// because TypeScript's Record indexing doesn't capture that the key may not exist at runtime.
|
|
43
|
+
// Build the candidate list: primary name first, then any known alternates for markets where the affiliate uses a different name.
|
|
46
44
|
const alternates = CHANNEL_ALTERNATES[lower];
|
|
47
45
|
const namesToTry = alternates ? [lower, ...alternates.map((a) => a.toLowerCase())] : [lower];
|
|
48
46
|
for (const name of namesToTry) {
|
|
49
47
|
// Tier 1: Exact match.
|
|
50
|
-
const exact =
|
|
48
|
+
const exact = yttvCache.map.get(name);
|
|
51
49
|
if (exact) {
|
|
52
50
|
// Cache under the primary channelSelector key if we matched via an alternate name, so subsequent lookups are O(1).
|
|
53
51
|
if (name !== lower) {
|
|
54
|
-
|
|
52
|
+
yttvCache.map.set(lower, exact);
|
|
55
53
|
}
|
|
56
54
|
return exact.watchUrl;
|
|
57
55
|
}
|
|
58
56
|
// Tier 2: Prefix+digit match for local affiliates. Iterate all cache entries to find one whose key starts with "{name} " followed by a digit, matching the
|
|
59
|
-
// "{Network} {Number}" pattern (e.g., "nbc 5", "abc 7") while excluding unrelated channels that share the prefix (e.g., "nbc sports").
|
|
60
|
-
for
|
|
57
|
+
// "{Network} {Number}" pattern (e.g., "nbc 5", "abc 7") while excluding unrelated channels that share the prefix (e.g., "nbc sports"). The 48 and 57 bounds
|
|
58
|
+
// are the ASCII code points for '0' and '9', so the charCodeAt comparison tests that the character after the space is a digit.
|
|
59
|
+
for (const [key, entry] of yttvCache.map) {
|
|
61
60
|
if (key.startsWith(name + " ") && (key.length > name.length + 1) && (key.charCodeAt(name.length + 1) >= 48) && (key.charCodeAt(name.length + 1) <= 57)) {
|
|
62
|
-
|
|
61
|
+
yttvCache.map.set(lower, entry);
|
|
63
62
|
return entry.watchUrl;
|
|
64
63
|
}
|
|
65
64
|
}
|
|
66
65
|
// Tier 3: Parenthetical suffix match for timezone/region variants. Find a cache entry whose key starts with "{name} (" to catch channels like
|
|
67
66
|
// "magnolia network (pacific)" or "the filipino channel (pacific)".
|
|
68
|
-
for (const [key, entry] of
|
|
67
|
+
for (const [key, entry] of yttvCache.map) {
|
|
69
68
|
if (key.startsWith(name + " (")) {
|
|
70
|
-
|
|
69
|
+
yttvCache.map.set(lower, entry);
|
|
71
70
|
return entry.watchUrl;
|
|
72
71
|
}
|
|
73
72
|
}
|
|
74
73
|
}
|
|
75
74
|
return null;
|
|
76
75
|
}
|
|
77
|
-
/**
|
|
78
|
-
* Invalidates the cached YouTube TV watch URL for the given channel selector. Called when a cached URL fails to produce a working stream. Deletes the
|
|
79
|
-
* channelSelector key - the guide-name entries from channel discovery are left intact and will be refreshed on the next strategy run when the guide page is
|
|
80
|
-
* reloaded.
|
|
81
|
-
* @param channelSelector - The channel selector string to invalidate.
|
|
82
|
-
*/
|
|
83
|
-
function invalidateYttvDirectUrl(channelSelector) {
|
|
84
|
-
yttvChannelCache.delete(channelSelector.toLowerCase());
|
|
85
|
-
}
|
|
86
76
|
/**
|
|
87
77
|
* Clears all YouTube TV caches: the unified channel cache and the empty discovery counter. Called by clearChannelSelectionCaches() in the coordinator when the
|
|
88
78
|
* browser restarts, since a fresh browser session resolves the degraded guide state that the counter tracks.
|
|
89
79
|
*/
|
|
90
80
|
function clearYttvCache() {
|
|
91
|
-
|
|
92
|
-
|
|
81
|
+
emptyDiscoveryGuard.reset();
|
|
82
|
+
yttvCache.clear();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Returns YouTube TV's durable lineup for the persisted lineup store: each cached channel's identity paired with its watch URL. The URL is built from the guide's
|
|
86
|
+
* own watch path and carries no session state, so it survives a restart and lets a boot whose guide read failed still tune directly. The three-tier matching above
|
|
87
|
+
* files one entry object under several alias keys, so the entries are reduced to one occurrence per object before projection.
|
|
88
|
+
* @returns The durable lineup rows, or null when the cache is cold.
|
|
89
|
+
*/
|
|
90
|
+
function exportYttvLineup() {
|
|
91
|
+
if (yttvCache.map.size === 0) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
return dedupeCacheEntries(yttvCache.map.values()).map((entry) => ({
|
|
95
|
+
channelSelector: entry.discovered.channelSelector,
|
|
96
|
+
name: entry.discovered.name,
|
|
97
|
+
watchUrl: entry.watchUrl
|
|
98
|
+
}));
|
|
93
99
|
}
|
|
94
100
|
/**
|
|
95
101
|
* Discovers all channels from the YouTube TV EPG grid in a single evaluate round-trip. For each thumbnail endpoint with a valid watch/ href, extracts the channel
|
|
@@ -116,85 +122,24 @@ async function discoverGuideChannels(page) {
|
|
|
116
122
|
return results;
|
|
117
123
|
}, []);
|
|
118
124
|
}
|
|
119
|
-
/**
|
|
120
|
-
* Attempts to recover from a degraded YouTube TV guide state by clearing cached site data (service workers and cache storage) via CDP and reloading the guide page.
|
|
121
|
-
* This targets the specific failure mode where the guide grid container renders but channel entries are not populated, typically caused by stale browser session
|
|
122
|
-
* state after a Chrome update. Cookies and login session are preserved - only caching layers are cleared.
|
|
123
|
-
* @param page - The Puppeteer page object.
|
|
124
|
-
* @returns Discovered channels after recovery, or an empty array if recovery failed.
|
|
125
|
-
*/
|
|
126
|
-
async function attemptGuideRecovery(page) {
|
|
127
|
-
LOG.warn("Clearing YouTube TV cached site data to recover from empty guide.");
|
|
128
|
-
// Clear service workers and cache storage for the YouTube TV origin. These are caching layers that will be repopulated on reload - cookies and login session
|
|
129
|
-
// state are deliberately preserved to avoid forcing re-authentication.
|
|
130
|
-
try {
|
|
131
|
-
const client = await page.createCDPSession();
|
|
132
|
-
await client.send("Storage.clearDataForOrigin", { origin: YOUTUBE_TV_BASE_URL, storageTypes: "cache_storage,service_workers" });
|
|
133
|
-
await client.detach();
|
|
134
|
-
}
|
|
135
|
-
catch (error) {
|
|
136
|
-
LOG.warn("Failed to clear YouTube TV site data: %s.", formatError(error));
|
|
137
|
-
return [];
|
|
138
|
-
}
|
|
139
|
-
// Reload the guide page with fresh state.
|
|
140
|
-
try {
|
|
141
|
-
await page.goto(YOUTUBE_TV_BASE_URL + "/live", { timeout: CONFIG.streaming.navigationTimeout, waitUntil: "load" });
|
|
142
|
-
}
|
|
143
|
-
catch (error) {
|
|
144
|
-
LOG.warn("Failed to reload YouTube TV guide after clearing site data: %s.", formatError(error));
|
|
145
|
-
return [];
|
|
146
|
-
}
|
|
147
|
-
// Wait for the EPG grid to render after reload.
|
|
148
|
-
try {
|
|
149
|
-
await page.waitForSelector("ytu-epg-row", { timeout: CONFIG.streaming.videoTimeout });
|
|
150
|
-
}
|
|
151
|
-
catch {
|
|
152
|
-
LOG.warn("YouTube TV guide grid did not load after clearing site data.");
|
|
153
|
-
return [];
|
|
154
|
-
}
|
|
155
|
-
// Re-attempt channel discovery on the reloaded page.
|
|
156
|
-
const channels = await discoverGuideChannels(page);
|
|
157
|
-
if (channels.length > 0) {
|
|
158
|
-
LOG.info("YouTube TV guide recovery succeeded - discovered %s channels after clearing site data.", channels.length);
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
LOG.warn("YouTube TV guide still empty after clearing site data.");
|
|
162
|
-
}
|
|
163
|
-
return channels;
|
|
164
|
-
}
|
|
165
125
|
// Broadcast network names that have local affiliates displayed as "{Network} {Number}" (e.g., "NBC 5", "ABC 7") in the YouTube TV guide. Used to constrain
|
|
166
126
|
// prefix+digit affiliate detection to actual broadcast networks and avoid false positives like "ESPN 2" or "Fox Sports 1".
|
|
167
127
|
const YTTV_BROADCAST_NETWORKS = new Set(["abc", "cbs", "cw", "fox", "nbc", "pbs"]);
|
|
168
128
|
// Pattern for detecting local affiliate channels displayed as "{Network} {Number}" (e.g., "NBC 5", "ABC 7"). The prefix is validated against
|
|
169
129
|
// YTTV_BROADCAST_NETWORKS before tagging as an affiliate.
|
|
170
130
|
const YTTV_AFFILIATE_PATTERN = /^(.+?) \d/;
|
|
171
|
-
/**
|
|
172
|
-
* Derives a DiscoveredChannel array from the unified channel cache, deduplicating alias entries via Set reference equality. Aliases are created by findWatchUrl
|
|
173
|
-
* when a prefix+digit, parenthetical, or CHANNEL_ALTERNATES match caches the same YttvChannelEntry under the primary channelSelector key. Without deduplication,
|
|
174
|
-
* iterating cache values would produce duplicate entries in the discovery output. Sorts by name before returning.
|
|
175
|
-
* @returns Sorted, deduplicated array of discovered channels.
|
|
176
|
-
*/
|
|
177
|
-
function buildYttvDiscoveredChannels() {
|
|
178
|
-
const channels = [];
|
|
179
|
-
const seen = new Set();
|
|
180
|
-
for (const entry of yttvChannelCache.values()) {
|
|
181
|
-
if (seen.has(entry)) {
|
|
182
|
-
continue;
|
|
183
|
-
}
|
|
184
|
-
seen.add(entry);
|
|
185
|
-
channels.push(entry.discovered);
|
|
186
|
-
}
|
|
187
|
-
channels.sort((a, b) => a.name.localeCompare(b.name));
|
|
188
|
-
return channels;
|
|
189
|
-
}
|
|
190
131
|
/**
|
|
191
132
|
* Populates the unified channel cache from raw guide channel data. For each channel, builds a DiscoveredChannel with affiliate detection and pairs it with the
|
|
192
|
-
* full watch URL. Detects affiliates via
|
|
193
|
-
*
|
|
133
|
+
* full watch URL. Detects affiliates via the following mechanisms: a prefix+digit pattern constrained to known broadcast networks (e.g., "NBC 5" -> affiliate
|
|
134
|
+
* of "NBC"), and CHANNEL_ALTERNATES entries for affiliates that use different names entirely (e.g., "WGN" -> affiliate of "CW"). Shared by youtubeGridStrategy
|
|
194
135
|
* (tuning-time population) and discoverYttvChannels (discovery endpoint).
|
|
195
136
|
* @param rawChannels - Array of channel names and watch paths from discoverGuideChannels().
|
|
196
137
|
*/
|
|
197
138
|
function populateYttvChannelCache(rawChannels) {
|
|
139
|
+
// Every caller hands us a complete read of the non-virtualized guide grid, so the cache mirrors that read rather than accumulating the union of every lineup a
|
|
140
|
+
// browser session has seen. A channel the provider has dropped is absent from the next read, and starting from an empty cache is what keeps it out. The tiered
|
|
141
|
+
// alias keys go with it and are re-derived by the next lookup that needs one.
|
|
142
|
+
yttvCache.clear();
|
|
198
143
|
// Build a reverse lookup from alternate names to their parent network for affiliate detection.
|
|
199
144
|
const alternateToNetwork = new Map();
|
|
200
145
|
for (const [network, alts] of Object.entries(CHANNEL_ALTERNATES)) {
|
|
@@ -220,8 +165,11 @@ function populateYttvChannelCache(rawChannels) {
|
|
|
220
165
|
entry.channelSelector = altNetwork;
|
|
221
166
|
}
|
|
222
167
|
}
|
|
223
|
-
|
|
168
|
+
yttvCache.map.set(ch.name.toLowerCase(), { discovered: entry, watchUrl: YOUTUBE_TV_BASE_URL + "/" + ch.watchPath });
|
|
224
169
|
}
|
|
170
|
+
// The read this pass was built from covered the entire grid, so what sits in the cache at this point is the complete lineup and warm reads can be served
|
|
171
|
+
// from it.
|
|
172
|
+
yttvCache.markComplete();
|
|
225
173
|
}
|
|
226
174
|
/**
|
|
227
175
|
* YouTube TV grid strategy: discovers all channels from the non-virtualized EPG grid at tv.youtube.com/live in a single pass, populating the unified channel cache
|
|
@@ -246,7 +194,7 @@ async function youtubeGridStrategy(page, profile) {
|
|
|
246
194
|
await page.waitForSelector("ytu-epg-row", { timeout: CONFIG.streaming.videoTimeout });
|
|
247
195
|
}
|
|
248
196
|
catch {
|
|
249
|
-
return { reason: "YouTube TV guide grid did not load.", success: false };
|
|
197
|
+
return { guideUnavailable: true, reason: "YouTube TV guide grid did not load.", success: false };
|
|
250
198
|
}
|
|
251
199
|
// Discover all channels from the guide grid.
|
|
252
200
|
let allChannels = await discoverGuideChannels(page);
|
|
@@ -254,10 +202,15 @@ async function youtubeGridStrategy(page, profile) {
|
|
|
254
202
|
// This can happen when stale browser session state (service workers, cached SPA code) becomes inconsistent after a Chrome update. Track consecutive occurrences
|
|
255
203
|
// and attempt recovery by clearing cached site data once the threshold is reached.
|
|
256
204
|
if (allChannels.length === 0) {
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
205
|
+
if (emptyDiscoveryGuard.recordEmpty()) {
|
|
206
|
+
allChannels = await attemptGuideRecovery(page, {
|
|
207
|
+
discover: discoverGuideChannels,
|
|
208
|
+
origin: YOUTUBE_TV_BASE_URL,
|
|
209
|
+
providerName: "YouTube TV",
|
|
210
|
+
reloadUrl: YOUTUBE_TV_BASE_URL + "/live",
|
|
211
|
+
storageTypes: "cache_storage,service_workers",
|
|
212
|
+
waitSelector: "ytu-epg-row"
|
|
213
|
+
});
|
|
261
214
|
}
|
|
262
215
|
}
|
|
263
216
|
// If we still have no channels after the initial discovery and any recovery attempt, there is nothing to search or cache. This error message is deliberately
|
|
@@ -266,8 +219,8 @@ async function youtubeGridStrategy(page, profile) {
|
|
|
266
219
|
return { reason: "YouTube TV guide is empty - no channels were discovered.", success: false };
|
|
267
220
|
}
|
|
268
221
|
// Successful discovery - reset the consecutive empty counter and repopulate the unified channel cache. Always repopulate rather than skipping when the cache has
|
|
269
|
-
// entries, because
|
|
270
|
-
|
|
222
|
+
// entries, because an entry the invalidate hook dropped needs restoring with a fresh watch URL from the guide.
|
|
223
|
+
emptyDiscoveryGuard.reset();
|
|
271
224
|
populateYttvChannelCache(allChannels);
|
|
272
225
|
LOG.debug("tuning:yttv", "Discovered %s YouTube TV channels.", allChannels.length);
|
|
273
226
|
// Look up the target channel using tiered matching against the populated cache.
|
|
@@ -307,7 +260,6 @@ async function youtubeGridStrategy(page, profile) {
|
|
|
307
260
|
* @param _page - Unused. Present to satisfy the async resolveDirectUrl signature.
|
|
308
261
|
* @returns The cached watch URL or null.
|
|
309
262
|
*/
|
|
310
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/require-await
|
|
311
263
|
async function resolveYttvDirectUrl(channelSelector, _page) {
|
|
312
264
|
return findWatchUrl(channelSelector);
|
|
313
265
|
}
|
|
@@ -320,9 +272,10 @@ async function resolveYttvDirectUrl(channelSelector, _page) {
|
|
|
320
272
|
* @returns Array of discovered channels with affiliate tagging.
|
|
321
273
|
*/
|
|
322
274
|
async function discoverYttvChannels(page) {
|
|
323
|
-
// Return from the unified cache if already
|
|
324
|
-
|
|
325
|
-
|
|
275
|
+
// Return from the unified cache if a prior tune or discovery call already enumerated the lineup.
|
|
276
|
+
const cached = yttvCache.cached();
|
|
277
|
+
if (cached) {
|
|
278
|
+
return cached;
|
|
326
279
|
}
|
|
327
280
|
// Wait for at least one EPG row to confirm the guide grid has rendered. The route handler navigates with networkidle2, which ensures all API data has arrived
|
|
328
281
|
// before this function is called - no additional network idle wait is needed here.
|
|
@@ -338,28 +291,20 @@ async function discoverYttvChannels(page) {
|
|
|
338
291
|
return [];
|
|
339
292
|
}
|
|
340
293
|
populateYttvChannelCache(allChannels);
|
|
341
|
-
return
|
|
342
|
-
}
|
|
343
|
-
/**
|
|
344
|
-
* Returns cached discovered channels from the unified channel cache, or null if the cache is empty (no prior tune or discovery call has enumerated the lineup).
|
|
345
|
-
* @returns Sorted array of discovered channels or null.
|
|
346
|
-
*/
|
|
347
|
-
function getYttvCachedChannels() {
|
|
348
|
-
if (yttvChannelCache.size === 0) {
|
|
349
|
-
return null;
|
|
350
|
-
}
|
|
351
|
-
return buildYttvDiscoveredChannels();
|
|
294
|
+
return yttvCache.discovered();
|
|
352
295
|
}
|
|
353
296
|
export const yttvProvider = {
|
|
354
297
|
discoverChannels: discoverYttvChannels,
|
|
355
|
-
|
|
298
|
+
exportDurableLineup: exportYttvLineup,
|
|
299
|
+
getCachedChannels: yttvCache.cached,
|
|
356
300
|
guideUrl: "https://tv.youtube.com/live",
|
|
357
301
|
label: "YouTube TV",
|
|
358
302
|
// Profile for YouTube TV (tv.youtube.com/live). The guide grid renders all ~256 channel rows in the DOM simultaneously (no virtualization), each containing a
|
|
359
|
-
// direct watch URL. The youtubeGrid strategy
|
|
360
|
-
//
|
|
361
|
-
//
|
|
362
|
-
// directly on the active video element without gesture
|
|
303
|
+
// direct watch URL. The youtubeGrid strategy enumerates every channel in a single evaluate round-trip - one querySelectorAll reads all channel names and watch
|
|
304
|
+
// URLs into the unified cache - then resolves the target channel's watch URL from that cache and navigates directly, with no scrolling, clicking, or timing
|
|
305
|
+
// workarounds needed. Uses selectReadyVideo because the watch page has ~36 video elements (live preview thumbnails from the guide) but only one active stream
|
|
306
|
+
// with readyState >= 3 and videoWidth > 0. Extends fullscreenApi because requestFullscreen() works directly on the active video element without gesture
|
|
307
|
+
// requirements.
|
|
363
308
|
profile: {
|
|
364
309
|
category: "multiChannel",
|
|
365
310
|
channelSelection: { strategy: "youtubeGrid" },
|
|
@@ -373,7 +318,9 @@ export const yttvProvider = {
|
|
|
373
318
|
strategy: {
|
|
374
319
|
clearCache: clearYttvCache,
|
|
375
320
|
execute: youtubeGridStrategy,
|
|
376
|
-
|
|
321
|
+
// Only the failing selector's own key is dropped. The guide-name entries stay put, and the next strategy run reloads the guide and rebuilds them all with
|
|
322
|
+
// fresh watch URLs.
|
|
323
|
+
invalidateDirectUrl: yttvCache.invalidate,
|
|
377
324
|
resolveDirectUrl: resolveYttvDirectUrl
|
|
378
325
|
},
|
|
379
326
|
strategyName: "youtubeGrid"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"youtubeTv.js","sourceRoot":"","sources":["../../../src/browser/tuning/youtubeTv.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"youtubeTv.js","sourceRoot":"","sources":["../../../src/browser/tuning/youtubeTv.ts"],"names":[],"mappings":"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"}
|
package/dist/browser/video.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import type { Frame, Page } from "puppeteer-core";
|
|
2
2
|
import type { Nullable, ResolvedSiteProfile, TuneResult, VideoSelectorType } from "../types/index.ts";
|
|
3
|
+
import { getProvidersForDomain, selectChannel } from "./channelSelection.ts";
|
|
4
|
+
import { classifyBlockedPage } from "./blockedPage.ts";
|
|
5
|
+
import { startOverlayHandling } from "./consent.ts";
|
|
3
6
|
/**
|
|
4
7
|
* Builds a selector type identifier for the video element based on the site profile. This returns a string that browser context code interprets to select the
|
|
5
8
|
* appropriate video element. Using a string identifier instead of passing functions avoids serialization issues with page.evaluate() and is more secure than
|
|
@@ -33,9 +36,11 @@ export interface VideoStateInfo {
|
|
|
33
36
|
* Gets the current state of the video element for health monitoring. Returns null if no video element is found.
|
|
34
37
|
* @param context - The frame or page containing the video element.
|
|
35
38
|
* @param selectorType - The video selector type for finding the element.
|
|
39
|
+
* @param timeoutMs - How long to wait for the read before giving up. Omit for the evaluate wrapper's default bound; a caller that already has reason to suspect
|
|
40
|
+
* an unresponsive tab passes a shorter one, since it needs to tell a hung page from a live one rather than wait out a slow answer.
|
|
36
41
|
* @returns The video state or null if no video found.
|
|
37
42
|
*/
|
|
38
|
-
export declare function getVideoState(context: Frame | Page, selectorType: VideoSelectorType): Promise<Nullable<VideoStateInfo>>;
|
|
43
|
+
export declare function getVideoState(context: Frame | Page, selectorType: VideoSelectorType, timeoutMs?: number): Promise<Nullable<VideoStateInfo>>;
|
|
39
44
|
/**
|
|
40
45
|
* Enforces volume settings on the video element. Sets muted to false and volume to 1. This is called periodically during health monitoring to counter sites that
|
|
41
46
|
* aggressively mute videos.
|
|
@@ -43,6 +48,18 @@ export declare function getVideoState(context: Frame | Page, selectorType: Video
|
|
|
43
48
|
* @param selectorType - The video selector type for finding the element.
|
|
44
49
|
*/
|
|
45
50
|
export declare function enforceVideoVolume(context: Frame | Page, selectorType: VideoSelectorType): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Mutes every video element currently on the page, silencing audio that does not belong to the channel being established. A multi-channel page auto-plays a
|
|
53
|
+
* default livestream on load (Hulu's /live, for example), and with a capture pipeline already running that audio bleeds into the stream until channel selection
|
|
54
|
+
* reaches the requested channel; a page reloaded to re-establish a channel meets the same default again. Two moments call for it: where a tune begins, and where
|
|
55
|
+
* a re-establishment's playback initialization settles - the latter because playback establishment unmutes by a direct property write that an already-playing
|
|
56
|
+
* element keeps until something mutes it again.
|
|
57
|
+
*
|
|
58
|
+
* Best-effort: a page with no video elements yet, or one in a transitional state, swallows the failure rather than failing the caller. The unmute that matters
|
|
59
|
+
* happens naturally when startVideoPlayback() runs on the tuned channel.
|
|
60
|
+
* @param page - The Puppeteer page object.
|
|
61
|
+
*/
|
|
62
|
+
export declare function muteExistingVideos(page: Page): Promise<void>;
|
|
46
63
|
/**
|
|
47
64
|
* Suppresses audio on a browser page for native HLS streaming. Native mode fetches segments directly from the provider's CDN - the page's video element is not needed
|
|
48
65
|
* for content delivery, but the page stays alive for token refresh. Without suppression, the video continues playing audibly on the local machine.
|
|
@@ -107,8 +124,8 @@ export declare function startVideoPlayback(context: Frame | Page, selectorType:
|
|
|
107
124
|
/**
|
|
108
125
|
* Navigates a browser page to the specified URL with site-appropriate wait conditions. The navigation strategy depends on the site's player implementation:
|
|
109
126
|
*
|
|
110
|
-
* - waitForNetworkIdle=true: Wait for network activity to settle
|
|
111
|
-
* initialized. Used for sites with complex async initialization.
|
|
127
|
+
* - waitForNetworkIdle=true: Wait for network activity to settle, allowing up to 2 concurrent connections for 500ms. This ensures all JavaScript has loaded
|
|
128
|
+
* and the player is fully initialized. Used for sites with complex async initialization.
|
|
112
129
|
*
|
|
113
130
|
* - waitForNetworkIdle=false: Return as soon as the page fires load event. Used for sites that have persistent connections or polling that would prevent
|
|
114
131
|
* networkidle from ever completing.
|
|
@@ -149,8 +166,10 @@ export declare function findVideoContext(page: Page, profile: ResolvedSiteProfil
|
|
|
149
166
|
* or playback issues.
|
|
150
167
|
* @param context - The frame or page containing the video element.
|
|
151
168
|
* @param profile - The site profile with video selection preferences.
|
|
169
|
+
* @param signal - Optional abort signal; when aborted the wait is abandoned without emitting the timeout warning, so the caller can supersede it after accepting an
|
|
170
|
+
* embedded-player consent gate that triggers a reload.
|
|
152
171
|
*/
|
|
153
|
-
export declare function waitForVideoReady(context: Frame | Page, profile: ResolvedSiteProfile): Promise<void>;
|
|
172
|
+
export declare function waitForVideoReady(context: Frame | Page, profile: ResolvedSiteProfile, signal?: AbortSignal): Promise<void>;
|
|
154
173
|
/**
|
|
155
174
|
* Applies fullscreen styling to the video element using CSS to maximize the capture area. This CSS-based approach works for all sites regardless of their native
|
|
156
175
|
* fullscreen mechanism (keyboard shortcuts, JavaScript API, etc.).
|
|
@@ -174,7 +193,7 @@ export declare function applyVideoStyles(context: Frame | Page, selectorType: Vi
|
|
|
174
193
|
* This function uses Object.defineProperty to intercept property access, making it impossible for site JavaScript to change muted or volume values. The property
|
|
175
194
|
* descriptors are set to configurable: true so the browser can still access the underlying values for playback.
|
|
176
195
|
*
|
|
177
|
-
* The function is
|
|
196
|
+
* The function is safe to call more than once - a __volumeLocked flag on the video element prevents applying the lock multiple times.
|
|
178
197
|
* @param context - The frame or page containing the video element.
|
|
179
198
|
* @param selectorType - The video selector type for finding the element.
|
|
180
199
|
*/
|
|
@@ -182,6 +201,9 @@ export declare function lockVolumeProperties(context: Frame | Page, selectorType
|
|
|
182
201
|
/**
|
|
183
202
|
* Triggers fullscreen mode using the appropriate method for the site. Different sites have different fullscreen implementations:
|
|
184
203
|
*
|
|
204
|
+
* - Fullscreen button (fullscreenSelector): When configured, this is tried first by clicking the site's own fullscreen control, which uses the site's native
|
|
205
|
+
* mechanism and is the most reliable approach when the button is present.
|
|
206
|
+
*
|
|
185
207
|
* - Keyboard shortcuts (fullscreenKey): Many players use "f" as a keyboard shortcut for fullscreen. We send this keypress to activate the player's native
|
|
186
208
|
* fullscreen mode.
|
|
187
209
|
*
|
|
@@ -189,7 +211,7 @@ export declare function lockVolumeProperties(context: Frame | Page, selectorType
|
|
|
189
211
|
* prompts or be blocked by CSP, but works on many sites.
|
|
190
212
|
*
|
|
191
213
|
* Note that we also apply CSS-based fullscreen styling separately (in applyVideoStyles), which provides a reliable fallback when native fullscreen methods fail.
|
|
192
|
-
* @param page - The Puppeteer page object for keyboard input.
|
|
214
|
+
* @param page - The Puppeteer page object, used for keyboard input and for clicking the fullscreen button when fullscreenSelector is configured.
|
|
193
215
|
* @param context - The frame or page containing the video element.
|
|
194
216
|
* @param profile - The site profile indicating fullscreen method.
|
|
195
217
|
* @param selectorType - The video selector type for finding the element.
|
|
@@ -236,7 +258,7 @@ interface EnsurePlaybackOptions {
|
|
|
236
258
|
}
|
|
237
259
|
/**
|
|
238
260
|
* Ensures the video is playing with proper audio settings. This is the core playback function that handles both initial setup and recovery from stalls. It is
|
|
239
|
-
*
|
|
261
|
+
* safe to call more than once without adverse effects.
|
|
240
262
|
*
|
|
241
263
|
* Recovery escalation levels (higher levels include all lower-level actions):
|
|
242
264
|
*
|
|
@@ -261,6 +283,12 @@ interface EnsurePlaybackOptions {
|
|
|
261
283
|
* @param options - Optional recovery configuration. Omit for initial tune (full fullscreen behavior, level 1).
|
|
262
284
|
*/
|
|
263
285
|
export declare function ensurePlayback(page: Page, context: Frame | Page, profile: ResolvedSiteProfile, options?: EnsurePlaybackOptions): Promise<void>;
|
|
286
|
+
export interface VideoTuneDeps {
|
|
287
|
+
readonly classifyBlockedPage: typeof classifyBlockedPage;
|
|
288
|
+
readonly getProvidersForDomain: typeof getProvidersForDomain;
|
|
289
|
+
readonly selectChannel: typeof selectChannel;
|
|
290
|
+
readonly startOverlayHandling: typeof startOverlayHandling;
|
|
291
|
+
}
|
|
264
292
|
/**
|
|
265
293
|
* Optional behaviors for initializePlayback(). All fields are optional; an empty options object preserves the default tune flow.
|
|
266
294
|
*/
|
|
@@ -270,6 +298,12 @@ export interface InitializePlaybackOptions {
|
|
|
270
298
|
* store. The streaming setup layer constructs this closure with the channel key and service tag in scope.
|
|
271
299
|
*/
|
|
272
300
|
persistResolution?: (resolvedSelector: string) => Promise<void>;
|
|
301
|
+
/**
|
|
302
|
+
* The URL this tune navigated to. When present, a failed tune diagnoses the still-open blocked page: a confirmed sign-in wall or consent overlay replaces the
|
|
303
|
+
* generic failure with an actionable error, and an unrecognized page rethrows the original failure unchanged. When absent, every failure propagates exactly as
|
|
304
|
+
* it occurred with no classifier pass.
|
|
305
|
+
*/
|
|
306
|
+
requestedUrl?: string;
|
|
273
307
|
/**
|
|
274
308
|
* When true, skip the channel selection phase entirely. Used when navigating directly to a cached watch URL that already targets the correct channel - only
|
|
275
309
|
* video detection, playback, and fullscreen setup are needed.
|
|
@@ -282,21 +316,26 @@ export interface InitializePlaybackOptions {
|
|
|
282
316
|
* timeout, while channel selection and video setup run with their own internal time budgets (click retry loops, videoTimeout, etc.) without being killed by the
|
|
283
317
|
* navigation timeout.
|
|
284
318
|
*
|
|
285
|
-
*
|
|
286
|
-
*
|
|
319
|
+
* When channel selection fails because the guide surface itself never rendered, the function reloads the page and retries selection once. That failure class is
|
|
320
|
+
* transient - a rail whose lazy tiles never populated, an SPA shell that did not come up - and a reload is what cures it. A failure on a guide that did render,
|
|
321
|
+
* such as a channel name that is simply not in the lineup, gets no retry: reading the same rendered guide again would fail the same way, more slowly.
|
|
287
322
|
*
|
|
288
323
|
* @param page - The Puppeteer page object.
|
|
289
324
|
* @param profile - The site profile containing all behavior flags.
|
|
290
325
|
* @param options - Optional behaviors. See InitializePlaybackOptions.
|
|
326
|
+
* @param deps - Injected tune collaborators for testing; defaults to defaultVideoTuneDeps in production.
|
|
291
327
|
* @returns The video context (frame or page) for subsequent monitoring, and a directTune flag when the channel was tuned via API interception.
|
|
292
328
|
*/
|
|
293
|
-
export declare function initializePlayback(page: Page, profile: ResolvedSiteProfile, options?: InitializePlaybackOptions): Promise<TuneResult>;
|
|
329
|
+
export declare function initializePlayback(page: Page, profile: ResolvedSiteProfile, options?: InitializePlaybackOptions, deps?: VideoTuneDeps): Promise<TuneResult>;
|
|
294
330
|
/**
|
|
295
|
-
* Tunes to a channel by navigating to the URL and initializing video playback. This is the
|
|
296
|
-
*
|
|
331
|
+
* Tunes to a channel by navigating to the URL and initializing video playback. This is the recovery path's tune: the playback monitor calls it to bring a stream
|
|
332
|
+
* back by navigating the page again. Initial stream setup and native re-establishment reach the same phases through establishChannelPlayback in streaming/setup.ts,
|
|
333
|
+
* which composes navigation and playback initialization with the per-path policy each of those callers carries. Both routes land in initializePlayback, so the
|
|
334
|
+
* channel selection, video detection, and playback steps a recovered stream runs are the steps a fresh one ran.
|
|
297
335
|
*
|
|
298
336
|
* The tuning process:
|
|
299
|
-
* 0. Check cache: If a direct watch URL is cached, navigate to it and skip channel selection. On failure,
|
|
337
|
+
* 0. Check cache: If a direct watch URL is cached, navigate to it and skip channel selection. On failure, fall through, and let the cache coordinator classify
|
|
338
|
+
* the cause to decide whether the entry survives.
|
|
300
339
|
* 1. Navigate: Load the target URL using site-appropriate wait conditions
|
|
301
340
|
* 2. Select channel: For multi-channel players, click the desired channel in the UI
|
|
302
341
|
* 3. Find video: Locate the video element (which may be in an iframe)
|
|
@@ -310,7 +349,8 @@ export declare function initializePlayback(page: Page, profile: ResolvedSiteProf
|
|
|
310
349
|
* @param page - The Puppeteer page object.
|
|
311
350
|
* @param url - The URL to navigate to.
|
|
312
351
|
* @param profile - The site profile containing all behavior flags.
|
|
313
|
-
* @returns The video context (frame or page) for subsequent monitoring.
|
|
352
|
+
* @returns The video context (frame or page) for subsequent monitoring, and a directTune flag when the channel was tuned via API interception.
|
|
314
353
|
*/
|
|
315
354
|
export declare function tuneToChannel(page: Page, url: string, profile: ResolvedSiteProfile): Promise<TuneResult>;
|
|
316
355
|
export {};
|
|
356
|
+
//# sourceMappingURL=video.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../../src/browser/video.ts"],"names":[],"mappings":"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"}
|