Testing if path_regexp works by returning debug response
instead of proxying. This will show:
1. If the path is matched correctly
2. What User-Agent header is received
Once confirmed working, uncomment reverse_proxy lines.
Complete architecture overhaul:
- Caddy is now the main proxy (port 8096)
- Only Xbox PlaybackInfo requests go to Python filter
- Everything else (WebSocket, streaming, API) goes directly to Jellyfin
Changes:
- Add Caddy service to docker-compose
- Use path_regexp for proper PlaybackInfo matching
- Remove method POST constraint (handled by path)
- Direct routing for non-Xbox requests
- WebSocket support for /socket endpoint
This fixes:
- 503 errors on normal requests
- 400 errors on WebSocket connections
- Performance issues from proxying everything
Architecture:
Client → Caddy → Check (path + User-Agent)
↓ Xbox PlaybackInfo → Python Filter → Jellyfin
↓ Everything else → Jellyfin
Caddyfile now:
- Runs on port 8097 (external)
- Proxies to xbox-filter:8096 (Python filter)
- Python filter handles all Xbox detection and codec filtering
- Python filter then proxies to jellyfin:8096 (internal)
Architecture:
Client :8097 → Caddy → :8096 Python Filter → :8096 Jellyfin
Use Caddy if you need additional features like:
- SSL/TLS termination
- Rate limiting
- Access control
- Advanced routing
Or use Python filter directly on port 8096 for simpler setup.
- Transparent reverse proxy that filters AV1/Opus for Xbox clients
- Detects Xbox via User-Agent header
- Docker-based solution, no Jellyfin code modifications needed
- Can be easily enabled/disabled without affecting Jellyfin updates