mirror of
https://github.com/euzu/tuliprox.git
synced 2026-09-26 19:12:25 +02:00
* perf: binary-search EPG programme lookup Replaces the linear position() scan with a binary search via partition_point for EPG programmes. Reduces complexity to O(log p). * perf: cache interned PlaylistItemType label Avoids repetitive hash-map lookups during sorting and filtering. The five fixed labels are now interned once via OnceLock and returned as a cheap Arc clone. * perf: avoid per-event String allocation in web-UI XMLTV parser Uses borrowed Cow types instead of allocating a new String for every element name. Tracks the active text state using a small TextTag enum. * perf: throttle per-chunk download control poll Throttles the control_signal lock polling to a 200ms interval on multi-GB downloads to prevent CPU thrashing. Immediate actions (pause/cancel) remain guaranteed via control_notify. * perf: pre-size filtered channel buffers in apply_filter_to_playlist Pre-allocates the filtered channel vector based on the source group length. Eliminates step-by-step reallocations on large playlists. * fix: surface playlist cache load failures instead of silent empty fallback Replaces silent error swallowing with real error logging (distinguishing missing files from corruption) while preserving the empty fallback behavior. * perf: remove redundant first drain loop in get_remote_content_as_file Removes a dead, redundant loop. The stream body is now consumed only once, allowing the idle timeout to protect the transfer correctly. * perf: back off instead of busy-spinning on empty client-stream chunks Introduces a short Sleep backoff (Poll::Pending) when a provider sends continuous empty keep-alive chunks. Prevents the CPU from spinning hot. * perf: make library orphan cleanup linear instead of O(n^2) Reduces the complexity of cleaning up orphaned entries from O(n^2) to linear O(n). Loads the metadata library only once and pre-computes partitions. * perf: indexed batched merge for series expansion instead of O(n^2) scans Replaces expensive O(n^2) scans during series expansion with index-based batch processing. Builds temporary lookup indexes and merges groups linearly. * perf: pre-size group flatten buffers to reduce reallocation churn Pre-allocates target merge vectors and category indexes to eliminate repeated memory reallocations when flattening large target playlists. * perf: stream custom provider playlist endpoint instead of materializing it Switches from full in-memory materialization to lazy conversion and streaming of JSON/binary responses. Massively reduces the memory footprint. * refactor: centralize InputType batch/family checks behind enum helpers Moves scattered matches! checks for M3u/Xtream types into centralized enum helpers (is_batch(), etc.) to prevent logic drift. * refactor: centralize XMLTV tag/attribute literals into named constants Replaces hardcoded inline strings in the XMLTV parser with named constants (EPG_TAG_TITLE, etc.) as a single source of truth. * refactor: derive GeoIpUpdateError Display/Error via thiserror Replaces manual Display and Error implementations with the thiserror macro, allowing new error variants to self-document their formatting. * refactor: attach per-cluster facts to XtreamCluster instead of scattered matches Centralizes redundant API actions and collection name mappings directly onto the XtreamCluster struct instead of using scattered match blocks. * refactor: centralize PlaylistItemType video/series classification Introduces is_video() / is_series() on the enum to unify duplicate matches! checks across filters, probes, and tracking modules. * feat: add per-stage summary logs to VOD/series resolve queueing Adds a concise debug summary per processing stage (total counters and elapsed time) to make hot-path diagnostics easier without raising the log level. * refactor: generate ItemField get/set from a single direct-field list Uses a callback macro to synchronously generate both getter and setter blocks for directly-bound fields (Name, Url, etc.) from a single master list. * refactor: derive input-type routing from a single capability descriptor Bundles InputType behaviors (backends, connection rules) into a single capabilities() descriptor to prevent bugs when adding new variants. * refactor: derive output-format routing from a single capability descriptor Centralizes output format features (filter, EPG, and cache support) into a single TargetCapabilities descriptor instead of spreading logic across no-op match arms.