6.1 KiB
xTeVe
M3U Proxy for Plex DVR and Emby Live TV.
Documentation for setup and configuration is here.
Donation
Requirements
Plex
- Plex Media Server (1.11.1.4730 or newer)
- Plex Client with DVR support
- Plex Pass
Emby
- Emby Server (3.5.3.0 or newer)
- Emby Client with Live-TV support
- Emby Premiere
Features
Files
- Merge external M3U files
- Merge external XMLTV files
- Automatic M3U and XMLTV update
- M3U and XMLTV export
Channel management
- Filtering streams
- Channel mapping
- Channel order
- Channel logos
- Channel categories
Streaming
- Buffer with HLS / M3U8 support
- Re-streaming
- Number of tuners adjustable
- Compatible with Plex / Emby EPG
Project Analysis (UI + Operations)
The core architecture is strong: a Go backend with websocket-driven UI updates, filesystem-based state, and very low runtime overhead. The weakest points are mostly operational and UX-focused:
- UI was historically utility-first and desktop-biased, with limited responsive behavior and visual hierarchy.
- Container usage was documented externally but there was no first-party Dockerfile/compose setup in this repository.
- Static web assets are generated into
src/webUI.go, which works, but creates large diffs and a heavier edit/build cycle.
Recommended next technical improvements
- Replace generated
src/webUI.gowith Goembedfor simpler static asset management and cleaner PR diffs. - Add CI checks (
go test ./..., build on Linux/arm64/amd64, docker build smoke test). - Add a dedicated health endpoint (for example
/healthz) to decouple health checks from HDHomeRun endpoints. - Add integration tests around websocket commands that mutate settings/files to reduce regression risk.
Container-First Run (Included In This Repo)
Build image
docker build -t xteve:local .
Run with Docker Compose (bridge mode)
docker compose up -d
Compose file: docker-compose.yml
Persistent config volume: ./docker-data/config:/xteve/config
Run with Docker Compose (host networking, Linux recommended for discovery)
docker compose -f docker-compose.host.yml up -d
Host networking improves LAN discovery behavior (SSDP/DLNA) for Plex/Emby in many setups.
Container environment variables
XTEVE_CONFIG(default:/xteve/config)XTEVE_PORT(default:34400)
Image details
- Multi-stage build (Go builder + minimal Alpine runtime)
- Runs as non-root user (
xteve) - Built-in healthcheck against
http://127.0.0.1:${XTEVE_PORT}/lineup_status.json
Downloads v2 | 64 Bit only
64 Bit Intel / AMD
64 Bit ARM
Recommended Docker Image (Linux 64 Bit)
Thanks to @alturismo and @LeeD for creating the Docker Images.
Created by alturismo:
xTeVe
xTeVe / Guide2go
xTeVe / Guide2go / owi2plex
Including:
- Guide2go: XMLTV grabber for Schedules Direct
- owi2plex: XMLTV file grabber for Enigma receivers
Created by LeeD:
xTeVe / Guide2go / Zap2XML
Including:
- Guide2go: XMLTV grabber for Schedules Direct
- Zap2XML: Perl based zap2it XMLTV grabber
- Bash: A Unix / Linux shell
- Crond: Daemon to execute scheduled commands
- Perl: Programming language
xTeVe Beta branch
New features and bug fixes are only available in beta branch. Only after successful testing are they are merged into the master branch.
It is not recommended to use the beta version in a production system.
With the command line argument branch the Git Branch can be changed. xTeVe must be started via the terminal.
Switch from master to beta branch:
xteve -branch beta
...
[xTeVe] GitHub: https://github.com/xteve-project
[xTeVe] Git Branch: beta [xteve-project]
...
Switch from beta to master branch:
xteve -branch master
...
[xTeVe] GitHub: https://github.com/xteve-project
[xTeVe] Git Branch: master [xteve-project]
...
When the branch is changed, an update is only performed if there is a new version and the update function is activated in the settings.
Build from source code [Go / Golang]
Requirements
- Go (go1.16.2 or newer)
Dependencies
Build
- Download source code
- Install dependencies
go get github.com/koron/go-ssdp
go get github.com/gorilla/websocket
go get github.com/kardianos/osext
- Build xTeVe
go build xteve.go
Fork without pull request 📣
When creating a fork, the xTeVe GitHub account must be changed from the source code or the update function disabled. Future updates of the xteve-project would update your fork. 😉
xteve.go - Line: 29
var GitHub = GitHubStruct{Branch: "master", User: "xteve-project", Repo: "xTeVe-Downloads", Update: true}
/*
Branch: GitHub Branch
User: GitHub Username
Repo: GitHub Repository
Update: Automatic updates from the GitHub repository [true|false]
*/

