Added
- Scoop Package Manager Distribution:
- Added native Scoop manifest in
bucket/moviebox-tui.jsonsupporting Windows x64 and arm64 architectures with automated hash verification. - Automated Scoop manifest synchronization alongside Homebrew in
.github/workflows/manifests.ymlfrom releaseSHA256SUMS. - Added
InstallationEnvironment::Scoopdetection insrc/updater/apply.rswith update prompt shortcuts ([s]).
- Added native Scoop manifest in
- Adaptive Stream Resolution Picker:
- Decomposed multi-bitrate DASH streams in
src/providers/moviebox/adapt.rsinto selectable quality rows (1080p,720p,480p). - Threaded quality constraints to player builders, injecting
--ytdl-formatformpv/IINAand--adaptive-maxheightforVLC.
- Decomposed multi-bitrate DASH streams in
- Custom Player Executable Path Configuration:
- Added
vlc_path,mpv_path, andiina_pathfields toConfiginsrc/config.rsandsrc/tui/state.rs. - Supported persisted custom player paths with automatic static path cache invalidation upon configuration updates.
- Added
Changed
- Streamlined Download Failure Notifications:
- Replaced verbose, truncated DASH download failure guidance with terse, actionable commands (
Run: winget install yt-dlp.yt-dlp Gyan.FFmpeg). - Removed misleading "Partial file preserved" prefix on pre-download failures in
src/tui/app/download.rs. - Scaled notification toast card width to the widest line across multi-line messages in
src/tui/overlay.rs. - Threaded selected stream resolution constraint (
bestvideo[height<={h}]...) toyt-dlpinsrc/tui/app/download.rs, ensuring DASH downloads fetch the highlighted quality rather than forcing 1080p.
- Replaced verbose, truncated DASH download failure guidance with terse, actionable commands (
Fixed
- Streaming Proxy & Sidecar Lifecycle:
- Enforced fail-closed target host verification in
src/proxy.rs, rejecting requests with403 Forbiddeniftarget_hostis missing or unverified. - Detached proxy sidecar child handles via
std::mem::forget, preventing defunct zombie process leaks on Unix. - Removed 60s request deadline on upstream proxy client and added 128KB
tokio::io::BufWriterfor sustained chunk throughput. - Deferred status line emission until manifest sizing is verified, returning
502 Bad Gatewayon oversized payloads.
- Enforced fail-closed target host verification in
- Download Engine & Subprocess Safety:
- Re-canonicalized created download directories within background tasks in
src/tui/app/download.rs, verifying real paths against download roots to prevent symlink traversal. - Sanitized provider HTTP header keys and values passed to yt-dlp, stripping CRLF and control bytes to prevent header splitting.
- Removed global 60s transfer timeout and buffered single-connection file writes with 256KB
tokio::io::BufWriter. - Added fast-fail fallback to single-stream downloads when segment workers receive
200 OKresponses. - Sanitized download failure notices via
DownloadError::user_message(), replacing raw error dumps with clean user guidance.
- Re-canonicalized created download directories within background tasks in
- Media Playback & Progress Tracking:
- Configured high-throughput stream buffering in
src/player.rsformpvandIINA(8s cushion, 120s readahead, 256MB demuxer cache) to eliminate rebuffering loops. - Set 10s network cache floor and
nearoptimaladaptive logic forVLC, preventing playback stalls on DASH jitter. - Recorded elapsed watch progress for VLC code 1 exits and routed IINA through wall-clock progress tracking.
- Configured high-throughput stream buffering in
- TUI Layout & Modal Ergonomics:
- Deduplicated movie title repetition in Details screen streams table (
src/tui/screens/details.rs), displaying source/CDN instead of identical media titles across rows. - Streamlined download progress dock in
src/tui/app/run.rsto a sleek, minimal header showing queue position and metrics without redundant title repetition. - Isolated TV mode search dispatch in
src/tui/app/requests.rsand balanced landing search input width to 48 columns. - Auto-sized
/settingsmodal height dynamically to category row counts and balanced modal width to 60 columns. - Dimmed background deck items, suggestions, and provider pills when modal popups are active in
src/tui/screens/home.rs. - Reorganized Details screen footer action hierarchy, lowered split threshold to 80 columns, and synchronized mouse hitboxes.
- Factored
ListState::offset()into Details pane row hitboxes for scrolled season and episode lists. - Unified streams table highlight symbol under modals in
src/tui/screens/details.rs, preventing table header and column horizontal shifts. - Reset
show_overview_modalon mode transitions insrc/tui/app/tv.rsand top-aligned metadata paragraphs insrc/tui/screens/details.rs. - Streamlined TV playlist management popup to match Addons mode design with dynamic sizing and clean status indicators.
- Replaced
Action::ToggleTvModewith idempotentAction::SwitchToTvModeand protectedCtrl+T/Ctrl+Sagainst unintended flips.
- Deduplicated movie title repetition in Details screen streams table (
- Network, Upstream & Concurrency:
- Bound parallel sibling provider queries in
get_ext_captions(src/service.rs) with individual 8s timeouts to prevent stalls. - Tracked in-pool cached stream tasks in
request_tasks.streamsinsrc/tui/app/requests.rs, ensuring active tasks cancel on navigation. - Removed 30s deadline and added 3-attempt exponential backoff chunk retry for release binary downloads in
src/updater/download.rs. - Added 5 MiB ceiling to
fetch_poster_bytesinsrc/service.rsand referenced dynamicCARGO_PKG_VERSIONinAPP_HTTP_USER_AGENT.
- Bound parallel sibling provider queries in
Changed
- Direct Download Triggering:
- Streamlined download initiation by starting stream and season downloads immediately upon pressing
don the details screen. - Pruned intermediate confirmation dialogs, transient state flags (
show_episode_download_confirm), and confirmation render helpers.
- Streamlined download initiation by starting stream and season downloads immediately upon pressing
- Deep Module Architecture & Task Encapsulation:
- Encapsulated async task lifecycle in
RequestTaskHandles(src/tui/app/mod.rs), consolidating cancellation, task spawning, and abort handle tracking behind dedicated dispatch methods. - Encapsulated download destination directory creation, UNC normalization, and sandbox boundary checks into
prepare_target_dirinsrc/tui/app/download.rs. - Added
render_modal_frameinsrc/tui/overlay.rscombining area clearing withClear, inner rectangle calculation, and modal frame border rendering.
- Encapsulated async task lifecycle in
- Terminal Image Picker & Opener Caching:
- Consolidated fallback and custom cell size image picker creation in
src/tui/app/run.rsthroughcreate_picker_with_font_size. - Cached Android opener detection via
std::sync::LazyLockinsrc/player.rs.
- Consolidated fallback and custom cell size image picker creation in
- CI/CD Quality Gates & Tooling:
- Added Linux musl target compilation verification in
.github/workflows/ci.yml. - Migrated CI test matrix to parallel, process-isolated
cargo-nextestexecution.
- Added Linux musl target compilation verification in
- Documentation Overhaul:
- Streamlined all user and technical guides in
docs/(players.md,controls.md,tv-mode.md,config.md,addons-mode.md,providers.md,cross-platform.md,cache.md,downloads.md), cutting redundant tables and dense text walls. - Documented environment variables (
MOVIEBOX_LOG,MOVIEBOX_IMAGE_PROTOCOL,MOVIEBOX_CELL_SIZE,NO_COLOR).
- Streamlined all user and technical guides in