Introducing PrismCast: Browser-based Live TV Capture for Channels DVR and Plex

For people looking to use PrismCast with the multiple pre-defined websites, and provider credentials, I believe you're on the right track.

However, for those of us using streaming websites like Sling, YouTubeTV and even Weatherscan, a slightly different setup is needed.

Let's take my use case as an example:

I have a subscription to a set of Sling Premium channels that I'd like to use with PrismCast. Also, I'd like to be able to view Weatherscan. I'm not particularly interested in any of the pre-defined PrismCast channels -- as I have those well covered through other sources.

So, I converted a cc4c M3U file I've been using into a JSON to import into PrismCast, and M3U text to paste into a Custom CDVR Source.

The source cc4c M3U looks like this:

#EXTM3U

#EXTINF:-1 channel-id="WTHRSCN" tvc-guide-stationid="21586",Weatherscan
chrome://cc4c2:5589/stream?url=https://v2.weatherscan.net

#EXTINF:-1 channel-id="STZHD" tvc-guide-stationid="34941",Starz HD
chrome://cc4c2:5589/stream?url=https://watch.sling.com/1/channel/1a3c345b84b149918e0bad8f797df70a/watch

#EXTINF:-1 channel-id="STZHDP" tvc-guide-stationid="34949",Starz HD West
chrome://cc4c2:5589/stream?url=https://watch.sling.com/1/channel/8a84458592844ff5849712ef7766fb4e/watch

#EXTINF:-1 channel-id="STZKHD" tvc-guide-stationid="57581",Starz Kids & Family HD
chrome://cc4c2:5589/stream?url=https://watch.sling.com/1/channel/148a1e391db94edf96bf25e25beb307d/watch

#EXTINF:-1 channel-id="STZCHD" tvc-guide-stationid="57569",Starz Comedy HD
chrome://cc4c2:5589/stream?url=https://watch.sling.com/1/channel/d96b102ac5c54967bf56b8b57e20c84e/watch

#EXTINF:-1 channel-id="STZEHD" tvc-guide-stationid="57573",Starz Edge HD
chrome://cc4c2:5589/stream?url=https://watch.sling.com/1/channel/1535e572f07348159d8924d58200690e/watch

#EXTINF:-1 channel-id="STRZIBH" tvc-guide-stationid="67235",Starz in Black HD
chrome://cc4c2:5589/stream?url=https://watch.sling.com/1/channel/23a6ea3c163a47f390f73900ccc76bc1/watch

#EXTINF:-1 channel-id="STRZCIH" tvc-guide-stationid="67236",Starz Cinema HD
chrome://cc4c2:5589/stream?url=https://watch.sling.com/1/channel/0eedb59656d243da914fef990a8db903/watch

#EXTINF:-1 channel-id="STZENHD" tvc-guide-stationid="36225",Starz Encore HD
chrome://cc4c2:5589/stream?url=https://watch.sling.com/1/channel/ed5d0f85928f45249f8a67c9746a80b7/watch

#EXTINF:-1 channel-id="STZENCP" tvc-guide-stationid="17125",Starz Encore West
chrome://cc4c2:5589/stream?url=https://watch.sling.com/1/channel/a0515fde0c074dc389981e8881874aae/watch

#EXTINF:-1 channel-id="STZENCL" tvc-guide-stationid="14764",Starz Encore Classic
chrome://cc4c2:5589/stream?url=https://watch.sling.com/1/channel/2230d31d16d541c08e654d4a11863d2c/watch

#EXTINF:-1 channel-id="STZEWSS" tvc-guide-stationid="102906",Starz Encore Westerns
chrome://cc4c2:5589/stream?url=https://watch.sling.com/1/channel/73ab11e5664241a9811e7e22602bfda9/watch

#EXTINF:-1 channel-id="STZENSU" tvc-guide-stationid="14766",Starz Encore Suspense
chrome://cc4c2:5589/stream?url=https://watch.sling.com/1/channel/04e4a4f1e0ec4dfba961414197e57d7f/watch

#EXTINF:-1 channel-id="STZENBK" tvc-guide-stationid="14870",Starz Encore Black
chrome://cc4c2:5589/stream?url=https://watch.sling.com/1/channel/1ec67d324b564a528f6901ed8e09334e/watch

#EXTINF:-1 channel-id="SZEAHD" tvc-guide-stationid="72015",Starz Encore Action HD
chrome://cc4c2:5589/stream?url=https://watch.sling.com/1/channel/8aed8223a6104b53b24f03555fc933a9/watch

#EXTINF:-1 channel-id="STZENFS" tvc-guide-stationid="102903",Starz Encore Family
chrome://cc4c2:5589/stream?url=https://watch.sling.com/1/channel/22076462a8124832967e30e0f9f92213/watch

#EXTINF:-1 channel-id="INDIEHD" tvc-guide-stationid="65795",IndiePlex HD
chrome://cc4c2:5589/stream?url=https://watch.sling.com/1/channel/7a17fd0c15754658885b368a0b273565/watch

#EXTINF:-1 channel-id="RETROHD" tvc-guide-stationid="65791",RetroPlex HD
chrome://cc4c2:5589/stream?url=https://watch.sling.com/1/channel/9ad3916eb22d4c169c7713afa5ee0f2b/watch

#EXTINF:-1 channel-id="MPLEXHD" tvc-guide-stationid="83075",MoviePlex HD
chrome://cc4c2:5589/stream?url=https://watch.sling.com/1/channel/deba2421b6ff44478320b2c60051f1d7/watch

I've added an Action in OliveTin-for-Channels to POST a JSON to PrismCast that looks like this, based on the above M3U as an input:

{
  "indiehd": {
    "name": "IndiePlex HD",
    "url": "https://watch.sling.com/1/channel/7a17fd0c15754658885b368a0b273565/watch",
    "stationId": "65795"
  },
  "mplexhd": {
    "name": "MoviePlex HD",
    "url": "https://watch.sling.com/1/channel/deba2421b6ff44478320b2c60051f1d7/watch",
    "stationId": "83075"
  },
  "retrohd": {
    "name": "RetroPlex HD",
    "url": "https://watch.sling.com/1/channel/9ad3916eb22d4c169c7713afa5ee0f2b/watch",
    "stationId": "65791"
  },
  "strzcih": {
    "name": "Starz Cinema HD",
    "url": "https://watch.sling.com/1/channel/0eedb59656d243da914fef990a8db903/watch",
    "stationId": "67236"
  },
  "strzibh": {
    "name": "Starz in Black HD",
    "url": "https://watch.sling.com/1/channel/23a6ea3c163a47f390f73900ccc76bc1/watch",
    "stationId": "67235"
  },
  "stzchd": {
    "name": "Starz Comedy HD",
    "url": "https://watch.sling.com/1/channel/d96b102ac5c54967bf56b8b57e20c84e/watch",
    "stationId": "57569"
  },
  "stzehd": {
    "name": "Starz Edge HD",
    "url": "https://watch.sling.com/1/channel/1535e572f07348159d8924d58200690e/watch",
    "stationId": "57573"
  },
  "stzenbk": {
    "name": "Starz Encore Black",
    "url": "https://watch.sling.com/1/channel/1ec67d324b564a528f6901ed8e09334e/watch",
    "stationId": "14870"
  },
  "stzencl": {
    "name": "Starz Encore Classic",
    "url": "https://watch.sling.com/1/channel/2230d31d16d541c08e654d4a11863d2c/watch",
    "stationId": "14764"
  },
  "stzencp": {
    "name": "Starz Encore West",
    "url": "https://watch.sling.com/1/channel/a0515fde0c074dc389981e8881874aae/watch",
    "stationId": "17125"
  },
  "stzenfs": {
    "name": "Starz Encore Family",
    "url": "https://watch.sling.com/1/channel/22076462a8124832967e30e0f9f92213/watch",
    "stationId": "102903"
  },
  "stzenhd": {
    "name": "Starz Encore HD",
    "url": "https://watch.sling.com/1/channel/ed5d0f85928f45249f8a67c9746a80b7/watch",
    "stationId": "36225"
  },
  "stzensu": {
    "name": "Starz Encore Suspense",
    "url": "https://watch.sling.com/1/channel/04e4a4f1e0ec4dfba961414197e57d7f/watch",
    "stationId": "14766"
  },
  "stzewss": {
    "name": "Starz Encore Westerns",
    "url": "https://watch.sling.com/1/channel/73ab11e5664241a9811e7e22602bfda9/watch",
    "stationId": "102906"
  },
  "stzhd": {
    "name": "Starz HD",
    "url": "https://watch.sling.com/1/channel/1a3c345b84b149918e0bad8f797df70a/watch",
    "stationId": "34941"
  },
  "stzhdp": {
    "name": "Starz HD West",
    "url": "https://watch.sling.com/1/channel/8a84458592844ff5849712ef7766fb4e/watch",
    "stationId": "34949"
  },
  "stzkhd": {
    "name": "Starz Kids & Family HD",
    "url": "https://watch.sling.com/1/channel/148a1e391db94edf96bf25e25beb307d/watch",
    "stationId": "57581"
  },
  "szeahd": {
    "name": "Starz Encore Action HD",
    "url": "https://watch.sling.com/1/channel/8aed8223a6104b53b24f03555fc933a9/watch",
    "stationId": "72015"
  },
  "wthrscn": {
    "name": "Weatherscan",
    "url": "https://v2.weatherscan.net",
    "stationId": "21586"
  }
}

This Action also outputs a text-based M3U that looks like this, which can then be pasted into the CDVR Custom Source in place of the standard PrismCast "playlist" URL:

#EXTM3U

#EXTINF:-1 channel-id="INDIEHD" tvc-guide-stationid="65795",IndiePlex HD
http://convertible-pc3:5589/hls/indiehd/stream.m3u8

#EXTINF:-1 channel-id="MPLEXHD" tvc-guide-stationid="83075",MoviePlex HD
http://convertible-pc3:5589/hls/mplexhd/stream.m3u8

#EXTINF:-1 channel-id="RETROHD" tvc-guide-stationid="65791",RetroPlex HD
http://convertible-pc3:5589/hls/retrohd/stream.m3u8

#EXTINF:-1 channel-id="STRZCIH" tvc-guide-stationid="67236",Starz Cinema HD
http://convertible-pc3:5589/hls/strzcih/stream.m3u8

#EXTINF:-1 channel-id="STRZIBH" tvc-guide-stationid="67235",Starz in Black HD
http://convertible-pc3:5589/hls/strzibh/stream.m3u8

#EXTINF:-1 channel-id="STZCHD" tvc-guide-stationid="57569",Starz Comedy HD
http://convertible-pc3:5589/hls/stzchd/stream.m3u8

#EXTINF:-1 channel-id="STZEHD" tvc-guide-stationid="57573",Starz Edge HD
http://convertible-pc3:5589/hls/stzehd/stream.m3u8

#EXTINF:-1 channel-id="STZENBK" tvc-guide-stationid="14870",Starz Encore Black
http://convertible-pc3:5589/hls/stzenbk/stream.m3u8

#EXTINF:-1 channel-id="STZENCL" tvc-guide-stationid="14764",Starz Encore Classic
http://convertible-pc3:5589/hls/stzencl/stream.m3u8

#EXTINF:-1 channel-id="STZENCP" tvc-guide-stationid="17125",Starz Encore West
http://convertible-pc3:5589/hls/stzencp/stream.m3u8

#EXTINF:-1 channel-id="STZENFS" tvc-guide-stationid="102903",Starz Encore Family
http://convertible-pc3:5589/hls/stzenfs/stream.m3u8

#EXTINF:-1 channel-id="STZENHD" tvc-guide-stationid="36225",Starz Encore HD
http://convertible-pc3:5589/hls/stzenhd/stream.m3u8

#EXTINF:-1 channel-id="STZENSU" tvc-guide-stationid="14766",Starz Encore Suspense
http://convertible-pc3:5589/hls/stzensu/stream.m3u8

#EXTINF:-1 channel-id="STZEWSS" tvc-guide-stationid="102906",Starz Encore Westerns
http://convertible-pc3:5589/hls/stzewss/stream.m3u8

#EXTINF:-1 channel-id="STZHD" tvc-guide-stationid="34941",Starz HD
http://convertible-pc3:5589/hls/stzhd/stream.m3u8

#EXTINF:-1 channel-id="STZHDP" tvc-guide-stationid="34949",Starz HD West
http://convertible-pc3:5589/hls/stzhdp/stream.m3u8

#EXTINF:-1 channel-id="STZKHD" tvc-guide-stationid="57581",Starz Kids & Family HD
http://convertible-pc3:5589/hls/stzkhd/stream.m3u8

#EXTINF:-1 channel-id="SZEAHD" tvc-guide-stationid="72015",Starz Encore Action HD
http://convertible-pc3:5589/hls/szeahd/stream.m3u8

#EXTINF:-1 channel-id="WTHRSCN" tvc-guide-stationid="21586",Weatherscan
http://convertible-pc3:5589/hls/wthrscn/stream.m3u8

This works well, although there are some things to know, and settings changes needed for Sling that could be relevant to similar setups others might be trying.

First, as far as login goes, using VNC or noVNC (before even attempting to tune) and navigating to the provider's website independently is the way to go.

Also, for a provider like Sling several settings are too aggressive. Here are the adjustmens that worked for me (non-default shown in blue -- as you know):

Playback settings:

Streaming settings:

The stack needs to be stopped and restarted to apply those changes. With the above setup, the experience is similar to cc4c/ch4c, while benefitting from the reduced CPU requirements of this project.

One thing that may need a code fix though is Weatherscan. When I attempt to tune to it, PrismCast keeps resetting the connection. PrismCast is recognizing that it's a "static" page, but keeps looking for video elements -- so the page is reset again and again.

Logs for Weatherscan tune:

[2026/01/29 14:42:22.829] [wthrscn-e1npe8] Streaming Weatherscan (staticPage, FFmpeg).
[2026/01/29 14:42:24.837] [WARN] [wthrscn-e1npe8] Video element not found (attempt 1/3). Context: main page, frames: 1, videoCount: 0.
[2026/01/29 14:42:26.830] [WARN] [wthrscn-e1npe8] Video element not found (attempt 2/3). Context: main page, frames: 1, videoCount: 0.
[2026/01/29 14:42:26.831] [wthrscn-e1npe8] Re-searching frames for video element.
[2026/01/29 14:42:26.832] [WARN] [wthrscn-e1npe8] Re-search did not find video in any frame.
[2026/01/29 14:42:28.830] [WARN] [wthrscn-e1npe8] Video element not found (attempt 3/3). Context: main page, frames: 1, videoCount: 0.
[2026/01/29 14:42:28.830] [WARN] [wthrscn-e1npe8] Video element not found. Attempting page navigation...
[2026/01/29 14:42:49.375] [WARN] [wthrscn-e1npe8] Failed to reinitialize video after page navigation: Waiting for selector `video` failed.
[2026/01/29 14:42:49.375] [WARN] [wthrscn-e1npe8] Page navigation unsuccessful.
[2026/01/29 14:42:50.831] [WARN] [wthrscn-e1npe8] Video element not found (attempt 4/3). Context: main page, frames: 1, videoCount: 0.
[2026/01/29 14:42:50.831] [WARN] [wthrscn-e1npe8] Video element not found. Attempting page navigation...
[2026/01/29 14:43:11.585] [WARN] [wthrscn-e1npe8] Failed to reinitialize video after page navigation: Waiting for selector `video` failed.
[2026/01/29 14:43:11.586] [WARN] [wthrscn-e1npe8] Page navigation unsuccessful.
[2026/01/29 14:43:12.831] [WARN] [wthrscn-e1npe8] Video element not found (attempt 5/3). Context: main page, frames: 1, videoCount: 0.
[2026/01/29 14:43:12.831] [WARN] [wthrscn-e1npe8] Video element not found. Attempting page navigation...
[2026/01/29 14:43:33.579] [WARN] [wthrscn-e1npe8] Failed to reinitialize video after page navigation: Waiting for selector `video` failed.
[2026/01/29 14:43:33.579] [WARN] [wthrscn-e1npe8] Page navigation unsuccessful.
[2026/01/29 14:43:34.834] [WARN] [wthrscn-e1npe8] Video element not found (attempt 6/3). Context: main page, frames: 1, videoCount: 0.
[2026/01/29 14:43:34.834] [WARN] [wthrscn-e1npe8] Video element not found. Attempting page navigation...
[2026/01/29 14:43:34.834] [ERROR] [wthrscn-e1npe8] Exceeded maximum page navigations (3 in 15 minutes). Cannot recover without video element.
[2026/01/29 14:43:34.835] [wthrscn-e1npe8] Stream ended after 1m 13s (too many errors). Recoveries: 4 attempted, 0 succeeded.
1 Like

@hjd PR submitted for initial Docker and LXC container support. More to come!

1 Like

So I've got this running on Windows 11, I can get to the config web page and log into the channels that I want no problem. But none of the channels will launch.

Here's the error that I get:

[2026/01/29 16:29:05.290] [ERROR] [nbc-bqk3q7] Stream setup failed for https://www.nbc.com/live?brand=nbc&callsign=nbc: Stream initialization timed out.

It says Chrome ready when it starts up in the logs and I can see it launching Chrome with a video-capture extension tab but nothing happens. I'm running the latest Chrome version, checked for updates and downloaded it before trying this. Also tried uninstalling/reinstalling Chrome (with browsing data deletion).

EDIT: just wanted to add that I can RDP into my server and go to abc.com, usanetwork.com etc. and play live streams from Chrome with no issue. It is headless but I have a dummy HDMI plug to make it think it has a display. I used to run cc4c long ago but gave up when Chrome updates kept messing things up.

I have this running on Windows 11 and it seems to be doing just fine with USA Network Channels. I was wondering though, is there a way I can have this run headless. Like, is it possible to have this service run completely hidden and no chrome window pop up on my desktop as well. I've figured out how to get the command prompt and chrome window to automatically minimize after they startup, but it would be nice if there was a way these could run entirely hidden.

You'll never avoid the chrome window popping up, it's always going to happen. But it's really strange that your setup works and mine doesn't, I don't know what's going on here.

So I got it working on a headless server, had to disable GPU accel.

Went into C:\Users\David\AppData\Roaming\npm\node_modules\prismcast\dist\browser, edited index.js, added these flags to chrome startup args:

"--disable-gpu",
"--disable-software-rasterizer"

This does not seem to radically increase CPU usage but it's the only way I can get it to work.

Also changed the invalid pkill command to "taskkill /F /IM chrome.exe"

But I have a remaining problem, which is that prismcast does not shutdown the running chrome tab that's streaming the video when I exit out of the channel in Channels. It's still streaming (minimized) and I can't find the code that's supposed to shut it down. ffmpeg goes away but the tab doesn't.

2 Likes

If you're not able to utilize the GPU, and the performance difference is modest anyway, wouldn't it make more sense to use the Docker version I created?

I've been playing around with both myself -- installing it directly and using the Docker version. It's working fine for me either way, with Docker version being the easier to install and maintain from a user perspective.

Does it have to be Google Chrome or can I use Brave?

Chrome only.

2 Likes

There's actually code that looks for Brave as a fallback but I don't know if it works. Saw that when I was troubleshooting.

Oh and I was wrong about having to disable the GPU, I had forgotten that I had my server connected to an HDMI port on my TV that wasn't active. Once I put my dummy HDMI plug in it works fine with GPU acceleration.

I installed node via homebrew, downloaded chrome and have a mac mini m4 pro. I am getting this,

{
  "message": "failed to deploy a stack: compose up operation failed: Error response from daemon: driver failed programming external connectivity on endpoint prismcast (4b2e2196bc7cc7def260c2d27ae2acb0511129f23cfd27c750d929fb1d273878): Bind for 0.0.0.0:6080 failed: port is already allocated",
  "details": "Failed to deploy a stack: compose up operation failed: Error response from daemon: driver failed programming external connectivity on endpoint prismcast (4b2e2196bc7cc7def260c2d27ae2acb0511129f23cfd27c750d929fb1d273878): Bind for 0.0.0.0:6080 failed: port is already allocated"
}
false
OliveTin::timeout - this action timed out after 60 seconds. If you need me for this action, set a longer timeout. See https://docs.olivetin.app/titml for more help.

As the error message says, you're already using port 6080 for another project. More importantly though, the container version is amd64 only.

On a Mac Mini M4 (arm64), you should be installing this project directly, not using Docker.

Okay so I do see it cleaning up a stale tab after 35 40 seconds, so I guess that's not really an issue.

But there is an issue with the startup time, I'm seeing occasions where the channels front end will time out because it's not getting video fast enough from the browser via FFmpeg. I don't know if that can be speeded up anyway but it really needs to because it's not reliable at this point. And I'm running a fast server.

I agree, that's an area that could use some work. PrismCast appears to wait until it's satisfied with the stream before passing it to Channels.

Have you tried adjusting any of the PrismCast settings? You might try the ones I posted earlier in the thread. If you can get PrismCast to stop resetting the stream, you might find CDVR will stop timing out.

I got it to work thank you!!!!!!

1 Like

I put in your suggested playback and streaming setting changes but if anything it might have made it worse.

It's just not ready for primetime now because it's waiting way too long to feed video to channels. I can see the video running in the browser but it's some number of seconds before channels gets it.

Once that gets sorted I'll be happy to put it in my list of sources, it's great work and I love the configurability of it.

Those settings were good for Sling, what's right for you could easily be different.

As you probably read, the developer is only supporting this on MacOS ATM. I've been mostly working on issues related to Docker, but did submit one PR for Windows.

Hopefully, there will be more contributions as we figure out what's needed to make it cross-platform.

Just curious, how is it figuring out which channel to play at USA Network? They all seem to work but the URL is simply USANetwork.com/live so it must be doing some keyboard manipulation or scrolling to get to the right channel. I don't see any config for that but maybe I missed it.

Also, I'm curious as to why Fox is missing from the channel lineup. You have FS1 and 2 and you can watch your local Fox channel from fox.com when you authenticate, at least in my area you can. Maybe it's only for the Fox owned and operated channels?

But my question above would also apply to this website I think.

I think your answer is in this earlier post:

Thanks! I buzzed right by that explanation.

One other thing and I may have missed this too, it doesn't look like there's any way to edit the config for the existing 67 channels. This will be problematic when websites inevitably change URLs etc.

I also wish that we could delete a bunch of channels from that list and just have it feed what we want to channels. I know there's a workaround for that but it really should be in the base code. Or just keep the default list and allow us to disable all the unnecessary channels.