Changelog
[0.1.18] - 2026-09-06
Added
- Minimal Update Available Modal & Indented Release Notes:
- Formatted release notes into a clean, scannable indented hierarchy under
Release Notes:with category badges ([Added],[Fixed]) and bullet points, displaying concise feature titles without decorative tree glyphs, block prefixes (▌), or multi-line duplicate text walls. - Stripped decorative star icons and redundant prompt sentences, keeping the header focused on a clean, high-contrast version diff (
Installed: vX.Y.Z → Latest: vX.Y.Z). - Separated dialog sections with subtle horizontal card divider lines (
─) and dedicated action button pills ([u] Update Now,[o] Open Release Page,[Esc] Dismiss).
- Formatted release notes into a clean, scannable indented hierarchy under
- Calm, Minimal Self-Updating Progress Dialog:
- Redesigned
draw_updating_modalinto a calm, focused card with top and bottom border clearances, eliminating visual crowding against the title and frame. - Streamlined the in-flight display into a unified active status line with spinner (
⠋ Downloading MovieBox-Tui v.../⠋ Installing MovieBox-Tui v...) and a cross-platform safety warning (⚠ Please wait • do not close terminal/[!] Please wait - do not close terminal).
- Redesigned
Fixed
- Landing Screen ASCII Banner Bleed-Through:
- Modal Frame Corner Backdrops & Transparent Halos:
- Removed block-level background color overrides from
ModalFrame, eliminating dark rectangular halos and square pixel spillage around rounded corner glyphs (╭,╮,╰,╯) across transparent and custom terminal themes.
- Removed block-level background color overrides from
- Update Modal Geometry & Border Clearances:
- Widened the modal from 72 to 76 columns to align with standard dialog geometry and provide a generous 3-column safety margin, preventing text lines and bullet points from crowding the outer borders.
- Search Bar Synthetic Cursor Artifacts:
- Removed artificial block glyphs (
▎/█) drawn directly into search input paragraphs, relying on native terminal cursor positioning without visual cursor duplication or blinking redraw churn.
- Removed artificial block glyphs (
- README Walkthrough Media Attachment:
- Formatted the WebM walkthrough attachment link in
README.mdanddocs/README.mdfor native inline playback.
- Formatted the WebM walkthrough attachment link in
- CI Performance Benchmark Runner Tolerance:
- Bound wall-clock timing assertion tolerances during unoptimized debug test execution in
tests/performance_audit.rs, eliminating flaky runner noise failures across virtualized CI runners while maintaining release regression bounds.
- Bound wall-clock timing assertion tolerances during unoptimized debug test execution in
Performance
- Zero-Allocation Text Truncation Pipeline (
src/tui/text.rs):- Implemented SIMD
is_ascii()fast path inwidthand migratedtruncate_widthtoCow<'a, str>, eliminating 100% of heap allocations on fitting titles and text spans. - Reduced 10,000-operation truncation latency from
5,243.5µsto246.2µs(21.3x faster,524.3ns -> 24.6ns/op) under release compiler profile on Apple Silicon. - Streamlined
truncate_middle_widthto construct output into a single preallocated buffer, eliminating intermediateVec<&str>, reversal, and concatenation allocations.
- Implemented SIMD
- Table-Lookup Hex Encoding (
src/cache.rs):- Replaced 16 dynamic
core::fmt::writedispatches per MD5 digest with direct 16-byte static lookup table indexing inmd5_hex. - Reduced 10,000-digest hashing latency from
4,597.9µsto1,829.8µs(2.51x faster,459.8ns -> 183.0ns/op).
- Replaced 16 dynamic
- Preallocated IPTV M3U Playlist Parser (
src/providers/tv/parser.rs):- Added newline-count capacity preallocation to
M3UParser::parse_m3u, eliminating repeated dynamic vector reallocations during large playlist loads and achieving352.0µsparse duration for 500-channel playlists.
- Added newline-count capacity preallocation to
- Buffered Downloader Chunk Write Aggregation (
src/download.rs):- Wrapped segment file descriptors in
tokio::io::BufWriter::with_capacity(256 * 1024), aggregating incoming 8KB–16KB HTTP response chunks into sequential 256KB disk blocks and eliminating up to 96.8% of unbuffered filesystem write syscalls.
- Wrapped segment file descriptors in
- TUI Draw Loop Allocation Pruning (
src/tui/screens/home.rs,src/tui/screens/details.rs):- Eliminated redundant
display_title.clone()and duplicate Unicode width calculations in search result and landing deck render loops, delivering headless draw latencies of32.3µs/frame(80×24),43.4µs/frame(120×30), and67.3µs/frame(160×40).
- Eliminated redundant
[0.1.17] - 2026-09-06
Added
- Anchored Provider Selection Menu:
- Replaced immediate mouse cycling on the landing search bar provider badge (
[MovieBox · ^P]) with a styled popup menu anchored directly beneath the provider badge. - Added dedicated keyboard navigation (
↑/↓/k/j,Home/End,Enter/Space,Esc) for the provider menu while preserving directCtrl+Psequential provider cycling across all screens. - Implemented shared geometry (
search_bar_provider_pill_rectandprovider_popup_bounds) between renderers and mouse hitboxes, ensuring exact alignment and zero geometry divergence.
- Replaced immediate mouse cycling on the landing search bar provider badge (
- Redesigned High-Contrast Download Bar & Responsive Layout:
- Replaced the solid rectangular download gauge with a sleek proportional track (
[━━━━━────]on modern terminals and[=====>----]on basic terminals) with filled accent contrast and dimmed surface rail. - Added prominent media title indicators on the top border (
⬇ Downloading: <Title>or⬇ S<N>E<N> (<current>/<total>): <Title>) with bold styling and automatic terminal width truncation. - Replaced ambiguous whole-area click cancellation with an isolated
[x] Cancelbutton hitbox on the top-right border, preventing accidental download interruptions while keeping the bar mouse-safe. - Formatted transfer statistics into clean badges (
<Size> | <Speed> | ETA <Time>) with zero unclosed parenthesis artifacts and zero floating dots.
- Replaced the solid rectangular download gauge with a sleek proportional track (
- Details Screen UX & UI Deduplication:
- Replaced repetitive audio language strings in the metadata header with a concise summary badge (
N Audio Tracks), reserving line space for genre tags and IMDb ratings. - Eliminated the redundant workflow breadcrumb bar on wide/desktop layouts where selector columns are already visible side-by-side, reclaiming a vertical display row to show more episodes without scrolling.
- Standardized selector list typography and cursor alignment, eliminating irregular bullet padding and double-space indentation across Audio, Season, and Episode items.
- Deduplicated stream table columns by showing clean CDN/provider origins under
SOURCEand stripping redundant resolution/codec suffixes from theRELEASEcolumn. - Added count context to pane titles (
Audio (N),Seasons (N),Episodes (N)), providing immediate visibility into available content quantities.
- Replaced repetitive audio language strings in the metadata header with a concise summary badge (
- Native Android ARM64 Release Target & Pipeline:
- Added native
aarch64-linux-androidbuild target to the release workflow (.github/workflows/release.yml) using Android NDK r26d and Clang (API 24+). - Configured automated packaging of
MovieBox_Android_arm64.tar.gzwith native Bionic dynamic linking (libc.so), valid ELFPT_PHDRprogram header table, and/system/bin/linker64dynamic loader. - Added Android ELF header validation in CI to verify
PT_PHDRand/system/bin/linker64presence, preventingCould not find a PHDR: broken executable?aborts on Android devices. - Updated universal installer script (
install.sh) to detect Android Termux on 64-bit ARM and automatically fetchMovieBox_Android_arm64.tar.gzwith verified SHA256 checksums, enabling 1-second native installation without on-device compilation.
- Added native
- Native mdBook & GitHub Pages Documentation Architecture:
- Integrated
mdBookdocumentation engine reading directly from canonicaldocs/*.mdguides with zero duplicated markdown files and zero third-party web frameworks. - Added
docs/SUMMARY.mddefining table-of-contents chapter navigation across all guides, architecture diagrams, and operational workflows. - Added
docs/installation.mddetailing complete installation instructions for macOS (curl script and Homebrew tap), Linux, Windows (PowerShell), Android (Termux), Cargo, and source builds. - Formatted
docs/README.mdas the book’s introductory landing page featuring core capabilities, prerequisites player matrix, and the live terminal demonstration video streamed from the GitHub CDN. - Added minimal root
book.tomlwithnavydark theme, collapsible sidebar navigation, and client-side full-text search. - Added automated GitHub Actions deployment workflow (
.github/workflows/pages.yml) publishing the documentation site to GitHub Pages on every push tomain. - Added documentation build integrity validation step in CI hygiene pipeline (
.github/workflows/ci.yml).
- Integrated
Changed
- Codebase Cleanups, Dead Code Removal & Shared Logic Centralization:
- Removed obsolete compatibility forwarders and dead code (
render_favorites_landing,remove_last_grapheme,pad_to_width,ctrl_key, and unused shortcut constants). - Centralized
theme_colorinsrc/tui/theme.rs, eliminating duplicate definitions across widgets and screens. - Centralized favorite status lookups for active details into
AppState::is_selected_details_favorited, unifying 30-line duplicate calculations in details screen rendering and mouse hitbox detection. - Unified subtitle picker label formatting (
"None"->"No subtitles", language sanitization) intoformat_subtitle_label. - Consolidated details pane border, title, and selection styling through
pane_styles, eliminating over 50 lines of duplicate style branching. - Streamlined details footer action definitions into declarative primary/secondary group builders, cutting redundant code blocks while preserving exact keybindings and layout.
- Hardened cross-platform process spawning by unifying the Windows
CREATE_NO_WINDOW(0x08000000) flag into a canonical constant inplayer.rs. - Decoupled network URL validation by moving
is_http_urltocrate::net, eliminating backend network provider dependencies on the TUI text formatting module.
- Removed obsolete compatibility forwarders and dead code (
Fixed
- Global Modal Background Unfocus & Dimming:
- Automatically unfocused and dimmed all background components across Details, Home, and Runner views whenever any modal or popup dialog is active, replacing bright active borders, focus bullets, and selection highlight rectangles with dimmed styling (
theme.muted). - Dimmed background resolution badges (
Multi,4K,1080p, etc.) and provider origin tags to muted styling (theme.mutedon surface backgrounds) during active modal popups, preventing neon badge colors from competing with foreground dialogs. - Dimmed unselected list items across Audio dubs, Seasons, Episodes, and Search Results to
theme.muted, eliminating bright white text bleeds in the background. - Dimmed background footer shortcuts and download bar elements during open dialogs, ensuring visual focus remains strictly on the active foreground popup.
- Suppressed terminal graphics protocol rendering for background posters when a modal dialog is open, preventing image pixels from bleeding over foreground confirmation dialogs.
- Automatically unfocused and dimmed all background components across Details, Home, and Runner views whenever any modal or popup dialog is active, replacing bright active borders, focus bullets, and selection highlight rectangles with dimmed styling (
- Stream Table Source Column Resolution:
- Prioritized specific mirror and uploader labels (
file.source_label()) in the stream tableSOURCEcolumn before falling back to generic provider names, displaying actual source tags (Pahe.in,PSA,NF,GalaxyRG, etc.) when present while retaining provider fallbacks for direct CDN streams.
- Prioritized specific mirror and uploader labels (
- MovieBox DASH Progress Normalization, Throttling & Background Continuity:
- Normalized multi-stream MPEG-DASH download percentages across video (0–90%), audio (90–98%), and merger (99–100%) stages, eliminating progress resets back to 0% when the video stream finishes and the audio stream begins.
- Enforced monotonic progress tracking and throttled progress event emissions to 250ms intervals, eliminating terminal text jitter and channel saturation.
- Preserved active downloads and queue processing across content provider switching (
Ctrl+P) and mode toggling (Ctrl+T,Ctrl+A), eliminating premature download pauses and false cancellation warnings when navigating the TUI. - Added explicit cancellation feedback notifications when dismissing the subtitle selection popup via
Escor outside mouse click, preventing silent stream launch cancellations.
- Empty Search Clear Guarding on Landing Screen:
- Guarded search-cleared status notifications in
Action::GoBack,c/C, andCtrl+Uto only fire when an active search query or loaded results actually existed, eliminating spurious “Search cleared.” status messages when navigating on an already-empty landing page. - Allowed pressing Enter on an empty search input in editing mode to cleanly switch back to normal mode without triggering unneeded state resets.
- Guarded search-cleared status notifications in
- MovieBox DASH Stream Download Engine & Header Authentication:
- Forwarded mirror authentication headers (
Cookiecontaining CloudFront signed policy andReferer) throughAction::StartDownloadandstart_resilient_download, eliminatingHTTP 403 Forbiddenerrors on MovieBox CDN downloads. - Added dedicated MPEG-DASH stream engine utilizing
yt-dlpto assemble multi-track audio/video manifests (index.mpd) into.mp4, maintaining full feature parity with progressive single-file downloads. - Integrated real-time child process progress parsing (
parse_ytdlp_progress), reporting live percentage, speed, and ETA metrics to the TUI status bar. - Implemented dynamic, OS-tailored installation guidance for
yt-dlpandffmpegwhen missing from the host system (Homebrew on macOS, package managers on Linux, WinGet on Windows, and Termuxpkg install yt-dlp ffmpegon Android). - Hardened Windows background process spawning with
CREATE_NO_WINDOWand added cross-platform path resolution fallbacks for macOS Homebrew, Nix, and Termux environments. - Preserved external subtitle sidecar retrieval alongside DASH video downloads, maintaining clean
<base_dir>/Movies/<Title>/and<base_dir>/Series/<Title>/Season <N>/directory hierarchy.
- Forwarded mirror authentication headers (
- Series Season Default & Episode List Rendering Normalization:
- Initialized unselected series search results with
season: 0, preventing catalog season counts from masquerading as watch history progress and erroneously defaulting multi-season shows (e.g. Breaking Bad) to their final season on initial selection. - Guarded history pre-seeding in search submission strictly to
/historyqueries and active continue-watching items, ensuring search results always open at Season 1 Episode 1 for new series while resuming at the user’s progress for previously watched shows. - Authoritatively resolved target season and episode in
DetailsSuccess, preserving in-view season and episode positions across audio dub switches while defaulting fresh series navigation to Season 1 Episode 1. - Replaced
"· "unwatched episode status prefix with clean whitespace padding, eliminating double middots (· · EP 01) and stray dots before unselected episodes in the details pane. - Guarded duration formatting against empty strings in
MediaDetails, eliminating duplicate bullet dividers (· ·) in the metadata header for series without runtime durations.
- Initialized unselected series search results with
- Accurate Playback & Download Preparation Notifications:
- Replaced misleading “Fetching subtitles” toast notifications during stream and episode download preparation with accurate stream preparation notices (
Preparing <filename>...andResolving episode stream...), eliminating false subtitle retrieval messages when streams rely on embedded subtitles or contain no external captions. - Clarified external subtitle download failure status to
External subtitle unavailable; playing stream directly.to prevent ambiguity when video containers carry built-in subtitles. - Standardized download mirror error notice to
No downloadable mirrors were found for this release.and normalized notification title casing.
- Replaced misleading “Fetching subtitles” toast notifications during stream and episode download preparation with accurate stream preparation notices (
- MovieBox Subtitle Resolution & High-Speed Multi-Tier Aggregation:
- Implemented multi-tier subtitle resolution in
MovieBoxService::get_ext_captionswith immediate early-exit (< 250ms) when the active stream provides rich subtitles (≥ 5 tracks), eliminating 15–20 superfluous sibling network round-trips that previously triggered 15-second playback resolution timeouts. - Replaced sequential nested loops for sibling dub crawls with concurrent parallel dispatch via
futures::future::join_all, bounding multi-dub subtitle aggregation (e.g. Ek Deewane Ki Deewaniyat) to < 1.2s. - Added asynchronous background subtitle cache pre-warming in
Action::EpisodeStreamsReady, fetching and caching subtitle options as soon as streams are received so that pressing Enter on a stream yields an instant < 1ms cache hit. - Resolved full multi-language subtitle availability (English, Bengali, Arabic, Chinese, Filipino, French, Hindi, Indonesian, Malay, Portuguese, Punjabi, Russian, Urdu) on MovieBox by linking genuine upload
resourceIdidentifiers to releases instead of internal CDN transcoding stream IDs. - Filtered out 34-byte dummy placeholder caption files returned by transcoding endpoints and deduplicated subtitle tracks by language and download URL.
- Added automatic fallback to subject resources in
MovieBoxService::get_ext_captionswhen a stream ID does not directly attach captions. - Added
in_idlanguage code mapping tosanitize_language_labelfor localized Indonesian subtitle display. - Registered
draw_subtitle_pickerinApp::draw, restoring the visual “Subtitles” modal picker overlay during stream playback and download preparation when external captions exist. - Tightened modal picker vertical height calculation in
picker_layout, eliminating blank gap lines between the last list item and the bottom divider for short lists. - Hardened
Action::PlayStreamerror handling with structured diagnostic warnings on subtitle timeout or resolution failure before dispatching direct playback.
- Implemented multi-tier subtitle resolution in
- Termux Android Player Exit Code 126 & Intent Bridge Resolution:
- Eliminated
Player Error: Crash code: 126 (/system/bin/am[11]: /data/data/com.termux/files/usr/bin/cmd: Permission denied)crash in Termux on Android 10+ by prioritizing native Termux openers (termux-open,termux-open-url,termux-am) and strictly avoiding unprivileged/system/bin/amshell script calls. - Preserved
LD_PRELOADfor Termux applet compatibility while prepending system paths (/system/bin:/system/xbin) for system command invocations. - Added actionable diagnostic notifications when player execution fails or when no player is detected in Termux, directing users to install
termux-tools termux-amand verify an external Android player (VLC, Just Player, MX Player). - Updated universal installer (
install.sh), README, and documentation guides withtermux-amprerequisites and architecture details explaining external Android video player integration versus headless CLImpv.
- Eliminated
- Android Intent Player Stream Compatibility:
- Eliminated blanket player incompatibility errors on Android: unauthenticated streams (CircleFTP, DhakaFlix, IPTV, direct streams) and streams carrying standard
Referer/User-Agentheaders (4KHDHub) now dispatch directly to Android video players viatermux-openoram start. - Added empty-header guard to
supports_headers, ensuring streams without authentication requirements are never falsely rejected as incompatible. - Forwarded
User-Agent,Referer, and subtitles (subtitles_locationandsubs) as intent extras when dispatching playback viaamortermux-am. - Prevented circular provider switch prompts when playing 4KHDHub streams by tailoring notification hints based on the active provider.
- Eliminated blanket player incompatibility errors on Android: unauthenticated streams (CircleFTP, DhakaFlix, IPTV, direct streams) and streams carrying standard
- Documentation Mobile Layout & Typesetting Normalization:
- Replaced unparsed LaTeX syntax (
$\to$,$\ge$,$\mu\text{s}$,$N\times$) across all documentation guides with standard Unicode characters (→,≥,µs,N×), eliminating raw unrendered markup in mdBook output. - Added responsive documentation stylesheet (
docs/custom.css) integrated viabook.toml, enabling smooth touch horizontal scrolling, compact cell padding, visible scrollbars, and dynamic code text wrapping across mobile and small screen viewports. - Formatted provider matrix table in
docs/providers.mdwith explicit column alignments and bold provider labels to optimize scannability on narrow screens.
- Replaced unparsed LaTeX syntax (
Changed
- Documentation Readability & Typography Polish:
- Expanded reading container width (
--content-max-width: 860px) and relaxed line-height (1.62em) with vertical list spacing (0.45em) indocs/custom.css. - Added theme-adaptive inline code badge containers (
:not(pre) > code) with bordered backgrounds, and framed<pre>code blocks with rounded corners and drop shadows. - Added table row hover transitions and container borders across configuration, platform, and player documentation tables.
- Implemented responsive mobile header title scaling (
.menu-title) and smooth anchor navigation scrolling (scroll-behavior: smooth).
- Expanded reading container width (
[0.1.16] - 2026-09-05
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 (
[0.1.15] - 2026-09-03
Added
- MovieBox MPEG-DASH Stream Playback:
- Implemented visitor login authentication with JWT session tracking and atomic disk persistence (
~/.cache/moviebox-tui/moviebox_session.bin). - Added CloudFront DASH manifest resolution (
index.mpd) labeled with[Multi]badge in stream listings for multi-resolution playback (1080p,720p,480p). - Forwarded authentication headers and mobile
User-Agenttompv,IINA, andVLCfor authenticated CloudFront DASH demuxing.
- Implemented visitor login authentication with JWT session tracking and atomic disk persistence (
- Seekable 4KHDHub Stream Resolution:
- Prioritized seekable Cloudflare R2, S3, and FSL stream mirrors (
HTTP 206 Partial Content) over attachment downloads. - Added automatic unwrapping of base64
watch-onlineredirect URLs and expanded HubCloud button selectors. - Concurrently probe resolver mirror candidates in chunks of 3 with a 4-second timeout, filtering expired or broken links.
- Prioritized seekable Cloudflare R2, S3, and FSL stream mirrors (
- Interactive Settings Hub (
/settings):- Added a unified 4-tab modal (
General,Content Modes,Appearance,Maintenance) for media player selection, download directory configuration, live theme palette preview, and provider toggles.
- Added a unified 4-tab modal (
- TUI Layout & Ergonomics:
- Added
/exitslash command (with/quitand/qaliases) to exit and restore the terminal directly from the search prompt. - Added direct watch history resume on
Space/Pfor the recorded season and episode. - In-place provider switching (
Ctrl+P) on the Details screen to re-query titles without returning to the landing screen. - Multi-
Escnavigation: firstEscreturns focus to the search bar; secondEscclears the query and returns to the home landing. - Added fluid 10-frame Unicode Braille loading spinners (
⠋⠙⠹...) with ASCII fallbacks. - Grapheme-cluster-safe text input (
TextInputBuffer) across search, TV playlist, and addon inputs withCtrl+W,Ctrl+U,Delete, andHome/Endsupport. - Added 4-tier responsive stream table layout and dynamic single-column fallback for narrow terminals (<85 cols).
- Added Kitty keyboard protocol support (
DISAMBIGUATE_ESCAPE_CODES,REPORT_EVENT_TYPES) for lower latency input on supported terminals. - Added terminal theme autodetection using OSC 11 background luminance queries, with
NO_COLORoverride support.
- Added
Changed
- Unified Favorite Keybinding: Standardized favorite toggling across all screens exclusively on
f/F. - Search & Landing UX:
- Anchored search bar at row 0 across empty, loading, and zero-results states to eliminate layout shifting.
- Structured zero-results and query error screens with actionable guidance shortcuts (
[Ctrl+P] Switch Provider,[r] Retry,[Esc] Back). - Enclosed landing favorites list in an aligned bordered card.
- Streams Table Display:
- Replaced non-existent stream duration column with source and uploader columns, expanding room for codec and media tags.
- Grouped secondary stream audio/video codec tags (
DV,ATMOS,HEVC) with subtle separator points. - Isolated stream row selection highlight so background styling applies exclusively to the active stream row rather than table headers.
- MovieBox Client Spoofing: Updated client identity headers to APK
v4.0.01to ensure backend compatibility and avoid upgrade notice videos. - Search Prefetching: Bounded initial search prefetching to visible viewport bounds to reduce initial network requests.
Fixed
- Stream Playback & Resolver State:
- Fixed an issue where timed-out or failed stream resolutions left the playback state locked, preventing subsequent playback attempts.
- Fixed empty stream panel click focusing the pane without inadvertently triggering playback of index 0.
- Prevented transient “No stream sources found” flash while metadata or streams are loading.
- Metadata & UI Isolation:
- Guarded search preview metadata and details merging with strict provider and item ID checks, preventing stale metadata leakage when navigating quickly.
- Suppressed Sixel, Kitty, and iTerm2 poster graphics while modal dialogs or search dropdowns are open to prevent graphic bleed-through.
- Fixed poster placeholder widget incorrectly drawing over loaded images on the results screen.
- Fixed text wrapping panic on multibyte / CJK characters during title year extraction.
- Cross-Platform & Installation:
- Windows: Fixed self-update batch script losing staged binary on process exit, preserved leading backslashes on UNC paths, and sanitized NTFS forbidden characters in tracker state filenames.
- Android (Termux): Added fallback directory resolution for config, cache, and data paths, and added architecture guard preventing incompatible glibc Linux ARM64 binaries from overwriting Termux installations.
- DNS: Replaced hardcoded
/etc/resolv.confrequirement with custom resolver querying OS DNS first and falling back to public DNS (Cloudflare, Google, Quad9) on zero-config platforms. - Installers: Hardened path quoting, signal handling, and TLS 1.2 negotiation in
install.shandinstall.ps1.
Performance
- MessagePack Binary Disk Cache (
src/cache.rs): Replaced raw JSON disk caching with binary MessagePack serialization (rmp-serde) with magic signatureMBC1, versioned envelopes, and automatic migration from legacy JSON caches. - Zero-Copy IPTV M3U Parser (
src/providers/tv/parser.rs): Converted playlist attribute parsing to single-pass slice scanning, eliminating bulk heap allocations on large playlists. - Scraper Efficiency (
src/providers/fourkhdhub/): Precompiled static CSS selectors usingLazyLock<Selector>across scraping paths. - Connection Pooling & DNS (
src/net.rs): Shared static DNS resolver cache and tuned HTTP connection pool settings (tcp_nodelay, keepalive, idle timeouts).
Removed
- Removed deprecated JSON conversion adapters and untyped
serde_json::Valueservice endpoints in favor of strongly typed domain structs. - Removed redundant
[o] Open Withand[s] SubtitlesDetails shortcuts in favor of/settingsmedia player selection and automatic subtitle loading. - Removed obsolete
*favorite shortcut in favor off/F.
[0.1.14] - 2026-08-26
Added
- Favorites:
- Added a Favorites feature for starring whole movies and series (
src/favorites.rs,favorites.json), independent of watch history and unaffected by/clear-cache. - Added
*on the Home screen andf/Fon the Details screen to toggle a title’s favorite status, with a★indicator on favorited rows and a[f] Favorite/[f] Unfavoritehint on the Details screen. - Added an arrow-navigable Favorites row on the landing screen (Streaming and Addon modes) showing up to 5 recently-starred titles, with a
+N more • /favoritesoverflow link;Downfrom the search bar focuses the row,Enteropens the selected title,Escreleases focus. - Added the
/favoritesslash command, mirroring/history, to load the full starred list into the results view;*unstars the selected row there. - Added mouse support for the landing Favorites row (select/open rows, open the full list via the overflow line).
- Extracted cross-provider title-identity matching into
SubjectIdentity(src/models.rs), now shared by watch history and Favorites so remakes, cross-provider duplicates, and movie/series title collisions are deduplicated identically.
- Added a Favorites feature for starring whole movies and series (
Fixed
- External player failure reporting: Treat every non-zero player exit, including exits after several seconds or without stderr output, as a playback error instead of reconciling false watch progress.
- Search focus: Restore Backspace on the Home screen as a reliable way to focus the search input from results or Favorites.
- Season subtitles: Remember an explicit subtitle or no-subtitle choice for every episode in a season download.
- Playback state safety: Sanitize provider and subject identifiers before using them in tracker state filenames.
- Cross-platform release validation: Run all-feature locked builds/tests, binary startup smoke tests, Unix and Windows installer syntax checks, and release-target builds in CI.
- Release artifact smoke tests: Execute each native release target’s produced binary on its CI runner before archiving.
- Documentation accuracy: Document Android intent limitations, the actual Termux binary model, macOS-only IINA support, native runtime verification requirements, and the current automated test count.
- Windows VLC & player spawn fix: Removed erroneous
CREATE_NO_WINDOWflag that suppressed GUI window creation and caused VLC to crash on Windows; normalized Windows backslash subtitle paths in--sub-fileand gracefully handle subtitle download failures without breaking stream playback. - Termux player opener resolution: Resolve
termux-open,termux-open-url, andtermux-amdirectly in$PREFIX/binand static Termux paths; remove broken/system/bin/amfallback in unrooted Termux that crashed with Permission Denied (exit code 126). - Termux dependency path: Remove the Android platform-verifier dependency path that caused the v0.1.12 startup panic; real-device confirmation remains required.
[0.1.13] - 2026-08-21
Added
- Production-Grade In-App Self-Update Engine:
- Implemented modular self-update architecture (
src/updater/withcheck.rs,artifact.rs,download.rs,verify.rs,extract.rs, andapply.rs). - Added streaming SHA-256 integrity verification validating exact hash matching against release
SHA256SUMS. - Added hardened archive extraction for
.tar.gzand.zipwith strict path traversal protection against..components and absolute root paths. - Added multi-platform installation strategies: atomic binary replacement with
.oldbackup and automatic rollback on Unix/Linux/macOS/Termux, detached helper process on Windows, and Homebrew prefix detection guiding users tobrew upgrade moviebox-tui. - Added active work protection deferring self-update when active video playback or background downloads are running.
- Connected
[u]shortcut and[u] Update Nowbutton in the existing Update Available modal, preserving visual styling, animations, and dismissal model. - Added safe terminal state restoration (
disable_raw_mode,LeaveAlternateScreen,DisableMouseCapture,ShowCursor) before process exec/restart.
- Implemented modular self-update architecture (
- Update System Concurrency & Platform Compatibility Architecture:
- Added single-flight guard (
is_checking_updates) ensuring manual (/update) and automatic startup checks never spawn duplicate concurrent network requests. - Added shared geometry calculation (
UpdateModalLayout,update_modal_layout) guaranteeing 1:1 synchronization between popup rendering and mouse hit testing. - Added release asset data modeling (
Release,ReleaseAsset,TargetPlatform) with deterministic platform compatibility detection across macOS Universal, Linux x64/arm64, Windows x64/arm64, and Android Termux ARM64. - Added dedicated integration test suite
tests/update_lifecycle.rstesting update single-flighting, error recovery, mouse hit testing, and asset filtering.
- Added single-flight guard (
- Comprehensive QA & Regression Test Architecture:
- Introduced the initial 132-test automated suite covering critical algorithmic boundaries, end-to-end user journeys, watch history reconciliation & precision progress tracking, cross-mode history audit, in-app self-update lifecycle, real-world release artifact downloads, live SHA-256 verification, genuine version upgrade execution, content & metadata loading pipelines, stale request isolation, active player session lifecycle & duplicate launch protection, dynamic slash command autocomplete (
/download-dir reset), search/command draft cancellation viaEsc, error handling, addon manifest validation, mouse interactions, modal dismissals, TUI rendering across terminal size matrices, state reconciliation, crypto HMAC signing, download chunk arithmetic, and URL/stem security. - Added structured integration tests in
tests/(including content, error, TUI, history, Favorites, update, release, cache, player, TV playlist, addon, download, and URL-security suites) and test fixtures (tests/fixtures/). - Added
docs/testing.mddetailing test architecture, command references, and manual QA procedures.
- Introduced the initial 132-test automated suite covering critical algorithmic boundaries, end-to-end user journeys, watch history reconciliation & precision progress tracking, cross-mode history audit, in-app self-update lifecycle, real-world release artifact downloads, live SHA-256 verification, genuine version upgrade execution, content & metadata loading pipelines, stale request isolation, active player session lifecycle & duplicate launch protection, dynamic slash command autocomplete (
- Playback Tracking & Watch History Progress:
- Added real-time playback position tracking for
mpvwith injected tracker script (moviebox_tracker.lua) and 5-second periodic state auto-save to disk. - Added automatic startup state reconciliation (
reconcile_pending_playback_states) ensuring watched progress is preserved even when closing the terminal or killing tmux mid-playback. - Added two-tone smooth scrub line progress bars (
━─────── 1% (2h 18m left) • Watched 11h ago) and completion status badges ([✓ Completed],[✓ Watched]) in/historyand Details screens. - Added cross-provider title-based history deduplication and auto-resume from the last watched position.
- Added real-time playback position tracking for
- Addon Mode Watch History Parity:
- Added full watch history support (
/history) in Addon Mode matching Streaming Mode, enabling seamless watch progress tracking, scrub bars, and completion badges for community HTTP addon content.
- Added full watch history support (
- Pluggable Provider Trait & Capability Architecture:
- Formalized the public
ProviderandReleaseProvidertraits across all built-in scrapers (MovieBox,4KHDHub,CircleFTP,DhakaFlix, andAddons). - Added
ProviderCapabilities(supports_search,supports_pagination,supports_series,supports_subtitles,supports_homepage) andMovieBoxService::capabilities()for dynamic capability reporting. - Added structured
ProviderErrorboundaries (Network,RateLimited,NotFound,Parsing,Unavailable) with.user_message()for consistent error notifications.
- Formalized the public
- Theme System Expansion & Official Color Calibration:
- Added official Dracula, Gruvbox, and Rosé Pine themes to the
/themepicker alongside Catppuccin and Nord. - Added alias parsing support for
"dracula","gruvbox","rose-pine", and"catppuccin". - Guaranteed 100% transparent terminal compatibility across all themes with zero background opacity overrides.
- Fixed modal backdrop rendering by removing fullscreen screen clearing when opening
/theme. - Optimized live preview navigation to eliminate unnecessary disk I/O on arrow key navigation.
- Added official Dracula, Gruvbox, and Rosé Pine themes to the
- Universal Multi-OS Player Detection & Flathub/Snap Compatibility:
- Added sub-millisecond, filesystem-backed player probing across Linux (Flathub, Flatpak exports, Snap, and Native), macOS (Homebrew, MacPorts, App Bundles), Windows (Program Files, WinApps, Scoop, Chocolatey, WinGet), and Android (Termux).
- Fixed Flathub/Flatpak VLC detection failure by adding direct probes for
~/.local/share/flatpak/exports/bin/org.videolan.VLCand/var/lib/flatpak/exports/bin/org.videolan.VLC. - Added full Flathub/Flatpak and Snap compatibility for MPV (
io.mpv.Mpv,/snap/bin/mpv). - Centralized player process construction (
build_player_process_command) and standardized subtitle flag arguments (--sub-file=<path>) across all platforms.
- Codebase Optimization & Comprehensive Caching Architecture:
- Centralized application paths (
config_dir,data_dir,cache_dir,logs_dir,scripts_dir,playback_state_dir) insrc/config.rs. - Added dedicated disk caching for Addon Mode stream aggregation (
2hTTL), catalog/browsepresets (1hTTL), and verified manifests (24hTTL). - Added search pagination caching (
search_{hash}_{page}.json) preventing redundant API calls when navigating multi-page search results. - Eliminated redundant
reqwest::Clientallocations in background poster pipelines in favor of the sharedservice.http_client(). - Streamlined
MovieBoxServiceusage across background tasks and removed redundantaddon_clientfield fromAppState. - Centralized formatting utilities (
format_file_size,format_duration) insrc/tui/text.rs. - Modernized
Configloading and persistence with safe, standard Serde derives.
- Centralized application paths (
- Addon Mode (Community HTTP Addons):
- Added full support for community HTTP addon manifests (
/manifest.json,/catalog,/meta,/stream) with dedicatedCtrl+Amode switching. - Pre-installed and locked Cinemeta out-of-the-box as the default core metadata provider with zero API keys required.
- Added interactive Addon Manager dialog (
/addons,Ctrl+Pin Addon Mode) with one-click enabling, removal, and manifest URL adding. - Added concurrent multi-addon stream resolution aggregating playable releases from all enabled stream addons.
- Added a smart runtime torrent detector that automatically detects if an addon’s streams are 100% blocked raw torrents (e.g., Torrentio without Debrid) and flashes a UI warning toast that only HTTP streams are supported.
- Added full support for community HTTP addon manifests (
- Addon Mode
/browse& Curated Catalog Exploration:- Added
/browsesupport in Addon Mode with a minimal, organized 4-preset catalog picker (Top Movies,Top Series,Top Rated Movies,Top Rated Series). - Added direct catalog fetching (
/catalog/{type}/{id}.json) with poster hydration, details navigation, stream resolution, and/reloadsupport.
- Added
- Strict Slash Command Guarding & Guidance:
- Intercepted all
/slash commands to guarantee zero remote catalog network requests. - Added warning toast notifications for unrecognized slash commands (
"Command '/xyz' is not recognized. Type '/' to view available commands."). - Added platform-aware mode-guidance toasts (
^T/^S/^Aon macOS,Ctrl+T/Ctrl+S/Ctrl+Aon Linux/Windows) for mode-restricted commands.
- Intercepted all
- Active Mode & Provider State Persistence:
- Added
active_modeconfiguration field inconfig.jsonautomatically persisting and restoring the last active mode (streaming,tv,addon) and active provider across app restarts.
- Added
- Configurable Mode Navigation:
- Added
/enable-streaming,/disable-streaming,/enable-tv, and/disable-tvslash commands alongside/enable-addonsand/disable-addons. - Enforced safety validation ensuring at least one mode remains active and gracefully migrating focus when disabling the current mode.
- Added
- Dynamic Multi-Source Host & Resolver Resolution:
- Added 100% dynamic domain-based host extractor (
extract_domain_label) and stream tag parser (detect_stream_host) identifying and formatting direct hosts (Pixeldrain, Hubcloud, Fast Download, Google Drive, Mega, etc.) and debrid resolvers without hardcoded tables.
- Added 100% dynamic domain-based host extractor (
- Full Emoji & Symbol Sanitization:
- Added
strip_emojisandclean_stream_textsanitizing all raw stream titles, release names, source labels, and languages from community addons for clean terminal alignment without broken characters. - Standardized checkbox representations to clean ASCII
[x] / [ ].
- Added
- Complete Mouse Navigation:
- Added dynamic footer hitboxes for
[Ctrl+S] Streaming,[Ctrl+T] TV,[Ctrl+A] Addons,[Ctrl+P] {Provider},[?] Help,[q] Quit. - Added complete mouse click support for Addon Manager modal and browse popups.
- Added dynamic footer hitboxes for
Fixed
- Windows MSVC Static CRT Linking (
+crt-static):- Configured
target-feature=+crt-staticin.cargo/config.tomlforx86_64-pc-windows-msvcandaarch64-pc-windows-msvc, statically embedding the C runtime to eliminate externalVCRUNTIME140.dlldependency and resolve0xC0000135(STATUS_DLL_NOT_FOUND) on clean Windows installations.
- Configured
- Cross-Platform Installer Polish & Windows In-Memory Execution:
- Replaced file-based execution commands in Windows documentation with the in-memory stream pipeline (
irm ... | iex) to eliminatePSSecurityExceptionexecution policy blocks. - Added immediate active process
$env:PATHupdate ininstall.ps1so the command is recognized in the current shell session without terminal restart. - Replaced rigid fixed-width boxed summary tables with responsive, borderless hero layouts across both
install.ps1andinstall.sh, preventing broken box-drawing characters and layout overflow on narrow screens.
- Replaced file-based execution commands in Windows documentation with the in-memory stream pipeline (
- Pending History Reconciliation Order:
- Sorted pending Lua tracker state files chronologically during startup reconciliation to guarantee correct playback state replay order.
- MovieBox Title Sanitization (DEF-02):
- Fixed destructive title truncation where leading bracket tags (
[Dub],[1080p],[RAW]) and titles starting with parentheses (e.g.(500) Days of Summer) were stripped down to empty strings. - Preserved release years in parentheses (
Inception (2010)) and added a fallback safeguard returning the trimmed original title if sanitization ever results in an empty string.
- Fixed destructive title truncation where leading bracket tags (
- Watch History Identity & Deduplication Collisions (DEF-03):
- Enforced
stypeseparation inHistoryManager::is_same_showso Movies and TV Series sharing identical titles (e.g.Home) never overwrite one another. - Enforced strict canonical identity (
provider + subject_id), preventing cross-provider conflicts and ensuring remakes with differing release years remain distinct entries.
- Enforced
- Background Episode Playback State Reconciliation (MISS-01):
- Fixed a state loss bug in
reconcile_pending_playback_stateswhere a completed episode’s watched status was discarded if the user had already advanced to a subsequent episode before the state file was processed.
- Fixed a state loss bug in
- Windows MPV Script Options Path Escaping (DEF-04):
- Fixed path corruption in MPV’s
--script-optson Windows by normalizing backslashes (\) to forward slashes (/), preventing MPV escape sequence parsing from corruptingstate_filepaths inmoviebox_tracker.lua.
- Fixed path corruption in MPV’s
- M3U Single-Quoted Attribute Support (DEF-07):
- Extended
M3UParserattribute extraction to support both single-quoted (tvg-id='...') and double-quoted attributes, preserving channel IDs, logos, and groups across varied IPTV playlists.
- Extended
- Continuous OS-Level SIGINT Handling (DEF-05):
- Wrapped
tokio::signal::ctrl_c()in a continuous background loop to ensure repeated non-interactive OS signals are reliably handled.
- Wrapped
- Subtitle Prefetch Fallback (DEF-08):
- Reduced subtitle download timeout from 30s to 8s to prevent unnecessary startup delays when launching external players if a subtitle mirror hangs.
- Addon Stream Sorting & Rendering:
- Fixed addon streams randomly scrambling on UI hover when sizes are tied by adding a secondary stable sort based on the mirror label.
- Fixed misleading
0MBstream sizes for community addons that omit video sizes by cleanly rendering--instead.
- Terminal Race Condition & Blank Screen on
/clear-cache:- Replaced physical terminal clear with a soft image refresh when executing
/clear-cache, resolving a race condition with terminal emulators that swallowed the full Home screen render and caused the screen to go completely blank after a few seconds. - Added comprehensive state isolation preventing search queries, results, and details states from lingering after cache clears.
- Sanitized slash command input handling to prevent visual query glitches.
- Replaced standard status messages with elevated toast notifications for cache actions.
- Replaced physical terminal clear with a soft image refresh when executing
- Atomic Mode Highlight & Single Active Selection:
- Added canonical
AppModeenum (Streaming,Tv,Addon) and atomic state transitions guaranteeing that only one active mode is highlighted in the bottom dock at any time. - Hardened state isolation with automatic cleanup across mode switches.
- Added canonical
- Notification Readability & Word-Boundary Wrapping:
- Replaced horizontal middle-truncation with unicode display-width aware word wrapping (
wrap_text). - Added adaptive width (up to 72 chars) and dynamic height scaling with guaranteed unbroken rounded borders.
- Replaced horizontal middle-truncation with unicode display-width aware word wrapping (
- Resilient Addon Metadata & Fallbacks:
- Added flexible visitors and serde aliases for
genres,cast,director,imdbRating,releaseInfo, andruntimepreventing deserialization failures across varied community addon JSON schemas. - Added multi-tier fallback resolution in the Details screen to guarantee titles, release years, synopsis, and posters are always preserved from search results and previews.
- Added flexible visitors and serde aliases for
- Android / Termux TLS Certificate Compatibility:
- Switched
reqwestto use pure-Rust embeddedwebpki-rootscertificate verification, resolvingrustls-platform-verifiercrashes and panics in non-JVM Android CLI environments like Termux.
- Switched
- Transparent Stream & Search Diagnostics:
- Replaced misleading generic
"No matches"and"Rate Limit"errors with truthful, contextual diagnostics:"No stream sources available on {provider}","Network connection failed to {provider}","Rate limited by {provider}", and"Episode S{season}E{episode} is not listed on {provider}". - Added helpful actionable hints (
Press Ctrl+P to try another provider, or r to refresh).
- Replaced misleading generic
- Rate-Limiting & Concurrency Hardening:
- Added HTTP 429
Retry-Afterheader parsing with bounded exponential backoff inMovieBoxClient. - Added semaphore concurrency limiting (
Semaphore::new(2)) during parallel episode page resolution to prevent burst requests from tripping provider rate limiters.
- Added HTTP 429
- Addon Mode Series Hierarchy & Episode Stream Isolation:
- Fixed series misclassification as movies in Addon Mode when metadata omitted the
videosarray by ensuring canonical season structures and series-first metadata endpoint prioritization. - Added regex and token-based episode stream isolation (
parse_season_episode) instream_item_to_release, preventing cross-episode stream pollution (e.g. S01E06 streams appearing when viewing S01E08). - Added preservation of
episodeNumbersarrays from addon metadata in the season list state.
- Fixed series misclassification as movies in Addon Mode when metadata omitted the
- Direct Addon & BDIX Playback & Download Dispatch:
- Fixed Addon and BDIX playback and download routing in
handle_playbackandhandle_downloadto dispatch directly to external media players and the chunk downloader, preserving custom HTTP headers (behaviorHints.headers) and source labels without unnecessary Moviebox API subtitle timeouts.
- Fixed Addon and BDIX playback and download routing in
- Selector Tab Preservation in Standard Displays:
- Maintained visibility of Audio Languages, Seasons, and Episodes selector tabs side-by-side in standard ~80-column terminals when focusing Streams, preventing tabs from disappearing when 0 streams are available.
Changed
- Modular TV Provider Architecture:
- Reorganized Live TV / IPTV provider into a dedicated module directory (
src/providers/tv/) with separatedmodels.rsandparser.rs.
- Reorganized Live TV / IPTV provider into a dedicated module directory (
- Core Infrastructure Consolidation:
- Centralized atomic file operations (
atomic_write_file,atomic_write_file_async), MD5 digest formatting (md5_hex), and text extraction helpers incache.rsandservice.rs. - Centralized application paths, border type resolution, and mode status announcements across TUI modules.
- Centralized atomic file operations (
- Addon Manager UI Optimization:
- Implemented full cursor navigation (
Left/Rightkeys) and inline editing (Backspace/Delete) for the Addon Manager input field. - Implemented a scrolling viewport renderer for the Addon Manager input, allowing editing of very long manifest URLs without wrapping or truncation.
- Compacted the Addon Manager dialog with an aligned two-tier layout placing
[ Add Manifest URL ]and[ Done ]action buttons side-by-side.
- Implemented full cursor navigation (
- Multi-System Core Module Decoupling:
- Promoted
player.rs(process management & detection),config.rs(shared configuration), andupdater.rs(release checks) to core modules insrc/, preparing the architecture for upcoming CLI and GUI frontends with full backward compatibility.
- Promoted
Documentation
- Streamlined README & Controls Guide:
- Transformed
README.mdinto a focused landing page with measured~5 MB RAMbenchmark data, defensible value propositions, and direct links to deep guides indocs/. - Created standalone
docs/controls.mdcovering all keyboard shortcuts, mouse controls, and slash commands. - Added a 3-phase project roadmap: Terminal UI (TUI) -> Command-Line Interface (CLI) -> Desktop GUI Client.
- Added a community-first feedback and support section with optional crypto donation options.
- Transformed
[0.1.12] - 2026-08-15
Added
- CLI Help Flag: Added
-h/--helpCLI flags printing formatted usage, available options, and environment variables. - Full Mouse Support: Complete mouse navigation throughout the application:
- Click search bar to edit; click suggestion items to search immediately.
- Click search results to select/preview; click again or double click to enter Details.
- Click Details panes (Audio Languages, Seasons, Episodes, and Streams) to select and launch playback.
- Click centered footer toolbar buttons (
[Ctrl+P] Provider,[Ctrl+T] TV,[?] Help,[q] Quit). - Full click support across all modal popups (Theme, Browse, Subtitles, Players, TV playlists & actions, and Download confirmation).
- Contextual Downloads:
- Pressing
dor clicking[Download]while on the Seasons pane prompts to download the whole season (all episodes). - Triggering download while on Episodes or Streams downloads that single episode.
- Pressing
- Organized Downloads & Custom Directory:
- Structured Series downloads under
<base_dir>/Series/<Title>/Season <N>/<Title> - S<N:02>E<E:02>.<ext>and Movies under<base_dir>/Movies/<Title>/<Title>.<ext>. - Added ISO 639-1 language code tagging to subtitle sidecars (e.g.
<BaseName>.en.srt) for automatic track identification in media players and servers. - Added smart duplication prevention: completed episodes on disk are automatically skipped during season batch downloads.
- Added
/download-dir <path>slash command with directory creation and active write-probe validation. - Added
/download-dir reset(contextually suggested only when custom path is configured) to revert to OS default. - Safe automatic fallback to default OS Downloads folder if custom path becomes inaccessible.
- Configuration persistence across sessions in
config.json.
- Structured Series downloads under
- Tree Branch Suggestions:
- Redesigned search and slash command autocomplete into a minimal, transparent tree-branch layout (
├─/└─) anchored directly under the search prompt. - Added aligned slash command descriptions (
browse,history,theme,config,update, etc.) without duplicate leading slashes. - Clean typography-driven active selection with bold vibrant accent styling.
- Redesigned search and slash command autocomplete into a minimal, transparent tree-branch layout (
- Multilingual Audio Track Detection:
- Expanded 4kHDHub release parser to detect 30+ regional and international languages (Hindi, Tamil, Telugu, Kannada, Malayalam, Bengali, Marathi, Punjabi, Gujarati, Urdu, Japanese, Korean, Chinese, Spanish, French, German, Italian, etc.) and abbreviations (
Tam,Tel,Kan, etc.). - Responsive stream list formatting showing all available languages without crowding mirror counts.
- Expanded 4kHDHub release parser to detect 30+ regional and international languages (Hindi, Tamil, Telugu, Kannada, Malayalam, Bengali, Marathi, Punjabi, Gujarati, Urdu, Japanese, Korean, Chinese, Spanish, French, German, Italian, etc.) and abbreviations (
- Floating Pill HUD & Smooth Resize:
- Added floating terminal dimension HUD and event coalescing for smooth window resizing without blank screens.
- Elevated Notification Badges:
- Redesigned notification popups into elevated, rounded bottom-right badge cards with clean typography.
- Persistent Long-Term Poster Caching:
- Increased image cache retention to 30 days (
IMAGE_CACHE_EXPIRY_SECS), serving previously fetched posters instantly from disk across sessions with zero redundant network requests. - Unified image caching under a shared namespace with automatic cross-namespace lookup across MovieBox, 4KHDHub, IPTV, CircleFTP, and DhakaFlix.
- Increased image cache retention to 30 days (
- Streamlined Browse Views:
- Curated
/browseviews into 4 categorized shelves (Popular, Top Rated, Trending, Most Watched) with proper filtering.
- Curated
- Native Graphics & Single Standardized ‘No Poster’ Placeholder:
- Replaced redundant dual labels (
Poster unavailable/No Art) and noisy halfblock mosaic fallback with a single clean, centeredNo Posterlabel across search results, details, and history on non-graphics terminals. - Eliminated ANSI block characters, yellow/white selection redraw bars, and unnecessary background image downloads on basic terminals.
- Preserved full native high-resolution graphical rendering on Sixel, Kitty, and iTerm2 supported terminals.
- Added
MOVIEBOX_NO_IMAGE=1environment override to disable image probing on slow or headless sessions.
- Replaced redundant dual labels (
- Next-Gen Multi-Tiered Animated Installers (
install.sh&install.ps1):- Multi-tier progressive rendering with official MovieBox branding and Catppuccin Mocha aesthetic.
- Live smooth Braille spinners (
⠋ ⠙ ⠹ ...), SHA256 cryptographic verification againstSHA256SUMS, and media player ecosystem detection. - 100% sudo-less user-level installation into
~/.local/bin(or%LOCALAPPDATA%\Programs\MovieBox-Tui\binon Windows) with automatic non-destructive shell PATH integration and zero password prompts. - Added full CLI flags:
--version <tag>,--dir <path>,--force,--dry-run, and--uninstall.
- Explicit Download Directory Autocomplete Hints:
- Added
/download-dir <path>slash command suggestion with clear action descriptions (Set custom folder (e.g. ~/Movies)vs.View current download folder). - Added friendly guidance notification if a user inputs literal
<path>placeholders.
- Added
Fixed
- Custom Download Directory Container Hierarchy:
- Ensured custom download directories always maintain the standardized
MovieBox-TUIroot container (MovieBox-TUI/Movies/...andMovieBox-TUI/Series/...) without duplicating if already namedMovieBox-TUI.
- Ensured custom download directories always maintain the standardized
- Multiline Notification Toast Rendering:
- Upgraded notification toast layout to compute dynamic height and wrap multiline messages per line cleanly without horizontal middle-truncation across newlines.
- Sanitized notification folder paths by substituting home directory with
~.
- Default Audio Track Prioritization (Original / English):
- Fixed movie and series details defaulting to regional Hindi dubs on MovieBox by prioritizing
OriginalandEnglishaudio tracks over localized search result subject IDs. - Preserved explicit user language selections when intentionally switching between dubs.
- Fixed movie and series details defaulting to regional Hindi dubs on MovieBox by prioritizing
- Home Landing Header & Footer Persistence:
- Fixed ASCII logo header and shortcut footer disappearing into a blank screen when clearing history or viewing empty search states by removing fragile tick-based animation gates.
- Ensured the landing screen renders the logo, version, centered search bar, and footer shortcuts immediately on every frame.
- Watch History Consolidation & Latest Progress Representation:
- Consolidated watched episodes of the same series into a single entry per show in
/historydisplaying the latest watched season and episode. - Automatically deduplicated and migrated legacy history rows on startup while maintaining complete per-episode checkmark indexes in
self.watched.
- Consolidated watched episodes of the same series into a single entry per show in
- History Poster Auto-Hydration & In-Memory Cache Retention:
- Fixed “No Poster” placeholders in
/historyby automatically resolving missing cover URLs and decoding posters in the background. - Preserved in-memory decoded image caches when opening
/historyto eliminate unnecessary UI redraw latency. - Added multi-source fallback extraction for cover URLs across playback, preview, and search results.
- Fixed “No Poster” placeholders in
- Stream Pool Initialization on Audio Selection: Fixed stream fetching hanging on “Loading streams…” when selecting non-default audio dubs by ensuring stream pool entries are initialized before episode fetch.
- Title Sanitization & Preservation: Enhanced
clean_moviebox_titleto sanitize international audio dubs, video quality tags, and format markers across downloads, folder organization, and watch history while preserving 4-digit release years. - Terminal Restoration & Signal Handling: Added
Ctrl+Ckeyboard handling and asynchronousSIGINTsignal listener to guarantee raw mode and alternate screen are always cleanly restored. - Download Hierarchy & Numbering: Fixed series media type detection and removed season/episode off-by-one addition.
- Parser UTF-8 Safety: Hardened language detection boundary checks for multibyte titles against panics.
- Startup Screen Artifacts: Removed early startup
eprintln!to eliminate terminal screen artifacts before entering alternate screen mode. - Android / Termux Stability: Removed
hickory-dnsfrom network dependencies to resolve NDK context panics and crashes on Android. - Screen Flickering & Blanking:
- Eliminated full terminal clear on list navigation and infinite scroll pagination.
- Fixed screen blanking when pressing
Escor resizing windows. - Replaced terminal clear with direct backend clear to eliminate cursor read timeouts.
- Search & Navigation:
- Fixed search bar auto-closing when switching providers.
- Fixed provider switching delays and event stream drops.
- Kept chosen audio dub selected and prevented unwanted pane jumping on details refresh.
- Handled empty query loading states and preset failures gracefully.
- Downloads & Playback:
- Resolved MovieBox movie stream key mismatches and hardened resilient download flows.
- Protected active downloads from accidental cancellation when typing
xin the search bar. - Fixed playback lock edge cases and subtitle picker clipping.
- Theme & Configuration:
- Fixed theme cancellation reverting correctly without persisting unapplied themes.
- Unified
/themecommand and removed obsolete/discover,/tab, and/themesaliases.
Changed
- Removed startup screen delay for instant app launch.
- Modernized in-place update notifications and dialogs.
- Rendered details footer on a single clean line to balance bottom margins.
- Removed search bar underline clutter in favor of clean header spacing.
[0.1.11] - 2026-08-11
Added
- User-Owned M3U Playlists: Full custom playlist management in TV mode with remote URL and local file support.
- Android Runtime Support: Termux playback and shared-storage handling continue to be exercised on real devices, but release artifacts remain desktop-focused.
Refactored
- Domain Modularization: Split the application monolith into cohesive domain modules (
network,playback,download,requests,navigation,tv,system,keyboard). - State Decomposition: Split the monolithic application state into specialized domain state structs.
- Strict Verification Gates: Enforced workspace lint checks, static analysis, and testing.