FastChannels - FAST Channels aggregator/manager

I figure if it can be integrated to Plex with a corrected/converted stream it can be integrated to Channels & Emby thru FastChannels. One example:
https://www.reddit.com/r/slingbox/comments/xhy710/plex_live_tv_integration_with_slingbox/ [preview removed]

needing this instead of an HDMI encoder (which may have DRM issues): GitHub - GerryDazoo/Slinger: Reuse SlingBox hardware without SlingBox Servers · GitHub

However if you hadn't gotten your admin password from that old device using the Sling org's Username+Password authentication before it was shutdown...
Slinger/sb-pwd.md at main · GerryDazoo/Slinger · GitHub [preview removed]

...I'm not sure if you can use Slinger. Tho consider me a neophite with all this stuff; maybe it can be attained another way if you don't have it already. Then I assume a component video encoder is needed, which I do have.

Thanx for that. I haven't tackled the DRM/ah4c variables yet. But will. My media server is an i7-12700k machine with 128 GB of RAM so I'll look into PrismCast then too. [ -- w/ 224 TB total of a mix of Seagate IronWolf HDDs and about 3 dozen gigs of it SSD/NVMe as those IronWolf dives really make a crunching sound when recording small packets of streaming video, so have to record to an SSD array to keep this media server silent... tho none of that any bearing here, just flexing a little, haha -- ]

Much thanx for the continued engagement.

A good list. I'll check them all. Thanks!

I discovered everything I needed to about all the others, except FDL. Is there a longer name for it? What is that short for? Thanx

1 Like

Fruit Deeplinks

FastChannels 5.7.0 "The babsonnexus Edition": What's New

@babsonnexus asked for more sources, so this release has more sources. Fifteen new ones, most of them on his wishlist. If your Sources page suddenly needs a scroll bar, you know who to thank.

Free Networks: lots of small sources in one

Plenty of networks stream free on their own websites but have never been on Roku, Pluto or Samsung. Each one is a few channels, too small for a source of its own, so Free Networks puts them in one place: 35 networks and 140+ channels.

  • News: DW, Al Jazeera, TRT, NHK, Arirang, Bloomberg (TV and Radio), CBS News, Scripps, Newsmax, NewsNation, Sky News, Global News, KSL, NBC LX, Cheddar, Court TV, AccuWeather, Free Speech TV
  • Faith: EWTN, TBN (16 channels from TBN+), CBN, NRB, theDove, PosiTV
  • Entertainment and lifestyle: The CW's free channels, A+E's 24 FAST channels, Sinclair's diginets (Comet, Charge!, TheNest), Tastemade, Outside TV, Game & Fish TV, BUZZR
  • Shopping: HSN, QVC

Each network is fetched on its own and has its own time limit, so if one site goes down the rest keep working, and a short outage on a network's channel list doesn't disable its channels. You can switch off individual networks on the source card. Guides come from the network when it publishes one, from Gracenote when the channel has an ID, and otherwise you get named placeholder blocks.

Free Networks is off by default. Turn it on under Sources.

Other new sources

Free

  • Zeam: Syncbak's free local news and FAST service (formerly VUit), about 400 channels across every market. Clear HLS.
  • ViX: about 80 free Spanish-language channels (N+ Univision news, telenovelas, movies, sports). Plays through FastChannels Player.

Subscription / account

  • NFL: NFL Channel without signing in. With a TV provider or NFL+ sign-in, also NFL Network, RedZone and live-game event channels.
  • CBS: CBS Sports HQ, Golazo and the Champions League channel free. With a TV provider sign-in, also your local CBS station, CBS Sports Network and game event channels.
  • Paramount+: live sports (UEFA, Serie A, EFL, UFC and more) as event channels.

TV provider (TV Everywhere)

  • Disney: your local ABC, Freeform, FX, FXX, FXM, Nat Geo, Nat Geo Wild, Disney Channel, Junior and XD, plus free ABC News Live.
  • Versant: USA, E!, Syfy, Oxygen, CNBC, MS NOW, Golf Channel.
  • CNN: CNN, CNN International, HLN.
  • Univision: Univision, UniMás, Galavisión, TUDN, plus three free Univision channels.
  • C-SPAN: the 24/7 C-SPAN, C-SPAN2 and C-SPAN3 networks.
  • SundanceTV (needs a Sundance account as well as your provider).
  • Tennis Channel, plus free Tennis Channel 2 and Pickleball TV.
  • DAZN: DAZN 1, Rally TV, Red Bull TV, Unbeaten and Fubo Sports with a free DAZN account; YES and MSG through a provider that carries them.
  • NESN (Beta): NESN and NESN+, New England providers only.

Every new source is off by default. Several use the DRM bridge (FastChannels Player); the Sources page now shows which ones, and groups sources by how you get them (free, account, subscription, TV provider, custom).

FastChannels Player update required

FastChannels Player is now 5.2.12, and you need to update it on your Fire Sticks. Versant's streams change their DRM key in the middle of playback, and older players stopped about a second in with a "Crypto key not available" error. 5.2.12 also installs on older Fire OS 6 sticks (Android 7.1).

To update: Bridge → FastChannels Player devices, then Update to 5.2.12 on each device, or Update all. No sideloading needed.

Bug fixes

  • Spectrum sign-in works away from home (falls back to the account portal when Spectrum blocks the usual login), and Clear sign-in actually stops a sign-in in progress.
  • Playlist and guide files left behind by deleted feeds or switched-off bridges are cleaned up (#73).
  • Custom playlists: retry after a 429, and the Edit Playlist dialog opens from the last scrape instead of downloading the playlist again.
  • Duplicate Finder can switch a channel to another source and keep its number.
  • ESPN events: filter by team within a league; event channels get guide data before and after the event.
  • Movies show their release year in the guide (Plex, Amazon).
  • NBC TVE finds its new guide query by itself when NBC changes it.
  • Quieter logs across DAZN, Stirr, Adult Swim and the sign-in flows, with playlist keys and credentials kept out of them.

Upgrading

  • No manual steps; the database updates itself on first boot.
  • Docker: docker compose pull && docker compose up -d
  • Then update FastChannels Player to 5.2.12 on each device (see above).

Full release notes: Release v5.7.0 "The babsonnexus Edition" · kineticman/FastChannels · GitHub

Thanks to babsonnexus for the list/work. Everyone else, let me know what breaks, especially with Free Networks: 35 websites that each do their own thing means something is always about to change.

4 Likes

Just wanted to let you know that the Spectrum login worked great! Thank you!

Whenever you act on one of my suggestions, it seems you far exceed my imagination on how to implement it. I really like the revamped Duplicate Helper.

cool - unsure how the automatic resign process will work though - keep an eye on logs.

The ESPN filters really helped in managing the number of required channels for a specific sport and I really appreciate that. Right now I'm concentrating on (1) pass but would affect others passes that I use.

This screenshot is from my CDVR schedule for this evening. The game is the same for both. The top entry is using FC and the lower is from FDL/ADBTuner. My preference is the FDL look. Both are scheduled thru an advanced pass with the criteria in the 2nd image. I had to add the "Louisiana vs." Title rule to add the FC channel to the pass. I could have used just Louisiana but I didn’t want to hide the other 7 state schools.

The passes are easily managed with a little intervention but I'm hoping for a future non- intervention type pass. This is great work!!!

Incredible update! Thanks for your work.

These are the first new TVE sources I tried, but I'm seeing some errors. Versant is giving me an error when trying to log in with DirecTV. I tried a few other providers and it successfully generated a phone sign in QR code, so not sure if this is just a temporary issue with DTV:

Not signed in yet. Last attempt failed just now: Versant: 400 Client Error: Bad Request for url: https://sp.auth.adobe.com/api/v2/sparkmedia/sessions

I'm also seeing Gunicorn "Request line is too large" errors for the CNN source:

2026-10-23 11:46:42,034 INFO app.worker: [audit] cnn_tve: checking 3 channels (scope=linear, events skipped=0)…
2026-10-23 11:46:49,711 INFO app.worker: [audit] cnn_tve: done — total=3 checked=3 flagged=0 bridged=0 dead=0 vod=0 not_authorized=0 errors=0 skipped_403=0
2026-10-23 11:47:14,897 INFO app.routes.play: [play] request_id=56b8b189980338da ip=172.31.0.1 source=cnn_tve channel_id=cnn channel_name=CNN
2026-10-23 11:47:15,765 WARNING gunicorn.error: Invalid request from ip=172.31.0.1: Request Line is too large (4108 > 4094)
2026-10-23 11:47:19,734 WARNING gunicorn.error: Invalid request from ip=172.31.0.1: Request Line is too large (8192 > 4094)
2026-10-23 11:49:59,374 INFO app.routes.play: [play] request_id=412a5df490e3aaf4 ip=172.31.0.1 source=cnn_tve channel_id=cnn channel_name=CNN
2026-10-23 11:50:01,796 INFO gunicorn.access: 172.31.0.1 "GET /play/cnn_tve/cnn.m3u8 HTTP/1.1" 302 2369 2s
2026-10-23 11:50:02,233 WARNING gunicorn.error: Invalid request from ip=172.31.0.1: Request Line is too large (4108 > 4094)

great feedback - i can fix both. tnx

1 Like

Question about the HDHomerun source. What if you have 2 HDHomeruns?

Excellent project BTW!

Pushed 5.7.1. Please get it a whirl - should fix your bugs I hope

1 Like

No support for two currently. I’ve had a few folks ask- guess I should figure it out.

Thanks keep up the great work!

Life is Good!!!

Versant login works now! Unfortunately still seeing errors when actually trying to stream CNN and Versant channels

2026-10-24 10:13:59,694 INFO     gunicorn.access: 172.31.0.1 "GET /play/cnn_tve/cnn.m3u8 HTTP/1.1" 200 55006 1s
2026-10-24 10:13:58,681 INFO     app.routes.play: [play] request_id=714517de0b42ea2f ip=172.31.0.1 source=cnn_tve channel_id=cnn channel_name=CNN
2026-10-24 10:13:59,763 WARNING  gunicorn.error: Invalid request from ip=172.31.0.1: Request Line is too large (4108 > 4094)
2026-10-24 10:14:16,567 INFO     app.routes.play: [play] request_id=83bd8bcd3ac06b27 ip=172.31.0.1 source=versant_tve channel_id=msnow channel_name=MS NOW
2026-10-24 10:14:04,662 WARNING  gunicorn.error: Invalid request from ip=172.31.0.1: Request Line is too large (8192 > 4094)
2026-10-24 10:14:16,837 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/msnow.m3u8 HTTP/1.1" 302 2149 0s
2026-10-24 10:14:17,323 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3C/Event%3E HTTP/1.1" 404 207 0s
2026-10-24 10:14:21,949 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3C/Event%3E HTTP/1.1" 404 207 0s
2026-10-24 10:14:22,067 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3CEvent%3E HTTP/1.1" 404 207 0s
2026-10-24 10:14:26,666 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3CEvent%3E HTTP/1.1" 404 207 0s
2026-10-24 10:14:26,822 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3Cscte35:Signal%3E HTTP/1.1" 404 207 0s
2026-10-24 10:14:31,382 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3Cscte35:Signal%3E HTTP/1.1" 404 207 0s
2026-10-24 10:14:31,497 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3Cscte35:Binary%3E/DBEAAAAAAAAAADABQb+sN0wbQAuAixDVUVJAAAAAn//ACHLu8AMGE5CQ1Vtc25vd19FUDA2NDQxMTQ0MDAzORABATHlVDI=%3C/scte35:Binary%3E HTTP/1.1" 404 207 0s
2026-10-24 10:14:36,104 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3Cscte35:Binary%3E/DBEAAAAAAAAAADABQb+sN0wbQAuAixDVUVJAAAAAn//ACHLu8AMGE5CQ1Vtc25vd19FUDA2NDQxMTQ0MDAzORABATHlVDI=%3C/scte35:Binary%3E HTTP/1.1" 404 207 0s
2026-10-24 10:14:36,209 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3C/scte35:Signal%3E HTTP/1.1" 404 207 0s
2026-10-24 10:14:40,626 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3C/scte35:Signal%3E HTTP/1.1" 404 207 0s
2026-10-24 10:14:40,819 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3C/Event%3E HTTP/1.1" 404 207 0s
2026-10-24 10:14:45,562 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3C/Event%3E HTTP/1.1" 404 207 0s
2026-10-24 10:14:45,687 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3C/EventStream%3E HTTP/1.1" 404 207 0s
2026-10-24 10:14:50,262 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3C/EventStream%3E HTTP/1.1" 404 207 0s
2026-10-24 10:14:50,351 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3CEventStream%20schemeIdUri=%22urn:hlit:scte35:2020:1%22%20timescale=%2210000000%22%3E HTTP/1.1" 404 207 0s
2026-10-24 10:14:54,990 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3CEventStream%20schemeIdUri=%22urn:hlit:scte35:2020:1%22%20timescale=%2210000000%22%3E HTTP/1.1" 404 207 0s
2026-10-24 10:14:55,129 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3CEvent%20hlit-scte35:segmentTypeId=%220x11%22%20id=%222%22%3E HTTP/1.1" 404 207 0s
2026-10-24 10:15:00,222 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3Cscte35:Signal%3E HTTP/1.1" 404 207 0s
2026-10-24 10:15:00,059 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3CEvent%20hlit-scte35:segmentTypeId=%220x11%22%20id=%222%22%3E HTTP/1.1" 404 207 0s
2026-10-24 10:15:05,493 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3Cscte35:Signal%3E HTTP/1.1" 404 207 0s
2026-10-24 10:15:05,615 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3Cscte35:Binary%3E/DA/AAAAAAAAAADABQb+sN0wbQApAidDVUVJAAAAAn+/DBhOQkNVbXNub3dfRVAwNTcyNjc5MDAyOTYRAQHPcYIC%3C/scte35:Binary%3E HTTP/1.1" 404 207 0s
2026-10-24 10:15:10,706 INFO     gunicorn.access: 172.31.0.1 "GET /play/versant_tve/%3Cscte35:Binary%3E/DA/AAAAAAAAAADABQb+sN0wbQApAidDVUVJAAAAAn+/DBhOQkNVbXNub3dfRVAwNTcyNjc5MDAyOTYRAQHPcYIC%3C/scte35:Binary%3E HTTP/1.1" 404 207 0s

I'm running FC on a Synology if that helps narrow things down.

edit: Scratch that, only CNN is giving the errors now. Versant loads properly with ah4c! Here are some logs from after I added CNN to an ah4c feed:

2026-10-24 18:05:19,893 INFO app.routes.play: [play] request_id=19098d72358d9956 ip=172.31.0.1 source=cnn_tve channel_id=cnn channel_name=CNN
2026-10-24 18:05:28,995 INFO gunicorn.access: 172.31.0.1 "POST /play/fc-player/warm-stop-ack?channel_key=cnn_tve%3Acnn HTTP/1.1" 204 0 0s
2026-10-24 18:05:19,900 INFO app.routes.play: [fc-player] request_id=45059c1c751853b3 ip=172.31.0.1 source=cnn_tve channel_id=cnn channel_name=CNN adb=192.168.10.12 triggered=True -> ah4c (trigger-only)
2026-10-24 18:05:19,904 INFO gunicorn.access: 172.31.0.1 "GET /play/fc-player/cnn_tve/cnn.m3u8?scripts=2026.09.28&adb=192.168.10.12 HTTP/1.1" 204 0 3s
2026-10-24 18:05:20,256 INFO gunicorn.access: 172.31.0.1 "GET /play/cnn_tve/cnn/dash.mpd HTTP/1.1" 200 40376 0s
2026-10-24 18:05:21,353 INFO app.routes.play: [fc-player] request_id=9347fe83ca6425c5 ip=172.31.0.1 source=cnn_tve channel_id=cnn channel_name=CNN adb=192.168.10.65 triggered=True -> ah4c (trigger-only)
2026-10-24 18:05:21,284 INFO app.routes.play: [play] request_id=a10ad416953f5f5c ip=172.31.0.1 source=cnn_tve channel_id=cnn channel_name=CNN
2026-10-24 18:05:21,356 INFO gunicorn.access: 172.31.0.1 "GET /play/fc-player/cnn_tve/cnn.m3u8?scripts=2026.09.28&adb=192.168.10.65 HTTP/1.1" 204 0 3s
2026-10-24 18:05:21,484 INFO gunicorn.access: 172.31.0.1 "GET /play/cnn_tve/cnn/dash.mpd HTTP/1.1" 200 40376 0s
2026-10-24 18:05:22,967 INFO gunicorn.access: 172.31.0.1 "POST /play/fc-player/warm-stop-ack?channel_key=cnn_tve%3Acnn HTTP/1.1" 204 0 0s
2026-10-24 18:05:24,707 INFO gunicorn.access: 172.31.0.1 "POST /play/fc-player/warm-stop-ack?channel_key=cnn_tve%3Acnn HTTP/1.1" 204 0 0s
2026-10-24 18:05:25,175 INFO app.routes.play: [fc-player] request_id=d88f166a704134ab ip=172.31.0.1 source=cnn_tve channel_id=cnn channel_name=CNN adb=192.168.10.12 triggered=True -> ah4c (trigger-only)
2026-10-24 18:05:25,178 INFO gunicorn.access: 172.31.0.1 "GET /play/fc-player/cnn_tve/cnn.m3u8?scripts=2026.09.28&adb=192.168.10.12 HTTP/1.1" 204 0 1s
2026-10-24 18:05:25,190 INFO app.routes.play: [play] request_id=44bc5334961414f9 ip=172.31.0.1 source=cnn_tve channel_id=cnn channel_name=CNN
2026-10-24 18:05:25,496 INFO gunicorn.access: 172.31.0.1 "GET /play/cnn_tve/cnn/dash.mpd HTTP/1.1" 200 40376 0s

Unfortunately, the auto resign process didn't work. Log entries below.

2026-10-24 07:30:59,596 WARNING  app.scrapers.spectrum: [spectrum-renewal] refresh_token grant rejected: HTTP 401 reason=2076 (device_verifier saved=True, client_device_id saved=True) — if a browser re-login follows, this is the window a deviceverifier/auth renewal could replace
2026-10-24 07:30:59,602 INFO     app.routes.tasks: Enqueued Spectrum sign-in
2026-10-24 07:30:59,603 INFO     app.scrapers.spectrum: [spectrum] refresh_token was rejected outright — triggered unattended re-login
2026-10-24 07:30:59,603 WARNING  app.routes.play: [spectrum-dash] resolve failed for 127: [spectrum] saved session has expired and could not be refreshed — sign in again via the "Sign in to Spectrum" button.
2026-10-24 07:31:00,184 WARNING  app.scrapers.spectrum: [spectrum-renewal] refresh_token grant rejected: HTTP 401 reason=2076 (device_verifier saved=True, client_device_id saved=True) — if a browser re-login follows, this is the window a deviceverifier/auth renewal could replace
2026-10-24 07:31:00,185 WARNING  app.routes.play: [spectrum-dash] resolve failed for 127: [spectrum] saved session has expired and could not be refreshed — sign in again via the "Sign in to Spectrum" button.
2026-10-24 07:31:01,604 WARNING  app.scrapers.spectrum: [spectrum-renewal] refresh_token grant rejected: HTTP 401 reason=2076 (device_verifier saved=True, client_device_id saved=True) — if a browser re-login follows, this is the window a deviceverifier/auth renewal could replace
2026-10-24 07:31:01,604 WARNING  app.routes.play: [spectrum-dash] resolve failed for 127: [spectrum] saved session has expired and could not be refreshed — sign in again via the "Sign in to Spectrum" button.
2026-10-24 07:31:04,017 WARNING  app.scrapers.spectrum: [spectrum-renewal] refresh_token grant rejected: HTTP 401 reason=2076 (device_verifier saved=True, client_device_id saved=True) — if a browser re-login follows, this is the window a deviceverifier/auth renewal could replace
2026-10-24 07:31:04,017 WARNING  app.routes.play: [spectrum-dash] resolve failed for 127: [spectrum] saved session has expired and could not be refreshed — sign in again via the "Sign in to Spectrum" button.
2026-10-24 07:31:06,855 WARNING  app.scrapers.spectrum: [spectrum-renewal] refresh_token grant rejected: HTTP 401 reason=2076 (device_verifier saved=True, client_device_id saved=True) — if a browser re-login follows, this is the window a deviceverifier/auth renewal could replace
2026-10-24 07:31:06,856 WARNING  app.routes.play: [spectrum-dash] resolve failed for 127: [spectrum] saved session has expired and could not be refreshed — sign in again via the "Sign in to Spectrum" button.
2026-10-24 07:31:07,451 WARNING  app.scrapers.spectrum: [spectrum-renewal] refresh_token grant rejected: HTTP 401 reason=2076 (device_verifier saved=True, client_device_id saved=True) — if a browser re-login follows, this is the window a deviceverifier/auth renewal could replace
2026-10-24 07:31:07,451 WARNING  app.routes.play: [spectrum-dash] resolve failed for 127: [spectrum] saved session has expired and could not be refreshed — sign in again via the "Sign in to Spectrum" button.
2026-10-24 07:31:08,502 INFO     app.tve.browser_login.common: [mvpd-login] Spectrum SSO-confirm showed account da***[email protected] but da***[email protected] is configured — clicked "Sign in with another account" instead of Continue url=https://id.spectrum.net/login/auto?account_type=&client_id=stva-ovp&dark=true&client_device_id=e7a65fa4-f099-4f9f-97cd-27d76d4ef678&code_challenge=uypAMgX7tBT25mPkvoKbkqSKPhh9vtBJjBcZ3m15fyY&code_challenge_method=S256&exVisitID=202610241431V-03b0ee10-7ad0-4a79-b63a-2691388f6c55&nonce=zZS5JbQUC8JtSsoNffdxYmynU3361K8h&redirect_uri=https:%2F%2Fwatch.spectrum.net&x_client_version=18.0.2&supportSMB=true&l10n=en
2026-10-24 07:31:09,265 WARNING  app.scrapers.spectrum: [spectrum-renewal] refresh_token grant rejected: HTTP 401 reason=2076 (device_verifier saved=True, client_device_id saved=True) — if a browser re-login follows, this is the window a deviceverifier/auth renewal could replace
2026-10-24 07:31:09,265 WARNING  app.routes.play: [spectrum-dash] resolve failed for 127: [spectrum] saved session has expired and could not be refreshed — sign in again via the "Sign in to Spectrum" button.
2026-10-24 07:31:10,417 WARNING  app.scrapers.spectrum: [spectrum-renewal] refresh_token grant rejected: HTTP 401 reason=2076 (device_verifier saved=True, client_device_id saved=True) — if a browser re-login follows, this is the window a deviceverifier/auth renewal could replace
2026-10-24 07:31:10,417 WARNING  app.routes.play: [spectrum-dash] resolve failed for 127: [spectrum] saved session has expired and could not be refreshed — sign in again via the "Sign in to Spectrum" button.
2026-10-24 07:31:12,183 WARNING  app.fc_player_bridge: [fc-player] device playback error: 10-24 07:31:10.453 E/FCPlayer.Playback(15389): playback error channel_key=spectrum:127 (retry 1/3): androidx.media3.exoplayer.ExoPlaybackException: Source error
2026-10-24 07:31:13,159 WARNING  app.scrapers.spectrum: [spectrum-renewal] refresh_token grant rejected: HTTP 401 reason=2076 (device_verifier saved=True, client_device_id saved=True) — if a browser re-login follows, this is the window a deviceverifier/auth renewal could replace
2026-10-24 07:31:13,160 WARNING  app.routes.play: [spectrum-dash] resolve failed for 127: [spectrum] saved session has expired and could not be refreshed — sign in again via the "Sign in to Spectrum" button.

Tnx out of pocket today but will check out tomorrow