FastChannels - FAST Channels aggregator/manager

I’ll screenshot it tomorrow so you can believe me. Have I ever lied to you?

What I really wanna know is do you use that notes feature you made me add? :joy:

brave_screenshot (1)

I like the idea of including stuff just-in-case it might be useful. Even if I don't need to watch anything on CSPAN3 now, or have it available via TVE, it's nice to have options.

Why does Pluto skip around so much? I'll be watching a show, it goes to commercial and when it comes back it goes back to the scene I just watched. I haven't noticed it ever skipping ahead, just behind. It did this when I used Pluto-for-Channels and initially I thought it was something wonky with it. I don't recall it happening when I first started using FastChannels, but it's happening again. I haven't noticed it using the native Pluto app, but it's very rare that I use it. I don't think it's a problem with either Pluto-for-Channels or FastChannels, just curious why it happens. It only seems to happen when it goes to commercial (which is usually a "we'll be right back" message).

I've randomly seen this too.. Have you noticed it on one-particular channels vs another? They stich together video files to create a stream sometimes. Wonder if it's a bug on the way FC and other containers grab time stamps.

I'll dig in, but any info anyone can provide would be helpful.

It seems to happen fairly regularly on Star Trek: The Original Series. That's what I usually have on in the background when I'm working from home.

Edit: Didn't know if you wanted the logs or not, but I thought I'd include them. Happened twice this morning that I recall, but I don't remember what time it happened.

2026-08-04 07:14:01,524 INFO     app.routes.play: [play] request_id=7d2e35ab3155c0bf ip=172.18.0.1 source=pluto channel_id=5efbd39f8c4ce900075d7698 channel_name=Star Trek
2026-08-04 07:59:37,742 INFO     __main__: [scheduler] enqueued _rq_prune job
2026-08-04 07:59:37,747 INFO     __main__: [scheduler] enqueued _rq_integrity_cleanup job
2026-08-04 07:59:37,789 INFO     __main__: [logo_cache] stats β€” logos: 3962 files / 28.3MB  |  posters: 0 files / 0.0MB  |  total: 28.3MB
2026-08-04 07:59:37,838 INFO     app.gracenote_map: [gracenote-map] remote map refreshed β€” 1549 rows from https://gist.githubusercontent.com/kineticman/87765d469610233f894c9c225cb4f2ca/raw/gistfile1.txt
2026-08-04 07:59:37,934 INFO     app.worker: [worker] pruned 594 expired EPG entries
2026-08-04 07:59:41,763 INFO     __main__: [dvr-epg] pushed guide refresh for 2 lineup(s): XMLTV-FastChannelsMULTISTREAM, XMLTV-FastChannelsPLEXTO
2026-08-04 08:32:37,738 INFO     __main__: [scheduler] Enqueued plex (interval=180m, age=181m)
2026-08-04 08:32:38,082 INFO     app.worker: [plex] Scrape job started
2026-08-04 08:32:40,011 INFO     app.scrapers.plex: [plex] genre map: 429 categorised, 429 with tags, 90 Spanish
2026-08-04 08:32:40,036 INFO     app.scrapers.plex: [plex] 684 channels fetched in 2.0s
2026-08-04 08:32:40,226 INFO     app.scrapers.plex: [plex] targeted guide fetch starting: channels=5 days=5 workers=6
2026-08-04 08:32:40,857 INFO     app.scrapers.plex: [plex] targeted guide fetch complete: channels=5 days=5 programs=593 ok=25 timeouts=0 errors=0 latency avg=0.13s p95=0.14s max=0.14s in 0.6s
2026-08-04 08:32:41,820 INFO     app.scrapers.plex: [plex] live-tv RSC fetched in 0.4s (4124805 bytes)
2026-08-04 08:32:41,824 INFO     app.scrapers.plex: [plex] luma gap-fill: 1 channels have schedule gaps
2026-08-04 08:32:41,978 INFO     app.scrapers.plex: [plex] luma gap-fill total: +2 programs
2026-08-04 08:32:41,979 INFO     app.scrapers.plex: [plex] 595 total EPG entries after luma gap-fill
2026-08-04 08:32:42,047 INFO     app.worker: [xml-cache] enqueued refresh job
2026-08-04 08:32:42,048 INFO     app.worker: [plex] Scrape complete β€” 684 channels, 595 programs (4.0s)
2026-08-04 08:32:42,058 INFO     app.routes.images: [images] pre-warm starting: 684 URLs β€” 684 already fresh, 0 to fetch (4 workers)
2026-08-04 08:32:42,058 INFO     app.routes.images: [images] pre-warm done: 0 cached, 684 already fresh, 0 failed (of 684 total)
2026-08-04 08:41:37,740 INFO     __main__: [scheduler] Enqueued frndlytv (interval=360m, age=361m)
2026-08-04 08:41:38,083 INFO     app.worker: [frndlytv] Scrape job started
2026-08-04 08:41:38,282 INFO     app.scrapers.frndlytv: [frndlytv] logged in successfully
2026-08-04 08:41:38,323 INFO     app.scrapers.frndlytv: [frndlytv] 61 channels
2026-08-04 08:41:39,770 INFO     app.scrapers.frndlytv: [frndlytv] 5347 EPG entries, 124 unique content IDs to enrich (no-gracenote channels)
2026-08-04 08:41:39,778 INFO     app.scrapers.frndlytv: [frndlytv] content cache: 112 hits, 12 misses to fetch
2026-08-04 08:41:44,213 INFO     app.scrapers.frndlytv: [frndlytv] enriched 12/12 new content IDs
2026-08-04 08:42:03,081 INFO     app.scrapers.frndlytv: [frndlytv] rich guide applied 1810 programs: 1612 posters, 1150 episode titles
2026-08-04 08:42:03,309 INFO     app.worker: [xml-cache] enqueued refresh job
2026-08-04 08:42:03,309 INFO     app.worker: [frndlytv] Scrape complete β€” 61 channels, 5347 programs (25.2s)
2026-08-04 08:42:03,311 INFO     app.routes.images: [images] pre-warm starting: 61 URLs β€” 61 already fresh, 0 to fetch (4 workers)
2026-08-04 08:42:03,312 INFO     app.routes.images: [images] pre-warm done: 0 cached, 61 already fresh, 0 failed (of 61 total)
2026-08-04 08:50:35,797 INFO     app.routes.tasks: Enqueued XML artifact refresh
2026-08-04 08:51:32,885 INFO     app.routes.tasks: Enqueued XML artifact refresh
2026-08-04 08:52:18,316 INFO     app.routes.tasks: Enqueued XML artifact refresh
2026-08-04 08:52:18,363 INFO     app.routes.tasks: XML artifact refresh already queued/running
2026-08-04 08:52:55,556 INFO     app.routes.tasks: Enqueued XML artifact refresh

I have noticed this on the official Pluto tv app. You can leave a channel and then come back then it replays where you left off sometimes. So this seems to be something Pluto tv does around ad breaks.

This really isn't my bug - it's on Pluto end.

To be clear how Pluto works inside FastChannels - FC (and other containers likely) just scrapes the Pluto API and gets a list of channels and the HLS link. FC stores that data and when you hit play, CDVR hits FC and FC returns the HLS link with a 302 redirect - then it's 100% out of FC hands.

It appears that Pluto has a bug in there ad-stiching where after a commercial break, they return a bad timestamp of where the stream was at prior to the commerical break. That's why you are seeing it show a prior part of the program you were watching.

I bet you'll see the same bug on their own app. I'm not sure of a workaround either as we can't specifically request a certain clipID with a certain time stamp.

1 Like

https://www.c-span.org/schedule/ ..

so the "LIVE" banner is what's playing on CSPAN Live Event right now (and Senate floor/House floor also have live streams right now).

I do agree it's confusing. Maybe I just rename CSPAN3 to "OVERFLOW"? Trying to think of a way to be most user friendly.

I didn't think it had anything to do with FastChannels. I was just trying to figure out why it happens. And Flamez confirms it even happens with their app. Free is free, so I'm not really complaining (ok, maybe just a little bit) :upside_down_face:

1 Like

It is disappointing for sure- Pluto is my favorite FAST source. Hope they fix it.

1 Like

At least the channel I watch from there is on other sources so the loss isn't that great

Pluto been shipping back like 10 min has been a normal thing for years (just search the forums). Some channels do it more than others. So not at all. Comes and goes.

What is newer, is 403 forbidden disconnects though i have been having with both Pluto and Plex.
Can be days between having issues...or hours. Its random.

I was talking about C-SPAN 3, not your C-SPAN Live Event channel.

It's C-SPAN channel 3 (out of 3 channels there) and you are scraping the schedule for it
https://www.c-span.org/schedule/?channel=3
but you have to authenticate with TVE to play it, FastChannels won't play it.
https://www.c-span.org/networks/?channel=c-span-3

My question is why even list C-SPAN 3 in FastChannels if it doesn't play it. It led me to think it would.

I figured out how to use your scraped epg and combine it with the TVE channel C-SPAN3 in CDVR, so playing or recording the channel uses CDVR TVE.

Just added custom channel 6010 pointing to my TVE channel

http://192.168.1.4:8090/devices/TVE-YouTubeTV/channels/6009/stream.mpg?format=ts&codec=copy

and your epg

http://nas-1019:5523/feeds/c-span-enabled/epg.xml

Pluto has a lot of great programming and unfortunately is not a quality source. I've seen what you describe a number of times. The other day there clock was off by a few minutes and I missed the end of a movie. Well I've set my default pass to record longer yet I should not have to.

How do I go back to using the old Pluto Series IDs and Channel Numbers?

For example, I have a Midsomer Murders pass using SeriesID == pluto/5c7dcd8fc67ea351edc3a5c1, but now it uses SeriesID == Midsomer Murders. So it's not recognizing the episodes I have recorded. If I create a new pass, it wants to start recording all episodes over again. Thank you.

I am also having the logo problems. I read through the instructions for setting up subnets in Tailscale on Windows. For someone like myself that is not well-versed in networking and command lines it is incredibly complicated. Is there no more simple solution for those of us that aren’t network savvy? I am using Tailscale for my remote streaming CHDVR set up and the only reason I was able to do that was Google AI.

hey .. I cleaned up the XML output to be more compliant with XML standards. I wasn't aware that it'd affect recordings. I will restore that tag in next version.

1 Like

Awesome! Thank you so much. I appreciate you.

I recommend for anything you want to record from FAST stations that are using XML guide data (as opposed to Gracenote data that has real IDs) to not use the SeriesID, but modify the pass to just search for the Title contains:

This method is way more reliable and you don't have to worry about Pluto one day just randomly changing that 5c7dcd8fc67ea351edc3a5c1 string to something else. From experience, this happens! Here's a post that goes into a lot more detail around this:

Further, I generally put in SeasonNumber != 0 and EpisodeNumber !=0. That should get rid of stray episodes without the right metadata.