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>/pathand/http/<host>/path) insrc/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 andDETACHED_PROCESSwithCREATE_NEW_PROCESS_GROUPon Windows, ensuring streaming survives terminal window closure. - Updated
supports_headersandheader_capable_playersinsrc/player.rsto allow VLC as a supported player for all streaming sources.
- Added a detached loopback HTTP sidecar proxy (
-
Android Intent MovieBox Playback via Loopback Proxy:
- Extended loopback HTTP sidecar proxy (
src/proxy.rs) to supportPlayerKind::AndroidIntentfor streams requiring CloudFront signed cookies. - Enabled
AndroidIntentinsupports_headersandheader_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.
- Extended loopback HTTP sidecar proxy (
Fixed
-
Crash Hardening & Bounds Safety:
- Fixed potential
usizearithmetic underflow on empty search results in navigation handler (.saturating_sub(1)). - Fixed potential
usizearithmetic 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.
- Fixed potential
-
UI Layout & Mouse Synchronization:
- Extracted shared
split_main_and_downloadlayout 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.
- Extracted shared
-
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
RequestTaskHandlesfor 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_providernavigation to handle currently disabled active providers correctly. - Consolidated
/exitslash 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) withconnect_timeout(15s)only; per-chunk idle timeout (60s) now signals stalled transfers without terminating long-running video streams mid-playback. - Introduced a
ConnectionGuardRAII wrapper ensuringactive_connectionsis 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_linememory growth from malformed or adversarial clients. - Added
child.wait()afterchild.kill()on proxy spawn failure to reap the child process and avoid zombie accumulation.
- Replaced
-
Search Poster Loader: Cleared
in_flight_posterswhen navigating back from the Details screen (GoBack→Screen::Detailspath) 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_typednow parsesDateLessThan/AWS:EpochTimefrom theCloudFront-PolicyBase64 payload embedded in releaseCookieheaders and caps the on-disk cache TTL tomin(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)ontokio::process::Commandwhen spawningyt-dlpinstart_resilient_download, preventing orphaned download worker processes from continuing in the background if tasks are cancelled. - Added
JoinHandletracking for active download workers inRequestTaskHandles, pairing it with an asynchronous watcher that catches background worker panics and dispatchesAction::DownloadFailedto 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_cancelArc 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::CheckForUpdatesin 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 receivingAction::Quit, ensuring all background I/O operations terminate before the terminal exits. - Replaced detached spawned tasks in
AddonClient::fetch_addon_streamswith direct futures viafutures::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) insrc/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_exerather 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/amon Android outside Termux, preventing SELinux exit code 126 crashes on modern Android releases. - Gated Android
/storage/downloadssubtitle path probing withis_termux_environment(), preventing non-Android systems with~/storagefrom misrouting subtitle files. - Updated
config_dir()anddata_dir()to fall back tostd::env::temp_dir()with an explicit warning when user directories cannot be resolved. - Updated
install.shto provide clear guidance when invoked on Windows MINGW/MSYS/Cygwin environments, and hardened SHA256 checksum parsing against leading asterisk formatting.
- Configured
-
TUI & Render Hot-Path Efficiency:
- Added
id_index(HashSet<(String, String, i64)>) toFavoritesManager, 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) fromsrc/tui/state.rs. - Pruned obsolete and unused action variants (
ProbeTerminal,ShowSettingsPopup,CloseSettingsPopup) fromsrc/tui/action.rsand consolidated settings handlers. - Consolidated all video playback launches through canonical
LaunchPlaybackactions, removing misleading and redundantLaunchMpvaliases. - Prioritized
termux-amahead oftermux-openin Android opener probing to preserve HTTP request headers and subtitle arguments.
- Added
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_layoutwidth calculation tocontent_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::pickerto automatically apply uniform 2-space left and right margins to dynamic items.
- 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 (
-
Linux ARM64 Production Portability & Installer Hardening:
- Removed Android Bionic TLS assembly hacks (
__bionic_tls_align_anchor) and PythonPT_TLSbyte-patching from the generic Linuxaarch64-unknown-linux-musltarget, isolating Android Bionic requirements to the dedicatedbuild-android(aarch64-linux-android) NDK pipeline. - Configured
-C link-arg=-Wl,-z,max-page-size=65536onaarch64-unknown-linux-musl, aligning ELFPT_LOADsegments 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 foraarch64-unknown-linux-musl, actively booting the compiled AArch64 Linux binary and verifying--versionbefore packaging. - Enhanced
install.shto proactively detect 32-bit Raspbian userland (getconf LONG_BIT == 32) on 64-bit ARM hardware, providing an actionable nativecargo installpath rather than attempting incompatible 64-bit binary execution. - Improved
install.shsmoke test failure diagnostics to capture and print explicit non-zero exit codes when binary execution fails without output.
- Removed Android Bionic TLS assembly hacks (
-
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_enabledconfigs by automatically migrating enabled BDIX state to both CircleFTP and DhakaFlix flags on startup.
- Removed redundant boilerplate footer keyhint bars (
-
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.
- Added non-blocking HTTP network probes (
-
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
dandDeletekeybindings when browsing/historyresults 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 viaCtrl+P. - Simplified application state model by removing
AppMode::AddonandAppState.is_addon_mode, making navigation two-mode (StreamingandLive TV). - Routed Addon Manager dialog access through
/configwhen the active provider isAddons.
- Merged separate Addon Mode into standard Streaming Mode; Stremio 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 gracefulbasefallback. - 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.mutedtotheme.overlay1, eliminating low-contrast illegibility onsurface1backgrounds. - 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.
- Added typed background and surface color helper methods on
-
Terminal Color Quantization and Standard Detection Fixes:
- Fixed
rgb_to_xterm256color 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_COLORenvironment 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_VERSIONtruecolor 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)andColor::Rgb(116, 199, 236)on landing overflow pill, andColor::Whiteon details metadata) with dynamic theme palette colors (theme.base).
- Fixed
-
Notification System Overhaul and Adaptive Layout Polish:
- Added instant
Esckey 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 < 20$ or $W < 65$) show at most 1 toast capped at 42 columns and 1 line of message; standard displays ($H < 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.
- Added instant
-
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 (
mpvandIINAon macOS;mpvon Linux and Windows). - Eliminated speculative hardcoded provider hints in playback rejection notifications.
- Replaced hardcoded multi-line player incompatibility warning paragraphs with concise single-line notifications dynamically listing supported header-capable players for the user's OS (
-
Help Modal Alignment and Shortcut Declutter:
- Added
help_modal_layoutinoverlay.rssnapping 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.rsensuring the search bar, landing deck, and suggestions are completely hidden while Help is active. - Migrated Help dialog rendering to
ModalFramewith standard backdrop clearing andtheme.lavenderborders, 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, correctedCtrl+Wlabel, eliminated duplicate/listcommand in TV mode, and stripped noisy brackets. - Pruned dead
Theme.bgfield and obsoleteSlashCommand::PRIMARYarray.
- Added
-
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.
- Replaced wordy "Continue Watching" label with concise "Resume" (reducing header width from 34 to 24 characters) and restyled tab navigation with discrete keyhint syntax (
-
Details Screen UX Polish and Layout Space Reclamation:
- Dynamically capped
selector_heightto the item count of visible selector panes, eliminating excessive empty vertical rows when selector panes have few items. - Dynamically capped
streams_areaheight 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 Nlabels and Episode list items asEpisode 01 · Title(orEpisode 01fallback), ensuring clear context. - Left-aligned data cells in the
SIZEcolumn to start at index 0, aligning the size value (1.4GB) directly beneath theSIZEcolumn 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_symbolcalls from selectorListwidgets.
- Dynamically capped
-
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_mousewithsearch_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.
- Added dedicated top breathing margin (
Fixed
- History and Favorites Search Settle State:
- Set
has_search_settledtotruewhen querying/history,/favorites, and TV/list, preventing an empty watch history or favorites list from being permanently trapped in aSearching for “...”loading spinner. - Suppressed search action pills entirely on empty
/historyand/favoritesviews, 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.
- Set
- 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 (
Paragraphheader +Listitems) with nativeratatui::widgets::TableandRow/Cellprimitives, 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
Constraintcolumn 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
SOURCEcolumn (e.g.Multi-Res hevcor1080p), falling back to clean provider origin names (MovieBox CDN) when no distinct third-party upload source exists.
- Replaced legacy dual-widget hack (
- Subtitle Episode Mismatch on MovieBox Series:
fetch_resource_pagenow acceptsseasonandepisodeparameters and appendsse=/ep=to the API URL.- Added robust string and integer parsing for
seandeppayload values and matched resource items inepisode_streamsandservice.rssibling fallback explicitly byitem.se == season && item.ep == episoderather than unconditionally taking.first(), preventing episode 1 resource IDs from being assigned to later episodes. - Fixed
playback.rsusingselected_details.id.value(root series ID) instead ofstate.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.rsprefetch and season-queue spawns,playback.rs) to capture and forward the currentselected_season/selected_episodebefore 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_mouseto match the padded results bounds and ignore out-of-bounds clicks in the margin.
- Aligned search results grid horizontally with
- Subtitle Selection Picker Padding and Geometry Optimization:
- Added symmetric 1-character horizontal padding (
Span::raw(" ")) around raw picker list item spans incrate::tui::overlay::picker, ensuring text and active selection pills no longer hug the outer modal borders. - Reduced subtitle picker
minimum_widthfrom26to20and unified modal titles toSubtitles, 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_widthconstraints across rendering and mouse hitboxes inmouse.rsfor player (10), theme (16), and subtitle (20) pickers.
- Added symmetric 1-character horizontal padding (
- Provider Selection Popup UX and Layout Unification:
- Replaced manual paragraph iteration in
render_provider_popupwithratatui::widgets::Listand canonicalselection_style, eliminating competing dual-indicator visuals (left bar and background highlight) into a single cohesive selection cue. - Added persistent
✓active provider prefix glyph intheme.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 inprovider_popup_bounds. - Styled popup block title with
theme.titlematching modal frame standards and restored unselected item labels totheme.text.
- Replaced manual paragraph iteration in
- TUI Declutter and OS/Terminal Native-Feel Adaptation:
- Standardized
key_hintwith split styling ([/]intheme.overlay0, key intheme.shortcut, label intheme.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
Konsoleandxfce4-terminalviaTERM_PROGRAM. - Added
BACKGROUNDenvironment variable fallback for light/dark terminal detection. - Updated Help modal title from "Help · Streaming Mode" to clean "Help · Streaming".
- Standardized
- Universal Solid Highlight Bar Selection Overhaul:
- Replaced floating cursor and indicator glyphs (
▌,>,▸) across all application screens with full-width solid inverted highlight bars (Modifier::REVERSEDwiththeme.highlightand 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 + " "inModifier::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 initem_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_stylewithModifier::REVERSEDand 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.
- Replaced floating cursor and indicator glyphs (
- Terminal Color Support and Capability Detection Precision:
- Fixed a critical precedence bug in
classify_terminalwhereterm == "xterm"degraded truecolor-capable terminals to 16-color Basic even whenCOLORTERM=truecolorwas set. - Made
term_programmatching 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 viawarp/WARP_IS_LOCAL_SHELL_SESSION, and Alacritty / WezTerm socket and executable environment variables. - Corrected Windows fallback in
classify_terminaltoColorSupport::Color256instead ofTruecolor, preventing legacy Windows ConHost sessions from receiving garbled truecolor escapes while preserving automaticTruecolorfor Windows Terminal viaWT_SESSION. - Connected
uses_basic_uidirectly toColorSupport::Basic, ensuring all basic and 16-color terminals automatically receive plain borders and simplified ASCII controls.
- Fixed a critical precedence bug in
Removed
- Legacy Addon Mode Routing and Keybindings:
- Removed
Ctrl+Ashortcut and the bottom bar Addon Mode button. - Removed obsolete
Action::ToggleAddonMode.
- Removed
Fixed
- Notification Toast Title Text Coloring:
- Styled notification toast title spans with
badge_stylerather 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.
- Styled notification toast title spans with