docs: Remove mentions of specific clients as they could change and isn't fully inclusive anyway.

This commit is contained in:
SergeantPanda 2026-07-15 22:16:00 +00:00
parent b475bbc07b
commit e6244adc0b
3 changed files with 6 additions and 13 deletions

View file

@ -11,7 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **Native XZ decompression for EPG sources and uploaded M3U playlists.** `.xz`-compressed XMLTV and M3U files are now decompressed using Python's stdlib `lzma` module. EPG ingestion detects XZ via magic bytes, file extension (including compound names like `.xml.xz`), or MIME type; uploaded M3U `.xz` playlists stream line-by-line like `.gz`. The `/data/epgs` auto-import scanner now includes `.xz` files alongside `.xml`, `.gz`, and `.zip`. (Closes #1414) — Thanks [@MotWakorb](https://github.com/MotWakorb)
- **XC catch-up (timeshift) support**. Adds a native `/timeshift/{user}/{pass}/{stream_id}/{timestamp}/{duration}.ts` endpoint that proxies replay sessions from an Xtream Codes provider to clients such as iPlayTV (Apple TV) and TiviMate. Auth reuses the same `xc_password` custom-property the live `/live/.../{id}.ts` endpoint already uses. Catch-up sessions appear on the Stats page in dedicated connection cards (separate from live and VOD) and respect per-channel access rules. (Closes #133) — Thanks [@cedric-marcoux](https://github.com/cedric-marcoux)
- **Query-style catch-up compatibility.** Clients such as Open-TV and Fred TV can use `/streaming/timeshift.php` query-string requests in addition to the path-style endpoint. — Thanks [@dillardblom](https://github.com/dillardblom)
- **Query-style catch-up compatibility.** Accepts `/streaming/timeshift.php` query-string catch-up requests in addition to the path-style endpoint. — Thanks [@dillardblom](https://github.com/dillardblom)
- **REST catch-up API for native apps.** `POST /api/catchup/sessions/` (JWT or API key) mints a server-side playback session and returns a tokenless `playback_url` at `/proxy/catchup/<channel_uuid>?session_id=...` for headerless video players. `DELETE /api/catchup/sessions/<session_id>/` ends the session. OpenAPI docs cover handshake and idle TTL behaviour.
- **Catch-up admin APIs.** `GET /proxy/catchup/stats/` lists active catch-up viewers; `POST /proxy/catchup/programs/` returns batch EPG metadata for those sessions; `POST /proxy/catchup/stop_client/` stops a viewer from the admin UI.
- **Catch-up Stats UI.** Dedicated catch-up connection cards show channel logo, programme preview (watched/remaining timeline), playback position, bitrate, and a stop button. Stats refresh in real time via WebSocket (`timeshift_stats`) with desktop notifications when catch-up sessions start or end.

View file

@ -863,12 +863,9 @@ class TimeshiftProxyTimestampWiringTests(TestCase):
class TimeshiftProxyQueryRoutingTests(TestCase):
"""Regression test for dispatcharr_timeshift#10: some clients (e.g.
Open-TV / Fred TV) build catch-up requests in QUERY layout
(``/streaming/timeshift.php?...``) rather than PATH layout. Before this
fix, no urlpattern matched that path, so the request silently fell
through to the frontend's ``<path:unused_path>`` catch-all and got served
``index.html`` (200 OK, wrong content) instead of reaching the proxy."""
"""QUERY-layout ``/streaming/timeshift.php`` must resolve to
``timeshift_proxy_query``; PATH-layout ``/timeshift/...`` must still
resolve to ``timeshift_proxy``."""
def test_query_style_path_resolves_to_timeshift_proxy_query(self):
match = resolve("/streaming/timeshift.php")

View file

@ -102,7 +102,7 @@ def _finalize_timeshift_response(response):
def timeshift_proxy(request, username, password, stream_id, timestamp, duration): # noqa: ARG001 stream_id
"""Proxy an XC catch-up request to the provider with multi-stream failover.
URL shape (iPlayTV / TiviMate PATH layout):
URL shape (XC catch-up clients):
``stream_id``: EPG channel number (ignored here).
``duration``: Dispatcharr ``Channel.id`` (XC API exposes channel.id as stream_id).
``timestamp``: UTC programme start (``YYYY-MM-DD:HH-MM`` or XC colon form
@ -120,14 +120,10 @@ def timeshift_proxy(request, username, password, stream_id, timestamp, duration)
def timeshift_proxy_query(request):
"""Proxy an XC catch-up request submitted in QUERY layout.
URL shape (Open-TV / Fred TV): ``/streaming/timeshift.php?username=...
URL shape (XC catch-up clients): ``/streaming/timeshift.php?username=...
&password=...&stream=<Channel.id>&start=<UTC programme start>&duration=...``
(``duration`` here is the EPG-minutes hint some clients send; unused, same
as ``stream_id`` in the PATH-layout ``timeshift_proxy`` above).
Mirrors ``timeshift_proxy`` so clients that construct catch-up requests in
QUERY style are routed to the proxy instead of falling through to the
frontend catch-all route (see upstream issue dispatcharr_timeshift#10).
"""
username = request.GET.get("username", "")
password = request.GET.get("password", "")