Files
tuliprox/backend/app/Cargo.toml
T
euzuandGitHub 91f6c57159 Fix/merge live and vod recording (#876)
feat(dvr)!: unify live and VOD/series recording into one recoverable DVR

Merge fix/merge_live_and_vod_recording into develop.

- One recording queue for scheduled live captures and VOD/series transfers,
  with a shared transition graph, provider-slot scheduling, resumable HTTP
  transfers (strong ETag / Last-Modified validation) and ffmpeg live capture.
- Crash-recoverable persistence: B+Tree repository with a journal-first
  recovery history; one file can be shared by several library entries.
- Admission checks quota and disk on request, at transfer start (real size)
  and before an entry attaches to a finished file; idempotent requests.
- REST is command-only; state reaches clients via owner-filtered WebSocket
  snapshots.
- Deleting a recording removes the file once no entry holds it; removing an
  entry keeps a finished file and cleans up orphaned partials.
- User ids derive from the configured username (web:/api:); the identity
  registry is gone.
- Spanish locale added; ru/ar completed; locale parity test.

BREAKING CHANGE: `video.download` is now `video.recording` (nested
`recording` keys move up, `download_priority`/`recording_priority` become
`priority`); old configs fail to load with a migration hint.
BREAKING CHANGE: `/api/v1/file/download*` and `/file/record` are removed in
favour of `/api/v1/recording/*`.
BREAKING CHANGE: `download.*` and `recording.write` permissions are replaced
by `recording.read|create|manage|delete`; tokens from before the change must
re-authenticate.
BREAKING CHANGE: the old recording queue does not migrate; existing
`identity_registry.json` is ignored.
2026-10-04 16:02:55 +02:00

121 lines
4.4 KiB
TOML

[package]
name = "tuliprox"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
default-run = "tuliprox"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[lints]
workspace = true
[package.metadata.cargo-machete]
# `paste` is pulled in by the `create_bitset!` declarative macro and
# expanded at the call site; cargo-machete's heuristic cannot see through it.
ignored = ["paste"]
[dependencies]
lol_html = "2.9.0"
shared = { workspace = true }
tuliprox-core = { workspace = true }
tuliprox-hls = { workspace = true }
tuliprox-iptv = { workspace = true }
tuliprox-library = { workspace = true }
tuliprox-messaging = { workspace = true }
tuliprox-processing = { workspace = true }
tuliprox-auth = { workspace = true }
tuliprox-config-loader = { workspace = true }
tuliprox-dvr = { workspace = true }
tuliprox-repository = { workspace = true }
tuliprox-session = { workspace = true }
tuliprox-media-server = { workspace = true }
tuliprox-metadata = { workspace = true }
tuliprox-mpegts = { workspace = true }
serde.workspace = true
serde-saphyr.workspace = true
serde_json = { workspace = true, features = ["raw_value", "preserve_order"] }
quick-xml = { version = "0.41", features = ["async-tokio", "serialize"] }
regex.workspace = true
clap = { version = "4.6.6", features = ["derive"] }
reqwest = { version = "0.13.4", features = ["json", "stream", "rustls", "socks", "form", "query"] }
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.1"
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", default-features = false, features = ["aws_lc_rs"] }
futures.workspace = true
pest.workspace = true
thiserror.workspace = true
aes = "0.8.4"
mime = "0.3.17"
log.workspace = true
env_logger = "0.11.11"
dotenvy = { workspace = true }
rand = "0.9.5"
fastrand.workspace = true
blake3.workspace = true
bytes.workspace = true
tokio-stream = { version = "0.1.19", features = ["sync"] }
tokio = { workspace = true, features = ["rt-multi-thread", "parking_lot", "fs", "process", "signal", "time", "macros"] }
tokio-util = { version = "0.7.19", features = ["io", "io-util"] }
tempfile = "3.27.0"
base64.workspace = true
sha2.workspace = true
paste.workspace = true
brotli.workspace = true
smallvec = "1.15.2"
notify = "8.2.0"
arc-swap.workspace = true
dashmap.workspace = true
hyper = "1.11.0"
hyper-util = "0.1.20"
socket2 = { version = "0.6.5", features = ["all"] }
async-compression = { version = "0.4.43", features = ["tokio", "brotli", "deflate", "gzip", "zlib", "zstd"] }
chrono-tz = "0.10.4"
mime_guess = "2.0.5"
crc32fast = "1.5.1"
http-body-util = "0.1.5"
strum.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]
windows-sys = { version = "0.61.2", features = ["Win32_Foundation", "Win32_Storage_FileSystem", "Win32_System_ProcessStatus", "Win32_System_SystemInformation", "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 = "10.0.3", features = ["build"] }
[dev-dependencies]
tuliprox-processing = { workspace = true, features = ["test-support"] }
tuliprox-hls = { workspace = true, features = ["test-support"] }
# The migration and playlist-stream tests build legacy v2 databases and
# sorted-index sidecars by hand; those builders live in the engine.
tuliprox-btree = { workspace = true, features = ["test-support"] }
# HLS tests assert on the segment render/finalize counters.
tuliprox-mpegts = { workspace = true, features = ["test-support"] }
# API tests build a GeoIp that answers a fixed country.
tuliprox-repository = { workspace = true, features = ["test-support"] }
tokio = { workspace = true, features = ["test-util", "macros"] }
rcgen = "0.14.9"
rustls = "0.23.43"
tokio-rustls = "0.26.4"
[[bin]]
name = "flags-builder"
path = "src/tools/flags_builder.rs"