Added
- Home Landing Deck Continue Watching & Multi-Tab Navigation:
- Implemented interactive multi-tab landing deck on the Home screen supporting both
Continue WatchingandFavorites. - Added seamless
TabandShift+Tabkeyboard cycling between Continue Watching and Favorites tabs with instant row focus retention. - Added one-click/key direct resume (
Enter,Space, orP) on Continue Watching items, automatically configuring episode advancement, season positioning, and auto-play in Details view. - Formatted Continue Watching rows with title truncation, series episode badge (
S01E03), progress percentage, and remaining duration (45% · 24m left). - Added mouse support for clicking the landing deck header bar to switch tabs, and double-clicking items to play/open.
- Implemented interactive multi-tab landing deck on the Home screen supporting both
- Windows TrueColor & High-Contrast Terminal Theming:
- Enabled 24-bit TrueColor auto-detection by default on Windows 10/11 (
conhost.exe, Windows Terminal, PowerShell, CMD), ensuring Windows users receive rich Catppuccin themes out of the box. - Overhauled 16-color ANSI dark fallback palette (
Theme::fallback), replacing low-contrast dark blue and magenta with high-contrast cyan accents for borders, titles, headers, and highlights. - Added background row selection suppression in Settings Hub when modal popups (media player picker, theme picker, download directory input) are active, directing 100% of user focus to floating dialogs.
- Clamped popup picker minimum height to 7 rows, eliminating visual crowding on single-item selections.
- Elevated active selection surface styling to
theme.surface1with accent-highlighted cursor indicators (▌/▸) across lists and settings rows.
- Enabled 24-bit TrueColor auto-detection by default on Windows 10/11 (
- In-App Self-Update Engine Hardening:
- Added deterministic fallback download URL generation for GitHub release assets and
SHA256SUMSwhen unauthenticated API requests encounter HTTP 403 rate limits. - Added active in-flight self-update progress modal (
draw_updating_modal) featuring animated Braille spinners, version upgrade indicators (v{old} → v{new}), and real-time status steps. - Added environment-aware update modal actions: displays Homebrew upgrade instructions (
brew upgrade moviebox-tui) with[b]shortcut on Homebrew installations, Termux installer guidance on Android, and package manager notifications on read-only installations. - Added 5-iteration retry loop with bounded 1-second backoff in the Windows update helper script (
moviebox_update_helper.bat) to tolerate transient file locks from antivirus or Windows search indexers during binary replacement. - Cached full
Releasemetadata inAppStateand action pipeline, eliminating duplicate network queries between release checking and self-update invocation.
- Added deterministic fallback download URL generation for GitHub release assets and
- Empirical Performance Standards & Benchmark Testing Guidelines:
- Added strict performance verification standards requiring empirical before-and-after measurements (runtime latency, allocations, frame render latency, I/O syscalls, binary footprint) across hot paths.
- Documented standardized performance benchmark reporting format in
docs/testing.mdfor reproducible optimization audits.
- Centralized Poster Placeholder & UI Animation Widgets:
- Extracted reusable
render_poster_placeholderwidget tosrc/tui/widgets/poster.rs, standardizing placeholder containers, loading dots, and geometry clamping across Home and Details screens. - Centralized
loading_spinnerinsrc/tui/widgets, providing uniform ASCII fallback (..,...) on basic terminals and animated Braille frames on modern terminals. - Added zero-allocation cursor helpers (
cursor_prefix_str,cursor_column_offset,cursor_split_parts) toTextInputBuffer, replacing dynamic vector and string allocations with zero-copy slices during typing and cursor blinking. - Added
step_list_selectiontosrc/tui/state.rs, centralizing bounds-safe list stepping for PageUp and PageDown navigation across browse, theme, and favorites lists. - Added
clear_poster_cacheandclear_poster_protocolstoAppState, guaranteeing consistent flushing of in-flight requests, LRU image handles, and terminal protocols across provider switches and search resets.
- Extracted reusable
Removed
-
Poster Graphics Configuration & Halfblocks Engine:
- Removed Unicode Halfblocks poster engine (
▀/▄), eliminating low-resolution cell distortion, font scanlines, and terminal redraw lag during list scrolling. - Removed redundant
Poster Graphicstoggle from Settings Hub (/settings$\to$ Appearance) andconfig.json, delegating terminal graphics strictly to automatic native GPU protocol detection (Kitty, Sixel, iTerm2).
- Removed Unicode Halfblocks poster engine (
Fixed
-
Cross-Platform Handle Safety & Silent Failure Elimination:
- Fixed Windows file sharing violation (
ERROR_SHARING_VIOLATION) in multi-segment download assembly by explicitly flushing, syncing, and dropping the file write handle before executing destination renames. - Added overwrite handling on destination collisions during download finalization on Windows, preventing failed renames on re-downloaded media.
- Guarded
FavoritesManager::load_from_pathagainst premature corrupt file rotation on transient read errors, matching history and configuration persistence invariants. - Hardened Lua tracker script and state file directory initialization to return
Noneon directory creation or write failures rather than passing non-existent paths to media players. - Handled web browser launch failures in Settings Hub (
open::that), logging warnings and displaying the repository URL on headless or restricted environments. - Added
CREATE_NO_WINDOWflag (0x08000000) to the Windows update helper process spawn to eliminate console window flashes during in-app updates.
- Fixed Windows file sharing violation (
-
Resilient Cross-Platform Cache Clearing & In-Flight Task Isolation:
- Hardened
clear_all_cachewith recursive directory contents deletion, leaving the root directory node intact to preventERROR_ACCESS_DENIEDandERROR_SHARING_VIOLATIONfailures when Windows processes or shells hold folder handles. - Added Windows read-only attribute clearing before unlinking locked files.
- Included external Android subtitle cache directory (
~/storage/downloads/moviebox_subs) and temporary system subtitle caches in the cache purge sequence. - Connected
Action::ClearCachedirectly toself.request_tasks.cancel_all()and added cancellation guards inspawn_search_posters, preventing in-flight background requests from writing stale responses or posters immediately after cache clearance. - Propagated concrete filesystem
Result<(), String>toAction::CacheCleared, replacing hardcoded success notifications with real error reporting.
- Hardened
-
Unified Search Result Selection Background:
- Unified search result card selection highlight across the entire item slot (
item_area), eliminating fragmented background rendering between cursor indicators, posters, and text columns. - Removed redundant poster sub-area buffer clearing before image rendering, preventing selection background clipping and black gutter artifacts on the right edge of posters.
- Unified search result card selection highlight across the entire item slot (
-
High-Precision Playback Tracking & Race Elimination:
- Eliminated wall-clock race condition where process elapsed time overwrote exact seek/pause positions from
mpvandiina-cliLua trackers. - Hardened
moviebox_tracker.luawith latched completion: reaching $\ge 90%$ playback or EOF permanently latches completion, preventing shutdown events from reverting completed status. - Implemented atomic state file persistence in Lua using temporary files (
.tmp) and clean destination replacement for Windows and Unix platforms. - Handled unknown stream durations by writing JSON
null, preventing zero-duration calculations. - Pre-registered media playback on launch (
record_start), ensuring immediate watch history persistence for Android intent dispatchers (termux-open,am start) and app fallbacks. - Added self-healing recovery in
reconcile_from_dir: pre-seeded pending state files carry metadata (title,cover_url,stype,release_year), restoring new items into watch history even after sudden terminal exits or reboots. - Implemented smart series episode advancement: completing an episode automatically cues the next episode (
episode + 1or next season) on resume (Space/P) and in the Details view.
- Eliminated wall-clock race condition where process elapsed time overwrote exact seek/pause positions from
-
Details View Empty Stream Source Label Geometry:
- Replaced verbose empty stream message with a compact string (
No stream sources found on {provider} (Ctrl+P to switch provider, r to retry)), preventing awkward multi-line text wrapping on standard 80-column terminals.
- Replaced verbose empty stream message with a compact string (
-
Standardized 'No Art' Poster Containers Across Terminals:
- Replaced robot eyes and broken infinite loading spinners with clean, static, centered
No Artbordered blocks across search results and details screens on terminals without graphics support. - Preserved full-fidelity native GPU graphics rendering on supported terminals while standardizing card geometry and poster container boundaries across all platforms.
- Gated background poster network requests and CPU image decoding strictly behind
image_supported, eliminating redundant network bandwidth and CPU cycles on standard terminals.
- Replaced robot eyes and broken infinite loading spinners with clean, static, centered
Changed
-
Provider Switching Shortcut:
- Scoped
Ctrl+Pstrictly to Streaming Mode for provider cycling, eliminating redundantCtrl+Phandling in TV and Addon modes. - Streamlined
/configas a direct alias for/settings.
- Scoped
-
Pruned Redundant Theme Slash Command:
- Removed standalone
/themeslash command, parser routing, and auto-suggestions; theme selection and visual palette swatches are managed directly within the interactive Settings Hub (/settings$\to$ Appearance $\to$ Theme).
- Removed standalone
-
Discover Categories Landing Card UX:
-
Clean Segmented Landing Deck Header Styling:
- Replaced crowded decorative star (
★) and bracket ([ ]) glyphs with a clean, segmented tab bar header (Continue Watching │ Favorites (Tab)). - Streamlined overflow row formatting to centered minimalist pill indicators (
+N more · /historyand+N more · /favorites). - Streamlined
Discover & Quick Categoriescard: elevated/browsecommand to a right-aligned header badge ([ /browse ]), eliminated redundant/browse ·row prefixes, and adapted category rows dynamically between Streaming and Addon modes. - Added direct mouse click navigation to discover categories, routing clicks to preset browse queries or the addon catalog menu.
- Replaced crowded decorative star (
-
Command Dispatch & Cache Lookup Optimization:
- Unified
ParsedCommandandSlashCommandinto a single canonical enum, eliminating duplicate type definitions across command dispatch and testing. - Streamlined image disk cache lookups (
get_namespaced_image_cache), eliminating 6-iteration fallback namespace scans across unrelated provider directories on cache misses. - Replaced duplicate
is_termux_envin player module withcrate::updater::artifact::is_termux_environment.
- Unified
-
Automation Workflows & Installer Hardening:
- Added bounded execution timeouts (
timeout-minutes) across all CI and release pipeline jobs to prevent runner hangs. - Accelerated release preflight by eliminating redundant cross-compilation target toolchain downloads during source packaging.
- Streamlined Homebrew formula updater (
homebrew.yml) by parsing the release's attestedSHA256SUMSmanifest directly with strict 64-char hex validation, eliminating redundant ~50MB archive downloads. - Added on-device binary execution smoke tests to
install.ps1and enhancedinstall.sherror diagnostics with API version resolution fallbacks.
- Added bounded execution timeouts (
-
Documentation & User Guide Streamlining:
- Overhauled root
README.mdinto a developer-focused technical guide, pruning marketing copy, redundant comparison tables, and promotional buzzwords. - Added structured media player setup guide with package manager commands (
brew,apt,winget). - Updated macOS Homebrew installation with explicit
brew truststep required by Homebrew 6.0+ for third-party taps. - Streamlined quickstart section to reference in-app interactive help (
?) anddocs/controls.md, preventing documentation drift.
- Overhauled root
-
Streamlined Test Architecture & High-Signal Test Suite:
- Consolidated unit assertions for file stem sanitization, MD5 hashing, atomic writing, and badge rendering directly into their respective modules (
src/download.rs,src/cache.rs,src/tui/widgets/badge.rs). - Pruned 10 redundant, weightless, and duplicate test suites (
player_integration.rs,url_security.rs,download_integration.rs,m3u_integration.rs,cache_lifecycle.rs,real_acceptance.rs,grand_user_journey.rs,history_reconciliation.rs,version_upgrade_e2e.rs), reducing integration test files from 20 to 9 focused suites while preserving complete regression coverage. - Hardened
.omp/AGENTS.mdanddocs/testing.mdwith strict engineering rules rejecting weightless tests, duplicate test layers, and monolithic multi-phase journey tests. - Aligned update modal keyboard tests with modal input isolation, verifying keystrokes do not fall through to background search results while the dialog is active.
- Consolidated unit assertions for file stem sanitization, MD5 hashing, atomic writing, and badge rendering directly into their respective modules (
Fixed
-
Responsive Text Sizing & Layout Truncation:
- Raised Details footer split threshold (
DETAILS_FOOTER_SPLIT_THRESHOLD) to 106 columns, ensuring shortcuts use a clean 2-row layout on terminals between 80 and 105 columns without clipping. - Omitted
[Ctrl+P] Providerhint from the Details footer when in Addon mode or viewing addon streams, recovering 18 columns of footer space. - Added line-width budgeting to Details metadata: audios and extra metadata (Genre, Director, Cast) now dynamically truncate to available row width without wrapping beyond their allocated lines.
- Synchronized Settings tab hit-testing (
category_tab_rects) with compact rendering (popup_area.width < 58), resolving mouse click target divergence on compact terminals. - Added dynamic subtext and label truncation in Settings rows, preventing 2-row Paragraph wrapping and off-screen line displacement.
- Replaced hardcoded path truncation in Settings download directory with dynamic middle truncation (
truncate_middle_width), maximizing displayed path length while fitting compact rows. - Added dynamic description truncation to Home discover categories card, preventing overflow on narrow (50–54 col) screens.
- Added responsive compact labels (
[Try Provider (P)]and[Clear (c)]) and narrowed separation to No-Results buttons when terminal width is under 56 columns. - Removed obsolete
Ctrl+Phint from search bar mode pill in Addon mode, replacing it with[Addon Mode]. - Added available width clamping to non-landing search bar placeholders and status messages to prevent 1-row Paragraph wrapping.
- Omitted redundant media type separator in search results metadata when terminal width is under 36 columns and release year is present, keeping provider badges intact.
- Budgeted list entry lengths in TV Playlists and Addon Manager popups to fit within inner popup bounds regardless of installed badge counts.
- Raised Help menu two-column threshold to 102 columns to prevent keybinding description truncation.
- Added compact title formatting to download gauge when width is under 60 columns.
- Added compact button formatting (
[u] Update [o] Web [Esc] Back) to Update Modal on terminals under 60 columns. - Added compact header formatting to Updating progress modal when inner width is under 42 columns.
- Added title boundary protection to
ModalFrame, truncating overly long titles to preserve border integrity. - Eliminated dark rectangular halo artifact around modal popups by removing block-level background color overrides from
ModalFrame, allowing rounded borders to cleanly render against transparent and custom terminal backgrounds without pixel spillage.
- Raised Details footer split threshold (
-
Resilient Configuration & Accurate Metadata:
- Safeguarded user TV playlists (
tv_config.json) and HTTP addons (addons_config.json): replaced destructive error-swallowing deletion with timestamped.corrupt.{timestamp}file rotation and sanitized logging on JSON parse failures. - Eliminated fabricated S01E01 fallback in addon metadata adapter, accurately reporting empty series episodes when an upstream catalog entry lacks episode records instead of injecting unplayable dummy data.
- Safeguarded user TV playlists (
-
Discover Card Layout & Truncation:
- Fixed horizontal text clipping on discover card category descriptions by adjusting
margins_lento account for visual pointer and margin cell budgets. - Suppressed discover card rendering while search suggestions dropdown is open, preventing visual overlap.
- Fixed horizontal text clipping on discover card category descriptions by adjusting
-
Update Modal Input Isolation & Event Guards:
- Prevented keystroke hijacking: deferred blocking update modal presentation while the user is actively typing in the search bar (
InputMode::Editing), ensuring keys (u,o,Esc) never trigger unintended update actions. - Added input lock during in-flight updates (
is_updating), consuming all keyboard and mouse events to prevent mid-upgrade process termination or disk corruption.
- Prevented keystroke hijacking: deferred blocking update modal presentation while the user is actively typing in the search bar (
-
Comprehensive Multi-Platform Player Detection & Dynamic Settings Refresh:
- Expanded Windows MPV and VLC candidate discovery across executable-adjacent directories (
.\mpv.exe,.\vlc.exe), WinGet Packages (%LOCALAPPDATA%\Microsoft\WinGet\Packages), userDownloadsandDesktopextractions,mpv.net(mpvnet.exe,mpv.net),mpv.com, Scoop apps and shims, Chocolatey, portable drive roots (C:\mpv,C:\vlc,C:\tools), and Windows RegistryApp PathsandEnvironment\Path. - Expanded macOS and Linux discovery across Nix profiles (
~/.nix-profile/bin,/run/current-system/sw/bin), Homebrew, MacPorts, user.local/bin, and user/system Flatpak exports. - Replaced permanent negative caching (
OnceLock<Option<String>>) with non-negative path caching across MPV, VLC, IINA, and Android Intent openers, ensuring players installed after cold start are discovered immediately. - Added non-destructive dynamic player detection merging to Settings Hub (
ToggleSettingsPopup,ShowSettingsPopup), player selection activation, and value cycling, refreshingavailable_playersin real time without requiring an app restart.
- Expanded Windows MPV and VLC candidate discovery across executable-adjacent directories (
-
Direct Playback & Header Compatibility:
- Eliminated vestigial in-stream "Open with" popup that blocked playback when only VLC was installed, routing playback directly to the preferred compatible player.
- Prevented silent player overrides: when a user explicitly selects a default player (e.g. VLC) that cannot satisfy stream authentication headers (e.g. MovieBox signed DASH manifests), the app now halts playback and warns the user with actionable detected alternatives instead of silently launching an unselected player.
- Added structured
PlaybackResolutionengine with dynamic context-aware notifications across playback resolution and download operations.
-
Terminal Graphics Probe Leak:
- Prevented raw Kitty APC escape sequence leak (
Gi=31...) on macOSTerminal.appand legacy non-graphics consoles by skipping graphics stdio probes. - Removed unsafe mid-session stdio graphics re-probing on
FocusChangeevents.
- Prevented raw Kitty APC escape sequence leak (
-
High-Performance Player Detection Engine (
src/player.rs):- Centralized OS executable probing (
mpv,vlc,IINA) into a singleprobe_player_executableengine, stripping ~150 lines of duplicate path traversal. - Added static caching (
OnceLock) toIINAresolution and Android Termux Intent detection, eliminating repeated expensive filesystem IO and PATH lookups during playback launches. - Expanded candidate resolution: added macOS MacPorts (
/opt/local/bin/*) and standard/bin/*locations. - Aligned installer (
install.sh,install.ps1) player detection with the app engine, explicitly probing standard/Applications/*.appandC:\Program Filesdeployments so GUI installations are correctly discovered immediately post-install.
- Centralized OS executable probing (
-
Responsive Mobile Installer Headers (
install.sh&install.ps1):- Implemented dynamic terminal column detection (
tput cols,stty size, and$COLUMNSininstall.sh;$Host.UI.RawUI.WindowSize.Widthininstall.ps1) with automatic multi-tier banner sizing. - Eliminated ASCII art banner wrapping and visual corruption on narrow mobile viewports (e.g. Android Termux portrait mode at 40–55 columns) by rendering an adaptive 31-column compact half-block banner (
█▀▄▀█...) and dynamic horizontal centering.
- Implemented dynamic terminal column detection (
-
Android Termux Static-PIE & TLS Alignment:
- Linked
aarch64-unknown-linux-musltarget as static-PIE (-C relocation-model=pic -C link-arg=-pie) to produceET_DYN(ELFe_type: 0x0003) binaries accepted by Android Bionic's/system/bin/linker64, resolving runtime failure (unexpected e_type: 2). - Added 64-byte
PT_TLSalignment anchor insrc/main.rsand post-build ELF program header alignment in.github/workflows/release.ymlto satisfy Android Bionic's ARM64 TLS segment minimum alignment validation. - Added automated ELF
e_typeandPT_TLSvalidation checks to.github/workflows/release.ymland a post-installation execution smoke test toinstall.sh.
- Linked
Removed
- Pruned unused legacy type aliases (
SeasonInfo,EpisodeInfo,StreamResource,StreamMirror) insrc/models.rs. - Removed dead
util_rowstruct field fromLandingRowsinsrc/tui/screens/home.rs. - Removed vestigial
ShowPlaybackPickerandShowPlayerPickeraction variants and playback picker state fields in favor of direct compatible player dispatch. - Removed unreferenced static screenshot assets (
assets/), reducing repository clone size by ~1.3MB. - Redundant Slash Commands:
- Pruned 10+ legacy slash commands (
/download-dir,/clear-cache,/update,/github,/probe,/toggle-update,/toggle-bdix,/toggle-streaming,/toggle-tv,/toggle-addons,/enable-*,/disable-*) superseded by the interactive Settings Hub. - Removed 300+ lines of redundant command execution and file write probing in
src/tui/app/search.rs. - Removed duplicate unreachable
Ctrl+Ukey handling insrc/tui/app/keyboard.rs.
- Pruned 10+ legacy slash commands (