Skip to content

Releases: theantipopau/xteve-reborn

xteve-reborn 3.0.4

Choose a tag to compare

@github-actions github-actions released this 24 Sep 21:49

xteve-reborn 3.0.4

Provider metadata now survives into the M3U you serve

Per-stream directives — #KODIPROP, #EXTVLCOPT, #EXTHTTP, #EXTGRP — were parsed away and
never came back. The M3U that xTeVe Reborn serves now carries them verbatim, between a channel's
#EXTINF and its URL, exactly where the provider put them.

That is what gets a provider-mandated http-user-agent (#EXTVLCOPT) or extra request headers
(#EXTHTTP) through to Kodi, TiviMate and VLC, and what carries #KODIPROP licence metadata for
DRM streams. To be explicit about the limits: Plex, Emby and Jellyfin parse none of these lines, and
buffered re-streaming re-produces the video (which drops DRM regardless) — this is a win for M3U
clients and for no-buffer mode.

Failover now knows the provider's own account limit

3.0.3's selection only knew how many viewers this instance was serving from each URL, which is
blind to other apps sharing the same account. For Xtream Codes providers the account status
(max_connections, active_cons) is now read in the background and folded into selection:

  • a source whose provider account is already full is no longer treated as idle,
  • between equally loaded sources, the one with more free connections wins,
  • providers that don't expose an account limit keep the previous behaviour exactly.

The stream path never waits for a provider: it reads a cached answer and, when that is stale,
starts a single background refresh (3s timeout, 2 minute TTL, 30s minimum interval). Chosen sources
log their remaining provider connections when known.

Reachability probes are also cached for 15 seconds now. A channel with backups used to probe up to
four URLs per play request; it now probes each source at most once per 15s, so a popular channel
stops re-probing every upstream for every viewer.

The dashboard shows whether failover can work at all

  • Backups on: 812 of 1200 — active channels that have at least one backup configured. A
    channel without one is a channel that cannot fail over, and there was no way to see that before.
  • Sources: 3 ok / 1 failing (Provider X) — the outcome of the last check of every
    playlist and XMLTV source, instead of reading the log.

Channel limits are settings now

plex.channel.limit and unfiltered.channel.limit were hard-coded at 480. They are now fields in
Settings (still 480 by default, capped at 100000). Above the unfiltered limit nothing activates
automatically until a filter exists — which is why a large Jellyfin or Emby lineup could look
empty — so that is now something to raise rather than a reason to write a dummy filter. Both are
advisory (they drive warnings and that activation gate), never a hard cap.

Fixed: auto-fill backups did nothing after a guide rebuild

Data.XEPG.Channels holds structs after a rebuild and maps after loading xepg.json, and
auto-fill only understood maps — so on a normally rebuilt database it skipped every channel and
reported "No two providers share a channel name". It now handles both, which is what made Fill
backups from other providers
look like it silently did nothing.

Auto-fill also matches channel names tolerantly now (HD, FHD, (Backup), -/_ separators),
while deliberately keeping numbered and time-shifted channels apart (BBC One +1 is not BBC One), and gained a Preview backups action that reports what it would change without saving
anything.

Also

  • The web UI templates are now covered by a test that renders every page and script against the
    language file, so a settings label can no longer go missing and truncate a served script. It
    immediately found a typo'd placeholder reference that had been silently leaving the temp-path
    field blank.
  • Two leftovers in the buffered streaming path that set a Content-Length after the response
    headers had already been sent were removed, with the ordering contract documented — writing a
    body after declaring a zero length is what breaks restreaming to strict HTTP clients, and the
    next refactor that moves those lines will now trip over the comment instead of Plex.
  • Small credit to the xTeVe-dietpi fork and the Reddit
    user who mentioned it: their private build's per-stream metadata idea is what this release's
    directive passthrough started from (see below).

Upgrading

3.0.4 is a drop-in upgrade from 3.0.x: same config folder, same endpoints. New settings get their
defaults on first start, and the XEPG database gains a field on its next rebuild — no migration
step. The in-app updater (non-Docker installs) will offer it automatically; Docker users pull the
new image:

docker pull ghcr.io/theantipopau/xteve-reborn:v3.0.4

Thanks

  • c0y0t3d3n/iptv — load-aware source selection and
    name-matched lineup merging, which this release extends with provider account limits.
  • chtugha/xTeVe-dietpi and the Reddit user who
    pointed at it — prompting the per-stream metadata passthrough.
  • Threadfin — backup/failover channels and Jellyfin
    support.
  • xTeVe by saroxan — the original project.

Full changelog: https://github.com/theantipopau/xteve-reborn/blob/main/runningchangelog.md

xteve-reborn 3.0.3

Choose a tag to compare

@github-actions github-actions released this 24 Sep 07:24

xteve-reborn 3.0.3

Backup channels that share the load

Backup channels (up to 3 backup URLs per channel) previously picked the first source that
answered
a quick reachability check. That fixes dead providers, but with the same channel
available from several IPTV providers it always favored the fastest responder — which could be the
account already serving streams, and the one about to be cut off for exceeding its connection
limit.

Selection is now load-aware:

  • A healthy and idle primary wins immediately — one probe, exactly the cost the old behavior
    paid. Channels without backups configured pay nothing, as before.
  • If the primary is down or already serving streams, the first reachable source with no active
    viewers wins.
  • If every reachable source is busy, the one with the fewest active viewers wins, spreading
    viewers across providers instead of stacking them on one account.
  • If nothing responds, the primary is returned unchanged and the existing error handling takes
    over, exactly as before.

The idea — pick the source with the most free connections — comes from
c0y0t3d3n's iptv project; thanks for sharing it. The counts
here are per-instance (how many viewers this xTeVe Reborn is serving from each URL);
provider-truth, account-wide counts need Xtream Codes support, scoped in
issue #1.

One click: auto-fill backups across providers

Backup channels required editing every channel by hand. The dashboard's XEPG Channels card now has
"Fill backups from other providers": every active channel whose name (case-insensitive) is
carried by two or more of your M3U providers gets its empty backup slots filled with the other
providers' URLs — at most one backup per provider, never the channel's own URL, never duplicating
a backup you configured manually. "Rebuild backups" (with a confirmation) rebuilds all three
slots of multi-provider channels from scratch, replacing manually-entered ones.

When nothing can be filled, the toast says why: no two providers share a channel name, shared
names exist but each is single-provider, or the slots are already full. A guide rebuild runs
automatically after a fill.

Fixed: UDPxy ignored backup URLs

With an UDPxy relay configured for multicast IPTV, only the
channel's primary URL was rewritten from udp://@... to HTTP through the relay. A backup chosen
on failover could bypass the relay entirely — and udp:// URLs can't be probed for reachability,
so multicast backups were effectively unusable. All candidate URLs are rewritten before selection
now, so whichever source wins is both probeable and directly playable by the client.

Verified harder

  • The Docker smoke test now fails unless the container's own HEALTHCHECK reports healthy —
    previously it only checked the endpoints from outside, and Docker's verdict was never read.
  • The Jellyfin end-to-end workflow grew a second phase: a fake M3U provider (a small Python HTTP
    server, no new dependencies) is seeded into the app's configuration, the app restarts and builds
    its database, and the workflow asserts a populated lineup, follows the /stream/ redirect to
    the provider's bytes, and confirms Jellyfin imports the channel. Previously it only proved tuner
    registration against an empty lineup.

Project

  • A small project website: theantipopau.github.io/xteve-reborn
    (served from this repo's docs/ folder).
  • Added repository topics so the project is findable for iptv / m3u / xmltv / hdhomerun searches.

Upgrading

3.0.3 is a drop-in upgrade from 3.0.x: same config folder, same endpoints, no settings changes.
The in-app updater (non-Docker installs) will offer it automatically; Docker users pull the new
image:

docker pull ghcr.io/theantipopau/xteve-reborn:v3.0.3

Full changelog: https://github.com/theantipopau/xteve-reborn/blob/main/runningchangelog.md

xteve-reborn 3.0.2

Choose a tag to compare

@theantipopau theantipopau released this 24 Sep 00:19

xteve-reborn 3.0.2

The interface now follows your light/dark setting

The web UI was dark-only. It now ships a light theme that follows your OS or browser preference
automatically. The palette was already custom-property based, so this is the same design in a second
colour scheme rather than a redesign. There is no in-app toggle — change it in your OS.

Fixes

  • Dropdowns had no arrow. A global appearance: none stripped the native indicator with nothing
    put back, so a <select> looked exactly like a read-only text field.
  • Cancel buttons rendered as a second primary button with red text on it — a stylesheet
    shorthand was leaving the accent gradient in place.
  • Keyboard focus is visible again. Buttons had their focus outline removed with nothing replacing
    it, so keyboard users had no idea where they were.
  • The XMLTV gzip writer leaked a file descriptor: the output file was never closed, so every guide
    rebuild leaked one and on Windows left the .gz locked against being replaced. Rare when the
    guide only rebuilt daily; not rare since 3.0.1 rebuilds it whenever a source changes.

Accessibility

  • Pages declare their language, the detail and mapping popups are real dialogs for screen readers,
    toasts are announced through a live region, and the CSS-background logo is labelled.
  • The login and first-run forms carry autofill hints, so password managers can fill them.
  • Animations respect prefers-reduced-motion.

Docker

  • The image now reports real health. A HEALTHCHECK probes the tuner endpoint, so
    docker compose ps, Portainer and Unraid show actual container health and
    depends_on: {condition: service_healthy} works. If you change the app's port, set
    XTEVE_REBORN_PORT to match.

    docker pull ghcr.io/theantipopau/xteve-reborn:v3.0.2
    

Smaller, and better tested

  • Removed roughly 4,000 lines of dead legacy JavaScript that was still being embedded into every
    build — the UI moved to TypeScript, but the old hand-written files were left behind and the
    bundler walks the whole html/ folder.
  • A Jellyfin contract suite pins the HDHomeRun discovery fields, lineup entry shape and generated
    XMLTV guide structure Jellyfin depends on, and runs in CI on every push. A container-based
    end-to-end check drives a real Jellyfin through its own setup wizard and API too — it earned its
    keep immediately, by catching /lineup.json answering null instead of [] on an install with
    no provider source configured yet.
  • Releases are built by CI from the tag, replacing a manual, Windows-only build script.

Upgrading

Drop the new binary over the old one, or use Install Now from the dashboard banner. No settings
or data changes are needed.

xteve-reborn 3.0.1

Choose a tag to compare

@theantipopau theantipopau released this 23 Sep 07:53

xteve-reborn 3.0.1

The guide now updates itself when your source changes

Before, your M3U/XMLTV sources were only re-downloaded at the scheduled update times (default: once
a day at midnight), so an EPG change upstream didn't reach Plex until the next day.

Now each source is also checked every 60 minutes (Settings → Playlists & Guide; 0 turns it
off). If a source's content actually changed, only that source is re-downloaded and the guide is
rebuilt straight away. Checks use conditional requests, so a server that supports ETag /
Last-Modified answers "not modified" without resending the file. The dashboard shows when the
guide last refreshed, when the next check is, and has a Check sources now button.

Fixes

  • The Log page showed literal &nbsp; in every line.
  • Once the log reached 500 lines it silently dropped roughly every other new line, errors included.
  • Log writes from different parts of the app could race each other.
  • Stream requests returned 404 if the client added a query string or connected through a proxy.
  • Two database rebuilds could start at the same time, and one finishing could mark the other done.
  • The maintenance page now reloads itself instead of asking you to try again later.

Updater

  • Every release now ships xteve-reborn_<version>_checksums.txt; the updater verifies the
    download's SHA-256 before installing and refuses to install without it.
  • Downloads are time-limited, only the expected binary is read from the zip, and after an update
    on Windows the new process waits for the old one to release the port.

Docker

  • The container now runs as a normal user: set PUID/PGID (default 1000) and it takes ownership
    of /config at startup. Set TZ so scheduled times match your local time.

  • Update containers by pulling the new image — the in-app installer is disabled inside Docker.

    docker pull ghcr.io/theantipopau/xteve-reborn:v3.0.1
    

Setup and settings

  • The setup wizard now asks whether to require a login for the web interface (recommended: the Log
    page shows provider URLs, which usually contain your account credentials).
  • Tuner count is a number field instead of a 100-item dropdown.
  • Settings is split into clearer sections, and an unsaved changes bar appears when you edit
    something — it also warns before you navigate away and lose changes.
  • Leftover upstream branding and broken English cleaned up.

Upgrading

Drop the new binary over the old one, or use Install Now from the dashboard banner. No settings or
data changes are needed.

xteve-reborn 3.0.0-pre.4

Pre-release

Choose a tag to compare

@theantipopau theantipopau released this 13 Sep 05:38

xteve-reborn 3.0.0-pre.4

What's new

  • Official Docker image. Multi-arch (linux/amd64, linux/arm64), published to GitHub Container
    Registry on every tagged release:

    docker pull ghcr.io/theantipopau/xteve-reborn:latest
    

    A docker-compose.yml example is in the repo. Note on SSDP
    auto-discovery: Docker's default bridge network doesn't forward the broadcast/multicast traffic
    Plex/Emby use to auto-find the tuner, so --network host (Linux only) gives the best chance of
    that working automatically. Without it, everything still works fine — just add the tuner in
    Plex/Emby manually using the address the setup wizard's last step (or the dashboard) shows you.

No settings/data format changes — safe to drop straight over an existing install.

Full changelog: README.md.

Downloads

Windows, Linux, and macOS binaries (amd64 + arm64) below, or pull the Docker image above.

xteve-reborn 3.0.0-pre.3

Pre-release

Choose a tag to compare

@theantipopau theantipopau released this 12 Sep 12:23

xteve-reborn 3.0.0-pre.3

What changed

  • Concurrency audit, round two. The earlier Data.XEPG.Channels crash fix turned out to be
    one instance of a broader pattern — shared state written by the maintenance loop / WS handlers
    and read (aliased, not copied) into a response built on another goroutine. Audited the rest of
    the app's shared state and found four more real instances with no lock at all:
    Data.Cache.StreamingURLS (written on every lineup/M3U rebuild, read on every single stream
    start — the hottest path in the app), System.Notification, Data.XMLTV.Mapping, and
    Data.Streams.*/Data.StreamPreviewUI.*/Data.Filter/Data.Playlist.M3U.Groups.*. All fixed,
    each with a regression test verified against go test -race.
  • A real self-updater, finally. Previous builds had self-update hardcoded off because upstream
    xTeve's version spoke a proprietary protocol to the original author's own server — not something
    this fork has access to. Replaced it with a client for GitHub's public Releases API. Checking for
    a newer release (at startup, and once a day) is always on and read-only. Installing one is
    opt-in: by default you'll see an "Update available" banner with a one-click Install Now, or
    flip on "Automatically install updates" in Settings for fully hands-off updates going forward.
    This release (v3.0.0-pre.3) is itself the first one built with the version tag baked in, so
    it's also the first release this feature can actually detect updates from — installs from an
    older prerelease should already correctly detect this one as newer.

No settings/data format changes — safe to drop straight over an existing install. If you have
"Check for Updates" open in the dashboard already, you'll see this version show up as available.

Full changelog: README.md.

Downloads

Windows, Linux, and macOS (amd64 + arm64). Unzip and run.

xteve-reborn 3.0.0-pre.2

Pre-release

Choose a tag to compare

@theantipopau theantipopau released this 12 Sep 11:41

xteve-reborn 3.0.0-pre.2

Follow-up prerelease based on early feedback from 3.0.0-pre: "linked into Plex seamlessly... need
to make the walkthrough a little more straightforward, it looks complicated with IP addresses etc,
had to add the URL manually to Plex too."

What changed

  • The setup wizard now ends by telling you exactly what to paste into Plex. Previously it
    finished silently and dropped you into the dashboard, leaving you to find the right address
    yourself among several stat-bar fields (more confusing on a machine with several network
    interfaces) and figure out Plex/Emby setup unassisted. It now ends on a dedicated step: the
    exact tuner address in a copy-button box, plus one-line instructions —
    Plex: Settings → Live TV & DVR → Set Up Plex DVR (Plex usually finds it
    automatically within a few seconds; if not, choose "Don't see your HDHomeRun tuner?" and paste
    the address shown), and Emby/Jellyfin: Live TV → Add Tuner Device → HDHomeRun,
    same address.
  • Fixed a real bug found while building the above: the copy button called the browser's
    clipboard API unconditionally and always claimed success. That API requires a secure context
    (HTTPS or localhost) — but this app is normally reached over plain http://<lan-ip>:<port>,
    exactly the case this feature targets — so the copy silently failed there and the toast lied.
    It now falls back to the older select-and-copy method on a plain HTTP address, and reports
    failure honestly if both methods fail.

No settings/data format changes — safe to drop straight over a 3.0.0-pre install.

Full changelog: README.md.

Downloads

Same platforms as before: Windows, Linux, and macOS (amd64 + arm64). Unzip and run.

xteve-reborn 3.0.0-pre

Pre-release

Choose a tag to compare

@theantipopau theantipopau released this 12 Sep 05:49

xteve-reborn 3.0.0-pre

First public prerelease of xteve-reborn, a personally-maintained fork of
xteve-project/xteve — started because upstream hasn't
had a real release in about five years. This build modernizes the toolchain, fixes a long list of
real bugs (concurrency crashes, broken URLs, XSS, broken password hashing), gives the web UI a
full visual overhaul, and adds features ported from Threadfin.

This is a prerelease: functionally complete and passing CI (build, vet, tests, and the race
detector) on every commit, but new enough that it hasn't seen real-world mileage yet. Feedback and
issue reports are welcome.

Highlights

  • Concurrency crash fixed: the core channel database could panic under concurrent access
    (editing a mapping while a scheduled provider refresh runs, for example). Fixed and covered by
    a permanent regression test that runs under Go's race detector in CI.
  • Password hashing fixed: the previous scheme silently ignored its own per-user salt.
    Replaced with salted PBKDF2-HMAC-SHA256 (210,000 iterations) and constant-time comparison.
    Breaking change: delete authentication.json and recreate your user after upgrading from
    an older build.
  • Stored XSS fixed: channel names/group titles sourced from your M3U/XMLTV provider were
    rendered via innerHTML in several admin UI tables — fixed across the board.
  • No more unbounded network hangs: every HTTP client in the streaming/download/update path
    now has an appropriate timeout instead of &http.Client{} with none at all.
  • Full web UI visual refresh: new dark navy/cyan design system, a redesigned dashboard stat
    bar, a proper icon set (the old "Filter" nav icon was literally a heart), real mobile
    responsiveness, empty states, and toast notifications instead of blocking alert() popups.
  • Backup/failover channels, ported from Threadfin: up to 3 backup stream URLs per channel,
    with a lightweight reachability check that picks the first one that actually responds.
  • Jellyfin listed as a supported target alongside Plex and Emby.
  • Clearer EPG guidance for anyone outside the US: the "PMS" EPG source only ever surfaces
    Plex/Emby's own US/Canada-focused guide data — the UI now explains this and points non-US users
    at XEPG (bring-your-own-XMLTV) instead.
  • Fixed a broken guide URL the app itself displayed (hardcoded to the old xteve name instead
    of this fork's actual output filename).
  • Several correctness fixes cherry-picked from long-abandoned upstream PRs, plus a handful found
    during this fork's own audit (a Windows-only build-asset corruption bug, a silent-freeze UI race
    condition, a stale/nondeterministic embedded web-asset bundle that could ship an outdated UI in
    production builds).

Full, ongoing changelog: see README.md.

Upgrading from upstream xTeVe or an older xteve-reborn build

  • If you're on any build before the password-hashing fix, delete authentication.json in your
    config folder and recreate your admin user after upgrading.
  • Existing settings.json/xepg.json/playlists are otherwise compatible — this fork hasn't
    changed the on-disk data format.

Downloads

Prebuilt binaries below for Windows, Linux, and macOS (amd64 + arm64). No installer — unzip and
run. See the README
for build-from-source instructions if you'd rather build it yourself.

Requirements

Same as upstream xTeVe: a Plex Media Server, Emby, or Jellyfin instance to point this at, and
(optionally) ffmpeg or vlc on the host if you need the built-in buffer/transcoding options.