Files
ytplayer/alt/rust/README.md
2026-10-14 01:17:30 +08:00

2.6 KiB

Rust backend experiment

Drop-in web backend experiment using Axum/Tokio, Tower HTTP compression, reqwest/rustls and SQLite. The existing frontend/ is copied at image build time and is not modified.

Run locally

From the repository root:

cargo run --manifest-path alt/rust/Cargo.toml

By default the service serves ./frontend when ./public does not exist. Set PUBLIC_DIR, PORT, DB_PATH, MEDIA_DIR, MEDIA_VOLUME_MARKER, MEDIA_CACHE_MAX_BYTES, YTDLP_PATH, FFMPEG_PATH, FFPROBE_PATH, APP_VERSION, ASSET_HASHING, and ASSET_SYNC as needed. yt-dlp, ffmpeg and ffprobe must be on PATH for live search/streams/media jobs.

The UI is available at http://localhost:3000/; /api/version is the health endpoint. Set BUILD_TAG only for the legacy ASSET_HASHING=0 rollback mode. Normal mode computes the tag from runtime assets and stamps each CSS/JS URL.

Container

From the repository root, docker build -f alt/rust/Dockerfile -t ytplayer-rust . or docker compose -f alt/rust/docker-compose.yml up --build. Compose exposes container port 3000 on external dokploy-network and persists SQLite/media data in /app/data; it intentionally has no host port mapping or proxy labels.

Compare and benchmark

node alt/compare.mjs <bun-base-url> [rust-url] compares status, JSON shape, selected headers, static stamps, and byte-range responses. Set TEST_MEDIA_ID to a cached 11-character id for stream/download/range checks. node alt/rust/browser-smoke.mjs <rust-url> opens the actual UI in Chromium; set SMOKE_QUERY to a cached query to exercise search and card rendering. The benchmark command and measured local results are in BENCH.md.

Implemented surface and known gaps

Static SPA delivery, asset manifest/version/SW stamping, compression, search with in-memory/SQLite cache + InnerTube and yt-dlp fallback, stream resolution/warming, YouTube range proxy, validated basic media caching, download preparation/range transfer, and local profile/user persistence are implemented. The notes/admin/P2P/party/remote/upload families and saved-profile password/key protection are intentionally not in this experimental build. Media caching deliberately skips HEVC optimization, advanced retry/backoff lanes, full LRU free-space guards, upload media, chapters, and transcode policy parity; use the production Bun backend for those requirements.

The cache job is detached from request lifetimes, but the current validation is a reduced safety gate (H.264 + AAC, complete demux, size/duration checks) and is not yet the production validation suite. This is an A/B prototype, not a production replacement.