github mesamirh/MovieBox-Tui v0.1.19

latest releases: v0.1.26, v0.1.25, v0.1.24...
one month ago

Added

  • VLC MovieBox DASH and Signed Cookie Streaming Compatibility:

    • Added a detached loopback HTTP sidecar proxy (--proxy-for-vlc) enabling VLC playback for MovieBox MPEG-DASH and MP4 streams protected by AWS CloudFront signed cookies (CloudFront-Policy, CloudFront-Signature, CloudFront-Key-Pair-Id).
    • Implemented hierarchical path proxy routing (/https/<host>/path and /http/<host>/path) in src/proxy.rs; VLC's adaptive demuxer resolves relative segment URLs against the proxy path, eliminating query-string stripping that caused 400 Bad Request on DASH segment fetches.
    • Added in-flight DASH manifest rewriter targeting origin CDN hosts to rewrite relative and absolute segment URLs to route through the local proxy.
    • Added zero-copy chunked streaming using reqwest::Response::bytes_stream() for constant-memory chunk forwarding without buffering full segments in RAM.
    • Configured platform process detachment via process_group(0) on Unix and DETACHED_PROCESS with CREATE_NEW_PROCESS_GROUP on Windows, ensuring streaming survives terminal window closure.
    • Updated supports_headers and header_capable_players in src/player.rs to allow VLC as a supported player for all streaming sources.
  • Android Intent MovieBox Playback via Loopback Proxy:

    • Extended loopback HTTP sidecar proxy (src/proxy.rs) to support PlayerKind::AndroidIntent for streams requiring CloudFront signed cookies.
    • Enabled AndroidIntent in supports_headers and header_capable_players, allowing external players on Android (VLC, MX Player, Just Player) to play MovieBox streams without header compatibility errors.
    • Added proxy route /sub/<encoded_url> with CORS headers and proper MIME typing (application/x-subrip, text/vtt), injecting WebVTT adaptation sets into MPEG-DASH manifests.

Fixed

  • Crash Hardening & Bounds Safety:
    • Fixed potential usize arithmetic underflow on empty search results in navigation handler (.saturating_sub(1)).
    • Fixed potential usize arithmetic underflow on empty player picker navigation.
    • Guarded JWT token split indexing with safe .get(1) pattern matching in MovieBox session parser.
    • Hardened string slicing against non-ASCII UTF-8 character boundary hazards in DhakaFlix title/year parsing.
    • Bounded help modal line-window slicing index to prevent out-of-bounds panics under constrained terminal heights.
    • Clamped confirmation dialog action-row coordinate calculation to modal bounds on small screens.
  • UI Layout & Mouse Synchronization:
    • Extracted shared split_main_and_download layout helper, eliminating constraint divergence between mouse hit testing and rendering passes.
    • Synchronized details screen workflow step mouse hit-detection with dynamic text layout bounds.
    • Replaced byte length count with display Unicode width for notification toast badge column derivations.
    • Fixed addon manager badge column calculation to derive from visual Unicode width.
    • Fixed provider selection popup list scroll state retention in Home screen rendering.
  • Concurrency, Architecture & Network Safety:
    • Resolved architectural layer violation where provider modules directly imported text utilities from TUI presentation layer.
    • Tracked pagination search, stream pool initialization, and episode prefetch tasks in RequestTaskHandles for prompt cancellation on navigation.
    • Offloaded synchronous filesystem writes and directory creations in playback, download, and startup paths to background threads.
    • Throttled high-frequency download progress channel event dispatch to 100ms intervals.
    • Filtered forwarded Stremio addon stream HTTP headers against strict allowlist to prevent SSRF or credential leakage.
    • Hardened network URL reachability probe to enforce HTTP 2xx/3xx status verification.
    • Enforced response body size limits on remote IPTV M3U playlists (15 MB).
    • Propagated DhakaFlix network errors instead of silently swallowing empty streams.
    • Fixed next_provider navigation to handle currently disabled active providers correctly.
    • Consolidated /exit slash command in autocomplete candidate suggestions.
    • Centralized BDIX codec, resolution, and audio language heuristics into shared module.
    • Pruned unused structs and dead code in CircleFTP and Addon models.
  • VLC Sidecar Proxy Correctness:
    • Replaced reqwest::Client::timeout(30s) (a hard deadline over the entire response body) with connect_timeout(15s) only; per-chunk idle timeout (60s) now signals stalled transfers without terminating long-running video streams mid-playback.
    • Introduced a ConnectionGuard RAII wrapper ensuring active_connections is atomically decremented even when a connection handler task panics, eliminating a counter leak that kept the sidecar alive indefinitely under 24/7 operation.
    • Set watchdog idle threshold to 10 minutes (600s) with a 15-second polling interval; removed parent-PID liveness polling — the sidecar is fully detached and exits cleanly after 10 minutes of inactivity with no active connections.
    • Fixed host-authority extraction to preserve explicit port numbers (e.g. cdn.example.com:8080) in DASH manifest segment URL rewriting; previously the port was stripped, routing manifest-relative segments to the wrong CDN endpoint and causing 400/403 errors.
    • Capped HTTP request-line and header reads at 8 KiB per line and 64 headers per request, preventing unbounded read_line memory growth from malformed or adversarial clients.
    • Added child.wait() after child.kill() on proxy spawn failure to reap the child process and avoid zombie accumulation.
  • Search Poster Loader: Cleared in_flight_posters when navigating back from the Details screen (GoBack → Screen::Details path) so that poster fetch tasks cancelled mid-flight no longer leave permanent "Loading..." placeholders on the next visit.
  • Stream Cache TTL: set_provider_stream_cache_typed now parses DateLessThan / AWS:EpochTime from the CloudFront-Policy Base64 payload embedded in release Cookie headers and caps the on-disk cache TTL to min(2h, cf_expiry_remaining) (floor 60s), preventing stale cached stream URLs from being served after CloudFront signed-cookie expiry.
  • Process & Task Lifecycle Resilience:
    • Configured kill_on_drop(true) on tokio::process::Command when spawning yt-dlp in start_resilient_download, preventing orphaned download worker processes from continuing in the background if tasks are cancelled.
    • Added JoinHandle tracking for active download workers in RequestTaskHandles, pairing it with an asynchronous watcher that catches background worker panics and dispatches Action::DownloadFailed to prevent permanent state lockup.
    • Hardened loopback proxy sidecar accept loop to catch transient I/O and network errors (EMFILE, ECONNABORTED, EINTR) with a 50ms backoff sleep, preventing premature daemon exit under socket pressure.
    • Ensured fetch_cancel Arc is rotated to a fresh instance and active stream/details fetch tasks are explicitly aborted upon navigating back from the Details screen (GoBack), preventing subsequent searches from being poisoned by aborted states.
    • Wrapped Action::CheckForUpdates in a strict 15-second timeout, preventing indefinite UI loading states during transient network drops or GitHub API stalls.
    • Threaded explicit task cancellation across RequestTaskHandles, download cancellation tokens, and search fetch tokens upon receiving Action::Quit, ensuring all background I/O operations terminate before the terminal exits.
    • Replaced detached spawned tasks in AddonClient::fetch_addon_streams with direct futures via futures::future::join_all, ensuring that cancelled stream lookups immediately drop pending addon network requests.
    • Added sandbox environment detection for Flatpak (FLATPAK_ID, /.flatpak-info) and Snap (SNAP) in src/updater, preventing corrupt in-app self-update writes on read-only mountpoints and guiding users to their package managers.
    • Staged update binaries in the directory adjacent to current_exe rather than a temporary filesystem mount, ensuring atomic replacement across distinct storage partitions (EXDEV).
    • Fixed Windows update helper double-spawn race condition by ensuring the parent process terminates immediately without invoking redundant exec/spawn wrappers.
    • Added root uid check (libc::getuid() == 0) before probing /system/bin/am on Android outside Termux, preventing SELinux exit code 126 crashes on modern Android releases.
    • Gated Android /storage/downloads subtitle path probing with is_termux_environment(), preventing non-Android systems with ~/storage from misrouting subtitle files.
    • Updated config_dir() and data_dir() to fall back to std::env::temp_dir() with an explicit warning when user directories cannot be resolved.
    • Updated install.sh to provide clear guidance when invoked on Windows MINGW/MSYS/Cygwin environments, and hardened SHA256 checksum parsing against leading asterisk formatting.
  • TUI & Render Hot-Path Efficiency:
    • Added id_index (HashSet<(String, String, i64)>) to FavoritesManager, eliminating $O(N)$ linear scans across visible result cards on every render frame.
    • Bound window title recomputations in contextual_title() to dirty frame updates or initial launches, eliminating per-tick allocations.
    • Added active screen and editing mode guards to search suggestion debounce in Action::Tick, skipping redundant string operations when not actively typing queries.
    • Consolidated duplicate theme picker keyboard navigation actions (Up, Down, Home, End, PageUp, PageDown) into a single state change handler.
    • Pruned unused scaffolding structs (UiState, CatalogState, PlaybackState, DownloadState) from src/tui/state.rs.
    • Pruned obsolete and unused action variants (ProbeTerminal, ShowSettingsPopup, CloseSettingsPopup) from src/tui/action.rs and consolidated settings handlers.
    • Consolidated all video playback launches through canonical LaunchPlayback actions, removing misleading and redundant LaunchMpv aliases.
    • Prioritized termux-am ahead of termux-open in Android opener probing to preserve HTTP request headers and subtitle arguments.

Changed

  • Symmetrical Popup and Picker Margin Alignment:

    • Eliminated lopsided right-side dead space across all floating popup pickers (Theme Picker, Streaming Sources, Media Player, Subtitles, Catalog Browse, and Provider Popup), aligning borders to provide equal horizontal padding on both sides (│ content │).
    • Corrected picker_layout width calculation to content_width.saturating_add(2) (accounting for left and right border glyphs) rather than over-allocating + 6, eliminating 4 phantom trailing empty columns.
    • Standardized symmetrical 2-space padding across all popup picker lines and hit-testing rectangles in src/tui/app/mouse.rs.
    • Updated overlay::picker to automatically apply uniform 2-space left and right margins to dynamic items.
  • Linux ARM64 Production Portability & Installer Hardening:

    • Removed Android Bionic TLS assembly hacks (__bionic_tls_align_anchor) and Python PT_TLS byte-patching from the generic Linux aarch64-unknown-linux-musl target, isolating Android Bionic requirements to the dedicated build-android (aarch64-linux-android) NDK pipeline.
    • Configured -C link-arg=-Wl,-z,max-page-size=65536 on aarch64-unknown-linux-musl, aligning ELF PT_LOAD segments to 64KB to guarantee execution compatibility across 4KB kernels (Raspberry Pi 4B), 16KB kernels (Raspberry Pi 5 / BCM2712), and 64KB kernels (AWS Graviton, enterprise Linux ARM64).
    • Added a QEMU (qemu-user-static) execution smoke test gate in the release CI pipeline for aarch64-unknown-linux-musl, actively booting the compiled AArch64 Linux binary and verifying --version before packaging.
    • Enhanced install.sh to proactively detect 32-bit Raspbian userland (getconf LONG_BIT == 32) on 64-bit ARM hardware, providing an actionable native cargo install path rather than attempting incompatible 64-bit binary execution.
    • Improved install.sh smoke test failure diagnostics to capture and print explicit non-zero exit codes when binary execution fails without output.
  • Modal and Overlay Declutter — Keyhint Footer Removal:

    • Removed redundant boilerplate footer keyhint bars (render_modal_footer / render_footer) and top divider borders across all modal dialogs and overlay pickers (Settings, Streaming Sources, Themes, Players, Subtitles, TV Config, Addon Manager, Provider popup).
    • Removed duplicate and truncated popup title headers on option-selection pickers (Media Player, Themes, Sources) so they cleanly present options without repeating row labels.
    • Compacted Settings modal vertical geometry to snap directly to the search bar row position and eliminated dead spacer gaps between category tabs and content rows.
    • Added background dimming overlays behind all modal pickers to prevent background text bleed-through.
    • Streamlined Settings rows into single-line entries with aligned label and value spans, removing redundant explanatory subtexts.
    • Expanded Settings → Content Modes from a coarse global toggle to individual provider controls covering MovieBox, 4KHDHub, CircleFTP (BDIX), and DhakaFlix (BDIX) alongside Streaming and Live TV mode toggles.
    • Added an active provider guard ensuring at least one streaming provider remains enabled at all times and automatically falling back to the next available source if the currently active provider is disabled.
    • Preserved backward compatibility with legacy bdix_enabled configs by automatically migrating enabled BDIX state to both CircleFTP and DhakaFlix flags on startup.
  • Automatic BDIX Network Availability Probing:

    • Added non-blocking HTTP network probes (probe_url) on first application startup with a 3-second timeout against CircleFTP and DhakaFlix endpoints, automatically enabling accessible optical mirrors on local networks while disabling unreachable ones.
    • Added a dedicated "Re-check BDIX Network" action in Settings → Maintenance allowing users to manually re-probe and refresh BDIX provider availability at any time.
  • Watch History Clearing and Item Management:

    • Added a dedicated "Clear Watch History" action row in Settings → Maintenance, allowing users to wipe all watch history records and saved playback positions in one action.
    • Added individual item deletion via d and Delete keybindings when browsing /history results or the Home screen Resume deck, updating disk storage and notifying immediately.
  • Unified Streaming and Stremio Addons Engine:

    • Merged separate Addon Mode into standard Streaming Mode; Stremio Addons (ProviderKind::Addons) is now a first-class streaming provider selectable directly via Ctrl+P.
    • Simplified application state model by removing AppMode::Addon and AppState.is_addon_mode, making navigation two-mode (Streaming and Live TV).
    • Routed Addon Manager dialog access through /config when the active provider is Addons.
  • Theme Color and Contrast Hardening:

    • Added typed background and surface color helper methods on Theme (surface0_color, surface1_color, surface2_color, crust_color, mantle_color) extracting underlying foreground colors with graceful base fallback.
    • Replaced hardcoded Catppuccin Mocha RGB values across badge, home screen pill, confirmation modal, and settings input backgrounds with dynamic theme color helpers, ensuring correct contrast across all dark and light themes.
    • Fixed resolution badge text on active rows to dynamically derive contrast foreground from theme.crust_color() rather than hardcoded Mocha crust RGB (17, 17, 27).
    • Fixed inactive modal badge text style from theme.muted to theme.overlay1, eliminating low-contrast illegibility on surface1 backgrounds.
    • Hardened Catppuccin Latte light theme tokens (sapphire, lavender, highlight, success, shortcut, rating, teal), achieving WCAG AA contrast (≥4.5:1 on base, ≥3.0:1 on surface1) without sacrificing hue recognition.
  • Terminal Color Quantization and Standard Detection Fixes:

    • Fixed rgb_to_xterm256 color quantization to compute squared Euclidean distance to both the nearest 6×6×6 cube entry and the nearest 24-step grayscale ramp, preventing dark and low-saturation palette backgrounds (such as Mocha base, Nord base, and Dracula base) from crushing to pure black or wrong-hue cube cells on 256-color terminals.
    • Aligned NO_COLOR environment variable checks with the no-color.org specification by checking non-empty values (is_ok_and(|v| !v.is_empty())), ensuring empty strings do not disable color support.
    • Constrained VTE_VERSION truecolor capability detection to VTE versions ≥ 3600, correctly identifying older VTE terminals as 256-color rather than truecolor.
    • Replaced hardcoded fallback colors (Color::Rgb(69, 71, 90) and Color::Rgb(116, 199, 236) on landing overflow pill, and Color::White on details metadata) with dynamic theme palette colors (theme.base).
  • Notification System Overhaul and Adaptive Layout Polish:

    • Added instant Esc key dismissal for active notification toasts across home and details screens when no popup modals or text input fields are active.
    • Replaced fixed 3-card stack with terminal dimension-adaptive budgets: compact/Termux displays ($H &lt; 20$ or $W &lt; 65$) show at most 1 toast capped at 42 columns and 1 line of message; standard displays ($H &lt; 30$) show up to 2 toasts capped at 2 lines; large displays show up to 3 toasts.
    • Added in-place category lifecycle replacement and de-duplication in state.notify(): notifications in the same category (e.g. Playback, Download, Updates, Cache) or matching title supersede prior in-flight stages and reset the countdown timer rather than spawning redundant stacked cards.
    • Compressed notification copy into terse, high-density phrasing, ensuring status transitions (e.g. playback prep, favorite toggle, cache clear, updates) fit cleanly into single-line messages without multi-row wrapping.
  • OS-Aware Header-Capable Player Feedback:

    • Replaced hardcoded multi-line player incompatibility warning paragraphs with concise single-line notifications dynamically listing supported header-capable players for the user's OS (mpv and IINA on macOS; mpv on Linux and Windows).
    • Eliminated speculative hardcoded provider hints in playback rejection notifications.
  • Help Modal Alignment and Shortcut Declutter:

    • Added help_modal_layout in overlay.rs snapping the Help modal directly to the search bar vertical position (search_y), eliminating vertical misalignments where the search bar previously peaked through above or behind the dialog.
    • Added render suppression in home.rs ensuring the search bar, landing deck, and suggestions are completely hidden while Help is active.
    • Migrated Help dialog rendering to ModalFrame with standard backdrop clearing and theme.lavender borders, removing redundant manual block construction.
    • Lowered two-column layout threshold from 102 to 78 columns, enabling clean dual-column layouts on standard 80×24 terminals without scrolling.
    • Streamlined shortcut descriptions: removed non-existent [s] subtitles hotkey, corrected Ctrl+W label, eliminated duplicate /list command in TV mode, and stripped noisy brackets.
    • Pruned dead Theme.bg field and obsolete SlashCommand::PRIMARY array.
  • Landing Deck Minimalist Declutter (Resume & Favorites):

    • Replaced wordy "Continue Watching" label with concise "Resume" (reducing header width from 34 to 24 characters) and restyled tab navigation with discrete keyhint syntax ([Tab]).
    • Streamlined in-progress watch metadata from redundant triplets (S01E01 · 5% · 42m left) to clean time-to-finish tags (S01E01 · 42m left), falling back to percentage only when stream duration is absent.
  • Details Screen UX Polish and Layout Space Reclamation:

    • Dynamically capped selector_height to the item count of visible selector panes, eliminating excessive empty vertical rows when selector panes have few items.
    • Dynamically capped streams_area height to the exact settled stream count (streams_count + 3), eliminating the massive blank dead space below the stream table on titles with few streams.
    • Formatted Season list items as full descriptive Season N labels and Episode list items as Episode 01 · Title (or Episode 01 fallback), ensuring clear context.
    • Left-aligned data cells in the SIZE column to start at index 0, aligning the size value (1.4GB) directly beneath the SIZE column header.
    • Added symmetric 1-character horizontal padding (Padding::horizontal(1)) to the streams panel container block, preventing text and resolution badges from touching the outer border lines.
    • Replaced heavy filled ● focus markers in pane titles with a minimal › (single chevron) glyph.
    • Removed noisy pane position counters (1/4) from focused pane titles in favor of clean item count badges (› Audio (4)).
    • Deduplicated Audio: metadata badge from the top header line when dedicated dub/audio selector panes are visible below.
    • Replaced legacy middot (·) separators in the header metadata line with clean two-space spacing.
    • Suppressed missing/N/A release years in the metadata badge row.
    • Dropped redundant no-op highlight_style/highlight_symbol calls from selector List widgets.
  • Search Results Layout Top Margin and Metadata Alignment:

    • Added dedicated top breathing margin (search_results_layout) above the search bar on non-compact viewports (area.height >= 14), moving the search bar down from row 0 to row 1 to prevent it hugging the top window border.
    • Synchronized mouse click geometry in handle_home_mouse with search_results_layout, keeping search bar and results list hitboxes aligned.
    • Balanced search result card layout across three vertical rows: Row 1 displays title and resolution badge, Row 2 displays rating, release year, and media type, and Row 3 displays provider badge and genres/loading state.
    • Aligned all 3 rows of text with the 3 rows of the poster placeholder (╭──────╮ on Row 1, │ No Art │ on Row 2, ╰──────╯ on Row 3), eliminating the hanging bottom border and empty-line visual disconnect.

Fixed

  • History and Favorites Search Settle State:
    • Set has_search_settled to true when querying /history, /favorites, and TV /list, preventing an empty watch history or favorites list from being permanently trapped in a Searching for “...” loading spinner.
    • Suppressed search action pills entirely on empty /history and /favorites views, cleanly presenting the empty state message without clutter.
    • Shortened and streamlined notification copy across commands (Unknown command '{cmd}'. Type '/' for list.), mode switches, playback guards, and settings actions to fit cleanly into compact notification cards.
  • Details Screen Selector Panes Tight Label Highlighting:
    • Replaced wide full-width block highlight bars across Audio, Seasons, and Episodes selector panes with compact, text-bounded highlight pills, eliminating awkward empty horizontal background strips across the lists.
  • Stream Table Migration to Native Ratatui Table Architecture:
    • Replaced legacy dual-widget hack (Paragraph header + List items) with native ratatui::widgets::Table and Row/Cell primitives, guaranteeing 100% mathematical column synchronization between table headers (RES, SIZE, MEDIA TAGS, SOURCE, RELEASE) and data cells across every terminal dimension tier.
    • Replaced wide string space hacks with declarative Constraint column widths (Length(8), Length(9), Length(18), Length(16), Min(24)), eliminating column drift and text overlap.
    • Added active-selection awareness to resolution_badge_spans: badges render with subtle dark surfaces and theme accent text when unselected, cleanly switching to bold high-contrast foreground badges when the stream row is highlighted. Added automated cross-theme test verifying contrast and legibility across all 9 built-in themes.
    • Filtered out redundant codec and resolution labels in the SOURCE column (e.g. Multi-Res hevc or 1080p), falling back to clean provider origin names (MovieBox CDN) when no distinct third-party upload source exists.
  • Subtitle Episode Mismatch on MovieBox Series:
    • fetch_resource_page now accepts season and episode parameters and appends se=/ep= to the API URL.
    • Added robust string and integer parsing for se and ep payload values and matched resource items in episode_streams and service.rs sibling fallback explicitly by item.se == season && item.ep == episode rather than unconditionally taking .first(), preventing episode 1 resource IDs from being assigned to later episodes.
    • Fixed playback.rs using selected_details.id.value (root series ID) instead of state.active_subject_id (dub-aware active ID) as the subject key for caption requests; for dubbed variants the two diverge, causing a cache miss and wrong-subject subtitle fetch.
    • Updated all call sites (download.rs, requests.rs prefetch and season-queue spawns, playback.rs) to capture and forward the current selected_season/selected_episode before spawning async subtitle tasks.
    • Users with pre-existing stale subtitle cache entries can purge old entries via Settings → Maintenance → Purge Cache.
  • Search Results Horizontal Margin Alignment:
    • Aligned search results grid horizontally with search_bar_area (x: chunks[2].x + 2, width: chunks[2].width - 4), eliminating the awkward 2-character left overhang where result cards previously started flush against the terminal's 0-column border while the search input prompt was indented.
    • Synchronized mouse hitboxes and column detection in handle_home_mouse to match the padded results bounds and ignore out-of-bounds clicks in the margin.
  • Subtitle Selection Picker Padding and Geometry Optimization:
    • Added symmetric 1-character horizontal padding (Span::raw(" ")) around raw picker list item spans in crate::tui::overlay::picker, ensuring text and active selection pills no longer hug the outer modal borders.
    • Reduced subtitle picker minimum_width from 26 to 20 and unified modal titles to Subtitles, eliminating the excessive 10-column dead space gap on the right-hand side while cleanly fitting the "Subtitles · 1/12" title without truncation.
    • Synchronized minimum_width constraints across rendering and mouse hitboxes in mouse.rs for player (10), theme (16), and subtitle (20) pickers.
  • Provider Selection Popup UX and Layout Unification:
    • Replaced manual paragraph iteration in render_provider_popup with ratatui::widgets::List and canonical selection_style, eliminating competing dual-indicator visuals (left bar and background highlight) into a single cohesive selection cue.
    • Added persistent ✓ active provider prefix glyph in theme.success, ensuring the currently active source remains visually distinguishable while navigating through options.
    • Added compact key hints footer ([↑↓] [↵] [Esc]) anchored to the bottom of the popup with automatic geometry expansion in provider_popup_bounds.
    • Styled popup block title with theme.title matching modal frame standards and restored unselected item labels to theme.text.
  • TUI Declutter and OS/Terminal Native-Feel Adaptation:
    • Standardized key_hint with split styling ([/] in theme.overlay0, key in theme.shortcut, label in theme.subtext1), improving shortcut readability across all modals and popups.
    • Stripped instructional "Press X" prose from stream failure messages, details error cards, and the update modal.
    • Streamlined home screen bottom bar on compact terminals by dropping redundant mode word labels and keeping clean shortcut glyphs.
    • Trimmed dynamic rotating search placeholder hints to three focused prompts per mode.
    • Added Truecolor detection support for Konsole and xfce4-terminal via TERM_PROGRAM.
    • Added BACKGROUND environment variable fallback for light/dark terminal detection.
    • Updated Help modal title from "Help · Streaming Mode" to clean "Help · Streaming".
  • Universal Solid Highlight Bar Selection Overhaul:
    • Replaced floating cursor and indicator glyphs (▌, >, ▸) across all application screens with full-width solid inverted highlight bars (Modifier::REVERSED with theme.highlight and dark bold text), unifying selection styling across the entire TUI to match the provider selection standard.
    • Upgraded search results cards by eliminating the floating vertical ▌ indicator paragraph and styling the selected card's title with a tight inverted highlight pill (" " + title + " " in Modifier::REVERSED), stopping exactly where the title text ends rather than stretching across empty card space, preserving rich metadata badge colors on transparent background underneath, and recovering 2 horizontal columns in item_slot_rects.
    • Refactored Continue Watching and Favorites landing deck lists to use empty highlight symbols ("") with clean 2-space padding, ensuring the active row renders as an uninterrupted solid highlight bar.
    • Converted search autocomplete suggestions to use empty highlight symbols ("") with 1-space leading padding, rendering active suggestions as solid highlight bars.
    • Updated all four Media Details panes (Audio, Seasons, Episodes, Streams) to use canonical overlay::selection_style with Modifier::REVERSED and empty highlight symbols (""), eliminating the ▌ glyph and horizontal layout shifts when alternating focus between panes.
    • Unified Provider popup, TV playlist manager, Addons manager, and overlay modal pickers (themes, players, subtitles, browse presets) by removing leading ▌ symbols and rendering clean solid highlight bars.
  • Terminal Color Support and Capability Detection Precision:
    • Fixed a critical precedence bug in classify_terminal where term == "xterm" degraded truecolor-capable terminals to 16-color Basic even when COLORTERM=truecolor was set.
    • Made term_program matching case-insensitive across all checks (iterm.app, hyper, tabby, wezterm, warpterminal, warp, vscode, ghostty, konsole, xfce4-terminal, apple_terminal).
    • Added truecolor recognition for VTE-based terminals via VTE_VERSION (GNOME Terminal, Tilix), Warp via warp / WARP_IS_LOCAL_SHELL_SESSION, and Alacritty / WezTerm socket and executable environment variables.
    • Corrected Windows fallback in classify_terminal to ColorSupport::Color256 instead of Truecolor, preventing legacy Windows ConHost sessions from receiving garbled truecolor escapes while preserving automatic Truecolor for Windows Terminal via WT_SESSION.
    • Connected uses_basic_ui directly to ColorSupport::Basic, ensuring all basic and 16-color terminals automatically receive plain borders and simplified ASCII controls.

Removed

  • Legacy Addon Mode Routing and Keybindings:
    • Removed Ctrl+A shortcut and the bottom bar Addon Mode button.
    • Removed obsolete Action::ToggleAddonMode.

Fixed

  • Notification Toast Title Text Coloring:
    • Styled notification toast title spans with badge_style rather than the default foreground text style, ensuring that Error (red), Warning (yellow), Success (green), and Info (blue) toasts render consistent title colors matching their borders and badges.

Don't miss a new MovieBox-Tui release

NewReleases is sending notifications on new releases.