From e6244adc0bd78e7d436c3165c3416c4df14e869b Mon Sep 17 00:00:00 2001 From: SergeantPanda Date: Wed, 15 Jul 2026 22:16:00 +0000 Subject: [PATCH] docs: Remove mentions of specific clients as they could change and isn't fully inclusive anyway. --- CHANGELOG.md | 2 +- apps/timeshift/tests/test_views.py | 9 +++------ apps/timeshift/views.py | 8 ++------ 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 400bd639..6e09e1fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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/?session_id=...` for headerless video players. `DELETE /api/catchup/sessions//` 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. diff --git a/apps/timeshift/tests/test_views.py b/apps/timeshift/tests/test_views.py index 649d78dc..04302613 100644 --- a/apps/timeshift/tests/test_views.py +++ b/apps/timeshift/tests/test_views.py @@ -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 ```` 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") diff --git a/apps/timeshift/views.py b/apps/timeshift/views.py index c82927f0..c83c6100 100644 --- a/apps/timeshift/views.py +++ b/apps/timeshift/views.py @@ -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=&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", "")