Skip to content

Releases: kineticman/FastChannels

FastChannels 4.8.0

Choose a tag to compare

@kineticman kineticman released this 09 Jul 14:54

YouTube custom-channel reliability, plus channel-numbering fixes for accounts with no chnum_start configured anywhere.

📺 YouTube custom channels

YouTube expanded its PO Token requirement to the web, web_safari, ios, tv, and mweb yt-dlp player clients, which broke YouTube custom-channel resolution entirely ("No video formats found!") — not just for live streams, for ordinary videos too.

  • Switched to trying the android_vr and android clients first — both still PO-token-free as of this release — with the old web-based clients kept as a last-resort fallback.
  • Added a weekly job that refreshes yt-dlp from GitHub master inside the running container (YouTube's extractor breaks often enough that a month-old install goes stale between image rebuilds), and made sure it actually reaches play-time: it now signals gunicorn to gracefully recycle its workers afterward, since a worker that already imported yt_dlp otherwise keeps serving the stale copy until it naturally recycles.
  • Fixed two robustness gaps in that same job: its own timeout no longer collides with the job-level timeout (which could've orphaned a half-finished install), and it now runs on the same queue as scrapes so it can't race a concurrent YouTube scrape's package import.

🔢 Channel numbering

  • Fixed channels with a literal | in their name (e.g. "FOX LOCAL Dallas | Fort Worth") being silently dropped from both the standard and Gracenote M3U outputs — not just showing a blank Ch# in the admin list. A legacy Roku ID-encoding check was too broad and misidentified ordinary channel names as Gracenote claims.
  • Fixed channels being silently skipped entirely (missing tvg-chno, blank admin Ch#) when a source has no chnum_start configured and there's no global fallback either — previously affected any install where numbering was never explicitly set up on every source.

🧹 Internal cleanup

Consolidated five near-identical copies of the channel-number cursor-assignment logic in app/generators/m3u.py into two shared helpers. Verified behavior-preserving via 15,000+ randomized test cases plus a byte-for-byte diff of real M3U output before/after.

FastChannels 4.7.0

Choose a tag to compare

@kineticman kineticman released this 06 Jul 20:41

A reliability-focused release — mostly bug fixes across VIDAA, STIRR, Fubo, and the admin UI, plus automatic cleanup for scraper sources that have been removed from the registry.

🧹 Automatic orphaned-source cleanup

Sources whose scraper class has been missing from the registry for 7+ days (e.g. after a scraper is retired) are now automatically purged — channels, programs, and cache — instead of lingering forever. Runs at container boot and on the daily integrity job, with a grace period so a transient bad deploy doesn't get mistaken for a removed scraper.

🔧 Fixes

  • VIDAA (Hisense) — added a circuit breaker so a confirmed EPG grid outage stops retrying every station individually instead of hammering the endpoint; the breaker now preserves the real error and is scoped per-region, so an outage in one geo no longer silently wipes out EPG for a healthy geo in the same scrape. New installs default the Vidaa source to disabled.
  • STIRR — fixed an epoch-timestamp unit-detection bug that was landing program times thousands of years in the future/past on real feeds (OTTera/imagicomm, freelivesports), plus a plausibility guard so a malformed timestamp can't silently produce a wrong-but-valid-looking date.
  • Fubo — forces a fresh login on a stale-entitlement 403 instead of misclassifying it, and credential-change detection is more reliable (a password/email rotation is now always picked up).
  • Admin UI — fixed the Ch# column showing blank for channels excluded by the default feed's own filters, the category dropdown closing while scrolling its own option list, and the "next scrape" estimate drifting out of sync with the actual scheduler. Added a next-scheduled-scrape column and dropped stale beta labeling on the channel-changes report.
  • Plex / PrismCast — added per-request outcome/latency diagnostics to Plex's guide fetch, fixed a p95 latency calculation bug, and sharpened PrismCast's test-setup diagnostic, modal readability, and modal-close behavior.
  • Maintenance jobs — the worker now rejects bogus EPG timestamps on ingest and runs a weekly prune + VACUUM; the bogus-program prune now also checks start_time (not just end_time) and its cleanup query batches properly instead of risking a SQLite crash on a large source.
  • Startup/schema — the app settings row is now created before schema migrations run, and the inline Gracenote name-match migration is gated behind a done-flag so it can't silently re-run.

FastChannels 4.6.1

Choose a tag to compare

@kineticman kineticman released this 04 Jul 17:20

A small patch release with two fixes reported right after 4.6.0 shipped.

🔧 Fixes

  • Stream audit — HTTP 451 (Unavailable For Legal Reasons) at resolve time is now treated as a no-penalty skip, same as 403, instead of a hard error. Previously a source with a batch of geo/proxy-blocked channels at the front of its list (e.g. Roku's news partners over a VPN or datacenter IP) could trip the audit's consecutive-error breaker and abort before ever reaching the rest of the source's channels.
  • Admin UI — the "Delete Channels" button in the Clean Up Inactive Channels modal now visibly dims and shows a not-allowed cursor while disabled, instead of looking identical (and clickable) before you've run Preview. The modal copy also now tells you to click Preview first.

FastChannels 4.6.0

Choose a tag to compare

@kineticman kineticman released this 04 Jul 16:21

FastChannels 4.6.0

A bridge-and-cleanup release. The headliner is a BETA PrismCast DRM bridge for the channels that used to just get disabled — plus a pile of reliability fixes across VIDAA, Sling, category handling, and the admin UI.

🆕 PrismCast DRM Bridge (BETA)

Some channels are protected with DRM that FastChannels can't decrypt on its own (FairPlay on Roku, Widevine on Amazon/Sling). Up to now those channels either got disabled or just didn't play cleanly. This release adds an opt-in PrismCast bridge that captures the decrypted output and re-serves it through FastChannels instead.

  • Supported today: Roku (FairPlay), Amazon Prime Free (Widevine), and Sling (Widevine). That's it for now — nothing else routes through the bridge yet.
  • Off by default. Turn it on in Settings; there's a setup tester that walks through an end-to-end check against your PrismCast install so you know it's actually wired up before you rely on it.
  • A dedicated PrismCast feed (with a Gracenote variant) carries the bridged channels alongside everything else that plays direct — feed counts and the "Add to Channels DVR" button account for bridged channels correctly.
  • Fixed a fullscreen letterboxing bug in the capture path.

Known issue: there's an intermittent bug where video freezes but audio keeps playing. We've isolated this to PrismCast's own capture layer — FastChannels' output has been confirmed clean — so it's not something we can fix on our end, but wanted it called out clearly since this feature is BETA. If you hit it, that's why.

🔧 Reliability fixes

  • VIDAA (Hisense) — scraper now fails over to a backup backend host automatically instead of just erroring out, and a full EPG outage now shows up as a real error instead of silently reporting "success" with zero programs.
  • Sling — pulls a deeper EPG window (~22 hours minimum) so the guide doesn't run dry as late in the day.
  • Pluto — sends the same boot signal Pluto's own apps send, which keeps things in sync with what they're serving.
  • Categories — fixed ~70 channels stuck with no category, plus a handful that had drifted into different categories depending on which source they came from.
  • Channel Changes report — fixed a memory spike that could balloon report memory usage by gigabytes, plus a crash on smart quotes in channel names.
  • Playback errors — dead streams and temporary hiccups now return distinct, correct error codes instead of one generic failure, and a source's cached login gets cleared automatically when you update its credentials (previously required for changes to take effect).
  • Roku — smarter retry behavior around temporary blocks so channels don't get stuck waiting out a cooldown unnecessarily.

🖥️ Admin UI

  • Category filters on Channels/Guide are now multi-select with counts and a "select all" shortcut.
  • New "Channel Number Map" card on Feeds showing each feed's channel-number ranges.
  • Pending-review channels now get a nav badge across admin pages so you don't have to remember to check.
  • Source Health now shows the actual cron schedule instead of a stale interval number.

FastChannels 4.5.0

Choose a tag to compare

@kineticman kineticman released this 19 Jun 02:59

Decent-sized one this time — a new source, a way to vet new channels before they hit your lineup, and a bunch of guide niceties. If you've been wanting more control over what lands in your feeds, this is the release for you.

🆕 New source: FreeCast

  • Another pile of free, ad-supported live channels.
  • Streams resolve fresh at play time so they don't go stale, and their ad-stitched (DAI) channels work properly.
  • Auto-detects language from descriptions, so non-English channels get tagged right.
  • Comes with EPG (ranked "partial," so better guide data from other sources wins when channels overlap).

✨ What's new

Review new channels before they go live

  • New channels from a scrape can now sit in a holding pen instead of dumping straight into your feeds.
  • Flip it on globally, or set it per-source (auto-add / hold for review / inherit).
  • New "Needs review" filter + a NEW badge so you can spot them.
  • Clear them however you like: enable, disable, or the new "Keep Disabled" (reviewed, but not in feeds). One at a time or in bulk.

Guide stuff

  • A–Z scrubber rail to jump around fast.
  • Search now matches channel names, not just show titles.
  • It remembers your recent searches too.

Channels page

  • Rotating/featured slots are now flagged, with a "Content Swapped" card on the Changes report when a slot swaps out what it's airing.
  • Resolution badges (HD/FHD/4K/HEVC) finally show up for opaque sources like STIRR.
  • New English / Non-English language grouping.
  • A little nudge pill on the cleanup button when there are dead channels to clear.

More channels

  • Added Kaloopy and a batch of free 24/7 news & live channels to the catalog.
  • STIRR now grabs better EPG from their export feed.

Behind the scenes

  • Everything's on one shared player now, so playback's more consistent across the guide, watch page, and previews.

🐛 Fixes

A bunch this round — the ones worth knowing about:

  • Fixed stale Gracenote IDs sticking to rotating slots (was throwing wrong guide/DVR data on featured channels).
  • Samsung + YouTube playback/preview fixes (plus a Samsung logo cert error).
  • STIRR playback/audit fixes on older CDNs, and recovered descriptions that were getting cut off.
  • Bally Sports no longer drops channels on certain CDN subdomains.
  • Smoothed out database locking on big scrapes (batched EPG pruning, edit retries).
  • Amazon login stopped throwing false "not signed in" errors.

Plus the usual smaller cleanup — custom-channel previews, text sanitizing, EPG timestamps.

⬆️ Updating

Pull the new image and bounce the container:

docker compose -f docker-compose.ghcr.yml pull && docker compose -f docker-compose.ghcr.yml up -d

Your data and settings carry over.

v4.4.6

Choose a tag to compare

@kineticman kineticman released this 14 Jun 01:36

YouTube

  • Fixed YouTube custom channels failing to play. YouTube now requires a JavaScript runtime (Node ≥ 22) to solve its n-signature challenge, and the container shipped an older Node that yt-dlp rejected as unsupported — so affected setups got 403 / "No video formats found" / "n challenge solving failed" (while it kept working on others, depending on the server's IP). The image now installs Node 24, restoring playback of YouTube Live and video channels.
  • Clearer failure reporting. When YouTube returns only throttled formats, the stream inspector now reports the specific reason instead of a bare "extraction failed". Set FC_YTDLP_VERBOSE=1 to bridge yt-dlp's full extractor trace into the container logs for debugging.

v4.4.5

Choose a tag to compare

@kineticman kineticman released this 13 Jun 14:09

Database Backup & Restore

  • Nightly auto-backup — a gzip-compressed online SQLite snapshot is written to /data/backups each night at 03:30 (local), keeping the newest 3. Uses SQLite's online backup API (safe against the live DB); /data is volume-mounted so backups survive container rebuilds.
  • Restore from auto-backup — the Settings → Database Backup card is redesigned into side-by-side Create / Restore columns, with one-click restore of the latest nightly snapshot, a "view all snapshots" modal, and the existing file-upload restore (.db / .db.gz).

Resolution / Quality Tiers

  • HD filter split into 720p / 1080p tiers — the channel list now distinguishes Full HD (1080p+, below 4K) from HD (720p), with matching badges.
  • Estimated resolution from bitrate — manifests advertising BANDWIDTH but no RESOLUTION (e.g. Pluto) get an estimated quality tier from peak bitrate, flagged as approximate (~) so it is never mistaken for a measured value.

Public Base URL

  • Legacy PUBLIC_BASE_URL env honored everywhere — the env value is now a first-class fallback, so M3U/XMLTV output, the play proxy, and the settings API use it instead of falling back to localhost when only the env (not the UI field) is set.

Stream Audit

  • Rate-limit cooldown surfaced — when a source rate-limits (403), the audit modal shows a live "paused — cooldown" state with remaining time instead of appearing frozen, and resumes automatically.

Browser Playback

  • Richer Shaka error reporting — channel and guide preview players report Shaka error category/code names plus contextual diagnostics (secure-context, Web Crypto availability, DRM/manifest hints).

Performance

  • Faster program prune — runs in larger batches with a higher timeout so a large backlog clears without timing out.

FastChannels v4.4.0

Choose a tag to compare

@kineticman kineticman released this 12 Jun 17:09
  • New sources — Added Adult Swim marathon channels and HDHomeRun/SiliconDust local tuner integration, including lineup discovery, MPEG-TS handling, and XMLTV guide support.
  • Browser playback — Improved Pluto and Fubo playback across Chrome and iOS, added native Safari/iOS HLS behavior, and disabled unsupported in-browser playback for HDHomeRun MPEG-TS channels.
  • Fubo reliability — Reworked guide retrieval around the PAPI source, enriched program metadata, widened discovery, and fixed segment buffering and guide visibility issues.
  • Channels DVR integration — Fixed feed Gracenote detection, MPEG-TS source formatting, and push error reporting.
  • EPG performance — Isolated XML refresh work in a subprocess to release memory after generation and sped up XMLTV output.
  • Admin improvements — Added source category sections, a Feeds summary card, guide half-hour alignment, custom-channel status tooltips, and safer feed actions for names containing apostrophes.
  • Setup defaults — Fresh installs now start the Default feed at channel 5000 and provide clearer first-run server URL guidance, including placeholder detection.
  • Fixes — Corrected custom-channel scrape status, Plex music-video categorization, category backfill scope, and several source-specific playback and metadata issues.

FastChannels v4.3.0

Choose a tag to compare

@kineticman kineticman released this 09 Jun 16:08
  • New browser player — Replaced the old video engine with Shaka Player, which supports DASH streams and DRM-protected content natively in the browser. Lots of polish followed: volume controls, mute behavior, stats overlay, mobile layout fixes.
  • Amazon & Sling improvements. With new built-in player, you can watch streams from these sources inside a Chrome browser (DRM still restricts watching on CDVR). A few limitations exist with watching on a HTTP (non-HTTPS) server.
  • Fullscreen watch page — New /watch page for a proper fullscreen viewing experience, with keyboard shortcuts and closed caption toggle. Preview modal buttons were unified to match.
  • Channel number duplicate fix — Fixed a bug where tvg-chnum values could collide between the standard and Gracenote M3U partitions, causing duplicate channel numbers for newly added or re-enabled channels.
  • Guide performance — Cut the initial guide page load from ~2.7 MB down to ~470 KB by lazy-loading program data as you scroll.
  • PrismCast M3U output — New M3U format for browser-based IPTV players.
  • Mobile polish — Stats button, volume slider, and action buttons all behave better on small screens.

v4.1.0

Choose a tag to compare

@kineticman kineticman released this 02 Jun 14:32

FastChannels 4.1.0

✨ New: TV Guide (/admin/guide)

A live EPG grid showing a 5-hour window of programming across all enabled channels. Filter by source, feed, category, or search by program title. Navigates forward/back in time and works on mobile with horizontal scroll.


Fixes & Improvements

  • Frndly TV — reduced scrape failures from periodic re-logins; stream paths now cached across workers to cut redundant API calls at play time
  • ViewTV streams — fixed playback for SSAI/session-variant streams via HLS relay; fixed segment drops caused by mrouter cross-domain redirects
  • Stream detector — ad network CDNs (Google, Amazon) no longer mistaken for the target stream
  • Audit worker — geo-blocked and unreachable sources now abort early instead of running to completion; fixed audit results not always persisting to DB
  • Scheduler — fixed timezone cache corruption that caused workers to log/schedule in UTC
  • Gracenote — added 190 Samsung TV Plus and Fubo TVTV station mappings
  • Misc — Fubo disabled by default on new installs; Safari favicon fixed; setup checklist no longer flags disabled sources