Two coupled fixes that make catch-up play the requested programme:
1. Try the PATH catch-up form (/timeshift/.../{start}/{id}.ts) BEFORE the
timeshift.php query form. Empirical testing showed some XC providers
return the LIVE stream on the query form (HTTP 200, silently ignoring
`start`) — a valid MPEG-TS indistinguishable from a real archive, so the
cascade accepted it and the user always got live content. The PATH form
actually seeks. Candidate ordering now lives in
build_timeshift_candidate_urls() with the full rationale.
2. Strict-UTC XC API surface + single proxy-time timezone conversion:
- xc_get_epg start/end always UTC, server_info.timezone always "UTC",
time_now UTC — the timezone triple is consistently UTC.
- Removed the global default_timezone setting and the
_convert_xmltv_to_local_timezone rewrite entirely.
- The proxy converts the client's UTC timestamp to the SERVING provider's
own zone (server_info.timezone captured on account refresh, read from
the account's default profile) right before building the upstream URL —
DST-correct via ZoneInfo, no-op for UTC/unknown zones. Verified against
a real provider: it interprets the URL timestamp as its LOCAL wall
clock, so pure UTC pass-through seeks 1-2h off.
- EPG duration lookup keeps the ORIGINAL UTC timestamp (programmes are
stored in UTC) — exactly one conversion in the whole chain.
Also per review feedback:
- Removed the debug_logging toggle — verbose timeshift logging now follows
the standard logger DEBUG level (DISPATCHARR_LOG_LEVEL).
- Removed the dead default_language setting (never read anywhere; the EPG
lang field is hardcoded). TIMESHIFT_DEFAULTS is down to
xmltv_prev_days_override, and the Settings UI shows that single field
with accurate help text.
- Validate the timestamp up front (400 on malformed input) instead of
forwarding it verbatim into the upstream URL.
- Redact the upstream URL in the connection-error log (requests exceptions
embed the full URL, which carries XC credentials).
- URL-encode XC credentials in both URL builders.
- Request identity encoding upstream (the TS-sync peek reads raw bytes).
- Poll the stop key on the 5-second heartbeat cadence instead of every 100
chunks (~25 MB), so stream-limit terminations free the provider slot fast.
- New tests: proxy timestamp wiring (converted value reaches the URL
builder, original UTC value reaches the duration lookup), _redact_url,
decisive 3xx break (anti ban), invalid timestamp rejection; deflaked the
format-cache promotion test (django cache persists across runs).
|
||
|---|---|---|
| .github | ||
| .idea | ||
| apps | ||
| core | ||
| dispatcharr | ||
| docker | ||
| docs/images | ||
| frontend | ||
| scripts | ||
| tests | ||
| .dockerignore | ||
| .gitattributes | ||
| .gitignore | ||
| .python-version | ||
| CHANGELOG.md | ||
| CONTRIBUTING.md | ||
| debian_install.sh | ||
| fixtures.json | ||
| LICENSE | ||
| manage.py | ||
| Plugin_repo.md | ||
| Plugins.md | ||
| pyproject.toml | ||
| README.md | ||
| version.py | ||
🎬 Dispatcharr — Your Ultimate IPTV & Stream Management Companion
📖 What is Dispatcharr?
Dispatcharr (pronounced like "dispatcher") is an open-source powerhouse for managing IPTV streams, EPG data, and VOD content with elegance and control.
Born from necessity and built with passion, it started as a personal project by OkinawaBoss and evolved with contributions from legends like dekzter, SergeantPanda and Bucatini.
Think of Dispatcharr as the *arr family's IPTV cousin — simple, smart, and designed for streamers who want reliability and flexibility.
🎯 What Can I Do With Dispatcharr?
Dispatcharr empowers you with complete IPTV control. Here are some real-world scenarios:
💡 Consolidate Multiple IPTV Sources
Combine streams from multiple providers into a single interface. Manage, filter, and organize thousands of channels with ease.
📺 Integrate with Media Centers
Use HDHomeRun emulation to add virtual tuners to Plex, Emby, or Jellyfin. They'll discover Dispatcharr as a live TV source and can record programs directly to their own DVR libraries.
📡 Create a Personal TV Ecosystem
Merge live TV channels with custom EPG guides. Generate XMLTV schedules or use auto-matching to align channels with existing program data. Export as M3U, Xtream Codes API, or HDHomeRun device.
🔧 Transcode & Optimize Streams
Configure output profiles with FFmpeg transcoding to optimize streams for different clients (reduce bandwidth, standardize formats, or add audio normalization).
🔐 Centralize VPN Access
Run Dispatcharr through a VPN container (like Gluetun) so all streams route through a single VPN connection. Your clients access geo-blocked content without needing individual VPNs, reducing bandwidth overhead and simplifying network management.
🚀 Monitor & Manage in Real-Time
Track active streams, client connections, and bandwidth usage with live statistics. Monitor buffering events and stream quality. Automatic failover keeps viewers connected when streams fail—seamlessly switching to backup sources without interruption.
👥 Share Access Safely
Create multiple user accounts with granular permissions. Share streams via M3U playlists or Xtream Codes API while controlling which users access which channels, profiles, or features. Network-based access restrictions available for additional security.
🔌 Extend with Plugins
Build custom integrations using Dispatcharr's robust plugin system. Automate tasks, connect to external services, or add entirely new workflows.
✨ Why You'll Love Dispatcharr
✅ Stream Proxy & Relay — Intercept and proxy IPTV streams with real-time client management
✅ M3U & Xtream Codes — Import, filter, and organize playlists with multiple backend support
✅ EPG Matching & Generation — Auto-match EPG to channels or generate custom TV guides
✅ Video on Demand — Stream movies and TV series with rich metadata and IMDB/TMDB integration
✅ Multi-Format Output — Export as M3U, XMLTV EPG, Xtream Codes API, or HDHomeRun device
✅ Real-Time Monitoring — Live connection stats, bandwidth tracking, and automatic failover
✅ Stream Profiles — Configure how Dispatcharr connects to backend streams (VLC, FFmpeg, Streamlink, or custom commands)
✅ Output Profiles — Transcode what stream profiles deliver before it reaches the client (e.g. AC3 for media servers, AAC for browsers) with fMP4 or MPEG-TS container selection
✅ Multi-User & Access Control — Granular permissions and network-based access restrictions
✅ Plugin System — Extend functionality with custom plugins for automation and integrations
✅ Fully Self-Hosted — Total control, no third-party dependencies
Screenshots
🛠️ Troubleshooting & Help
- General help? Visit Dispatcharr Docs
- Community support? Join our Discord
🚀 Get Started in Minutes
🐳 Quick Start with Docker (Recommended)
docker pull ghcr.io/dispatcharr/dispatcharr:latest
docker run -d \
-p 9191:9191 \
--name dispatcharr \
-v dispatcharr_data:/data \
ghcr.io/dispatcharr/dispatcharr:latest
Customize ports and volumes to fit your setup.
🐋 Docker Compose Options
| Use Case | File | Description |
|---|---|---|
| All-in-One Deployment | docker-compose.aio.yml | ⭐ Recommended! A simple, all-in-one solution — everything runs in a single container for quick setup. |
| Modular Deployment | docker-compose.yml | Separate containers for Dispatcharr, Celery, Redis, and Postgres — perfect if you want more granular control. |
| Development Environment | docker-compose.dev.yml | Developer-friendly setup with pre-configured ports and settings for contributing and testing. |
🛠️ Building from Source
⚠️ Warning: Not officially supported — but if you're here, you know what you're doing!
If you are running a Debian-based OS, use the debian_install.sh script. For other OS, contribute a script and we’ll add it!
🤝 Want to Contribute?
We welcome PRs, issues, ideas, and suggestions!
- Prior to contributing, please read the CONTRIBUTING.md
Whether it's writing docs, squashing bugs, or building new features, your contribution matters! 🙋
📚 Documentation & Roadmap
- 📖 Documentation: Dispatcharr Docs
Upcoming Features (in no particular order):
- 🎬 VOD Management Enhancements — Granular metadata control and cleanup of unwanted VOD content
- 📁 Media Library — Import local files and serve them over XC API
- 👥 Enhanced User Management — Customizable XC API output per user account
- 🔌 Fallback Videos — Automatic fallback content when channels are unavailable
❤️ Shoutouts
A huge thank you to all the incredible open-source projects and libraries that power Dispatcharr. We stand on the shoulders of giants!
✉️ Connect With Us
Have a question? Want to suggest a feature? Just want to say hi?
➡️ Open an issue or reach out on Discord.
💖 Support Dispatcharr
Open Collective provides a transparent way for anyone who finds value in Dispatcharr to support things like: • Infrastructure costs (Domains, Servers, etc.) • Apple Developer Program and Google Play Developer accounts • Helping contributors dedicate more time to improving the project
Support is completely optional, and Dispatcharr will always remain free and open-source.
⚖️ License & Legal
Dispatcharr is licensed under GNU AGPL v3.0: For full license details, see LICENSE.
Dispatcharr is a trademark of the Dispatcharr project. Use of the Dispatcharr name or logo requires permission from the maintainers.