Files
tuliprox/backend/Cargo.toml
T
euzuandGitHub 9e83d24864 Feature/optimizations (#777)
* 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.
2026-06-15 14:09:31 +02:00

119 lines
3.7 KiB
TOML

[package]
name = "tuliprox"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
lol_html = "2.9.0"
handlebars = "6.4.1"
shared = { version = "3", path = "../shared" }
serde.workspace = true
serde-saphyr.workspace = true
serde_json = { workspace = true, features = ["raw_value", "preserve_order"] }
quick-xml = { version = "0.39.4", features = ["async-tokio", "serialize"] }
regex.workspace = true
clap = { version = "4.6.1", features = ["derive"] }
reqwest = { version = "0.13.4", features = ["json", "stream", "rustls", "socks", "form"] }
url.workspace = true
chrono.workspace = true
iana-time-zone = "0.1.65"
cron.workspace = true
axum = { version = "0.8.9" , features = ["macros", "default", "ws"]}
serde_html_form = "0.4.0"
tower = "0.5.3"
tower-http = { version = "0.6.11", features = ["cors", "auth", "fs", "compression-full", "trace"] }
tower_governor = { version = "0.8.0", features = ["axum"] }
jsonwebtoken = { version = "10.4.0", features = ["rust_crypto"] }
rust-argon2 = "3.0.0"
futures.workspace = true
path-clean.workspace = true
pest.workspace = true
pest_derive.workspace = true
thiserror.workspace = true
aes = "0.8.4"
ctr = "0.9.2"
deunicode.workspace = true
mime = "0.3.17"
log.workspace = true
env_logger = "0.11.10"
rmp-serde = "1.3.1"
rand = "0.9.4"
fastrand.workspace = true
rpassword = "7.5.4"
flate2 = "1.1.9"
blake3.workspace = true
bytes.workspace = true
tokio-stream = { version = "0.1.18", features = ["sync"] }
tokio = { workspace = true, features = ["rt-multi-thread", "parking_lot", "fs", "process", "signal", "time", "macros"] }
#console-subscriber = "0"
#tracing = "0.1"
#tracing-subscriber = { version = "0.3", features = ["fmt", "env-filter"] }
tokio-util = { version = "0.7.18", features = ["io", "io-util"] }
tempfile = "3.27.0"
filetime = "0.2.29"
strsim = "0.11.1"
rphonetic = "3.0.6"
rayon = "1.12.0"
base64.workspace = true
paste.workspace = true
indexmap.workspace = true
parking_lot = "0.12.5"
lz4_flex.workspace = true
brotli.workspace = true
memmap2 = "0.9.10"
smallvec = "1.15.1"
fs2 = "0.4.3"
notify = "8.2.0"
arc-swap.workspace = true
dashmap.workspace = true
hyper = "1.10.1"
hyper-util = "0.1.20"
socket2 = { version = "0.6.4", features = ["all"] }
async-compression = { version = "0.4.42", features = ["tokio", "gzip", "zlib"] }
chrono-tz = "0.10.4"
zeroize.workspace = true
uuid = { version = "1.23.3", features = ["v4"] }
fancy-regex = "0.17.0"
mime_guess = "2.0.5"
crc32fast = "1.5.0"
memchr = "2.8.1"
http-body-util = "0.1.3"
lru = "0.12"
ipnet = "2"
strum.workspace = true
strum_macros.workspace = true
[target.'cfg(unix)'.dependencies]
libc = "0.2"
[target.'cfg(not(target_os = "linux"))'.dependencies]
sysinfo = { version = "0.38.4", default-features = false, features = ["system", "network"] }
[target.'cfg(target_os = "windows")'.dependencies]
winapi = { version = "0.3", features = ["psapi", "minwindef", "processthreadsapi", "sysinfoapi", "fileapi"] }
windows-sys = { version = "0.61.2", features = ["Win32_Foundation", "Win32_System_Threading"] }
#[target.'cfg(target_os = "linux")'.dependencies]
#mimalloc = "0.1"
#[target.'cfg(not(target_env = "msvc"))'.dependencies]
#tikv-jemallocator = "0.6"
# tikv-jemallocator = { version = "*", features = ["profiling", "unprefixed_malloc_on_supported_platforms"] }
[build-dependencies]
vergen = { version = "9.1.0", features = ["build"] }
[dev-dependencies]
tokio = { workspace = true, features = ["test-util", "macros"] }
rcgen = "0.14.8"
rustls = "0.23.40"
tokio-rustls = "0.26.4"
[features]
proxy-auth-regression = []
[[bin]]
name = "flags_builder"
path = "src/tools/flags_builder.rs"