mirror of
https://github.com/Dispatcharr/Dispatcharr.git
synced 2026-07-18 17:16:26 +00:00
Adds native catch-up/timeshift replay for Xtream Codes providers through the same HTTPStreamReader transport pipeline as live TV. Timeshift proxy (apps/timeshift/): - URL cascade: 3 candidate timestamp formats per provider, per-account format cache for fast-forward seek performance - MPEG-TS preamble stripping (shared with HTTPStreamReader) - Stats integration: timeshift viewers appear on /stats with TIMESHIFT badge - Auth via hmac.compare_digest on XC password Catchup detection — denormalized for zero-cost output queries: - Stream.is_catchup + Stream.catchup_days populated at XC import time - Channel.has_catchup + Channel.catchup_days + Channel.catchup_provider_stream_id rolled up via ChannelStream post_save signal (UI path) and explicit SQL after bulk_create (import path) - _xc_channel_entry() reads denormalized fields instead of per-channel custom_properties JSON introspection (eliminates N+1 queries) - Migration 0038 backfills existing data via raw SQL XC API enhancements: - server_info.timezone + start/end + time_now use configured timezone (triple consistency rule — fixes wrong-programme-plays bug) - Dynamic has_archive flag + auto prev_days for catch-up channels - XMLTV timestamps rewritten to local timezone for catch-up clients HTTPStreamReader extended (apps/proxy/live_proxy/input/http_streamer.py): - 1 MB pipe buffer via fcntl F_SETPIPE_SZ (eliminates producer/consumer ping-pong that halved throughput) - Pre-opened response= for URL cascade workflows - strip_ts_preamble= for XC servers emitting PHP warnings before TS - find_ts_sync() as shared utility - Builds on upstream O_NONBLOCK + select() write loop Provider stream_id lookup order: - stream_xc() and xc_get_epg() try internal Channel.id first, fall back to provider stream_id only when needed (avoids unconditional query on every request) Also includes: - VOD provider cascade in stream_vod() — iterates all M3U relations by priority when first provider is at capacity - Defensive null-safety: custom_sid: None → "" in get_live_streams, get_vod_streams, get_vod_info, get_series_info (fixes iPlayTV crash on JSON null for string fields) - Timeshift settings UI (timezone selector, debug toggle) - StreamConnectionCard violet TIMESHIFT badge - Orphan cleanup skips timeshift_* virtual channels
0 lines
Python
0 lines
Python