mirror of
https://github.com/euzu/tuliprox.git
synced 2026-10-16 12:52:24 +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.
119 lines
3.7 KiB
TOML
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"
|