Added
- Dramachi Native Streaming Provider:
- Integrated Dramachi as a native streaming provider for Asian dramas, K-dramas, C-dramas, anime, and movies via
https://api.nodeobjects.com/. - Added direct HTTP byte-range video streaming support (
direct_file: true) bypassing CloudFront proxies and authentication overhead. - Added multi-dub and language rip resolution supporting original, English, and localized dubs with composite subject ID routing (
{title_id}::{rip}). - Added
ProviderKind::Dramachisupport acrossMovieBoxService, TUI search, details, stream resolution, downloads, settings, and badges ([Dramachi]).
- Integrated Dramachi as a native streaming provider for Asian dramas, K-dramas, C-dramas, anime, and movies via
Fixed
- Human-Readable Subtitle Filenames & Intent Storage:
- Formatted subtitle filenames with media titles and season/episode tags (e.g.
<Title> - S<N:02>E<E:02>.<ext>) insrc/service.rsandsrc/tui/app/playback.rs, replacing random process/timestamp IDs for easy identification in external player file pickers (moviebox_subs/).
- Formatted subtitle filenames with media titles and season/episode tags (e.g.
- Concise Stream Failure Messages:
- Simplified verbose stream failure messages (
Provider is temporarily unavailable: No stream sources available) across the details screen (src/tui/screens/details.rs) and notification bar (src/tui/app/requests.rs) to concise, direct notices (No streams available on <Provider>.).
- Simplified verbose stream failure messages (
- Stream Proxy Subtitle Whitelist & Scope Isolation:
- Permitted external subtitle CDN hosts in
src/proxy.rsproxy connection validation, preventing HTTP 403 errors when media players fetch external subtitle tracks alongside DASH stream manifests. - Scoped authentication headers exclusively to target video hosts, preventing credential spillage to subtitle CDNs.
- Permitted external subtitle CDN hosts in
- Stremio Addon Mode Series Metadata Resolution & Episode Picker:
- Encoded media type hints into Addon catalog and search results (
series:{id}andmovie:{id}) insrc/providers/addons/adapter.rs, preserving search intent across preview prefetching and details resolution. - Hardened metadata probing in
AddonClient::details(src/providers/addons/mod.rs) to prioritizeseriesqueries and check for episode videos (!videos.is_empty()) before falling back tomovie, resolving an issue where series (e.g. Breaking Bad) fell back to corrupted movie metadata ("Mirror") lacking episode lists. - Normalized subject IDs in
src/providers/addons/aggregator.rsbefore constructing stream query IDs ({clean_id}:{season}:{episode}for series,{clean_id}for movies), including support for Season 0 (Specials). - Fixed Season 0 episode count and index calculation in
season_confirm_summary(src/tui/screens/details.rs). - Replaced verbose stream failure and missing addon messages with concise status notices in
src/tui/app/requests.rs. - Aligned Addon Mode empty search results with Streaming Mode by returning
Ok(vec![])on zero-result queries instead of triggering a boxedSearch Request Error, restoring the standard no-results view with[ Try on MovieBox (^P) ]and[ Clear Search (c) ]pills. - Returned
Ok(vec![])on empty addon catalogs inMovieBoxService::fetch_addon_catalog(src/service.rs), preventing empty catalog views from raising false search failure errors. - Reset
active_screentoScreen::Homeinreset_mode_state(src/tui/app/tv.rs), preventing orphaned Details screen states when switching between TV and Streaming modes.
- Encoded media type hints into Addon catalog and search results (
- Logging Engine, Crash Diagnostics & Backtrace Capture:
- Added stack backtrace capture (
std::backtrace::Backtrace::capture()) and immediate log buffer flushing (moviebox_tui::logging::flush()) tostd::panic::set_hookinsrc/main.rs, ensuring crash locations and backtraces are committed to disk before terminal restoration and process termination. - Standardized default file log level to
infoacross all builds insrc/logging.rs, ensuring session startup metadata, player lifecycle commands, and exit durations are consistently captured without requiring manualMOVIEBOX_LOGconfiguration. - Retained
LoggerHandleglobally insrc/logging.rswith graceful fallback to default logging levels ifMOVIEBOX_LOGcontains an invalid level specification. - Re-routed Windows logs directory (
crate::config::logs_dir()) to Local AppData (%LOCALAPPDATA%\moviebox-tui\logs) to align with documentation and avoid roaming enterprise profile sync issues. - Hardened
sanitize_urlinsrc/logging.rsto redact embedded user/password credentials (user:pass@host), preserve original URI schemes, and retain port numbers for localhost and custom IPTV ports. - Sanitized and bounded player crash error messages (
clean_player_error) insrc/tui/app/playback.rs, preventing unbounded stderr streams and CDN auth tokens from leaking into error logs. - Added desktop player launch banners and clean exit logs with duration tracking to
src/tui/app/playback.rs. - Added HTTP status code validation (
error_for_status()) inDramachiClientandCircleFtpClient, preventing HTTP 403/502/Cloudflare errors from masquerading as misleading JSON parse failures. - Added diagnostic logging for system DNS fallback to public resolvers and probe failure statuses in
src/net.rs. - Added warning logs for disk write and serialization failures in
src/cache.rs::set_typed_cache.
- Added stack backtrace capture (
- BDIX DhakaFlix Configuration Persistence:
- Loaded
bdix_dhakaflix_enabledfrom saved configuration inApp::new(src/tui/app/mod.rs), preventing DhakaFlix provider toggle from resetting to disabled upon restarting the application.
- Loaded
- M3U Playlist Parser Async Cache Probing:
- Replaced blocking synchronous
file_path.exists()check inM3UParser::fetch_playlistwith non-blockingtokio::fs::try_existsinsrc/providers/tv/parser.rs, eliminating async event loop stalls during remote playlist caching.
- Replaced blocking synchronous
- HTTP Client Builder Timeout Floors:
- Enforced baseline connection (
15s) and request (60s) timeout floors inhttp_client_builder(src/net.rs) to prevent stalled HTTP connections across external providers without explicit timeouts.
- Enforced baseline connection (
- Pruned Dead BDIX Release Stubs:
- Removed unused
resolve_releaseidentity functions fromCircleFtpClientandDhakaFlixClient(src/providers/bdix/).
- Removed unused
- Hardened Issue Templates & Automated Triage:
- Added
Android (Termux)option, mandatory pre-flight checklist, and sanitized terminal log output requirement to.github/ISSUE_TEMPLATE/bug_report.yml. - Added direct links to GitHub Discussions and Termux setup documentation in
.github/ISSUE_TEMPLATE/config.yml. - Added automated
incomplete-issue.ymlworkflow to flag and comment on vague issue reports lacking diagnostic context. - Added automated
stale.ymlworkflow to close unresponsiveneeds-infoissues after 7 days.
- Added
- Security & Terminal Signal Hardening:
- Enforced host authority whitelist validation against
target_hostin local proxy sidecarhandle_connection(src/proxy.rs), returning HTTP 403 Forbidden on host mismatch to prevent Server-Side Request Forgery and unauthorized auth header leakage. - Enforced HTTP and HTTPS scheme validation on percent-decoded subtitle URLs in proxy
extract_target_url(src/proxy.rs), preventing arbitrary URL scheme forwarding. - Registered Unix
SIGTERMandSIGHUPsignal handlers inEventHandler::new(src/tui/event.rs) routing toAction::Quit, ensuring proper terminal de-initialization and alternate screen restoration viaTerminalGuardon process termination. - Replaced silent
reqwest::Client::newfallbacks with explicit builderexpectassertions inMovieBoxClient,DhakaFlixClient, andCircleFtpClient, preventing silent networking degradation without shared DNS and connection pooling configurations. - Added canonical path containment checks in
start_resilient_download(src/tui/app/download.rs) ensuring download target paths resolve within the configured download directory tree.
- Enforced host authority whitelist validation against
- Cross-Platform Compatibility & Player Integration:
- Stripped Windows extended-length verbatim prefix (
\\?\) instart_resilient_download(src/tui/app/download.rs), preventing false-positive download containment failures when comparing canonicalized base directories with un-canonicalized target paths. - Added environment variable expansion for
REG_EXPAND_SZvalues in Windows registry queries (src/player.rs), allowing automatic discovery of player binaries configured with%USERPROFILE%,%SystemRoot%, or%LOCALAPPDATA%paths. - Retained downloaded local subtitle files for Android intent launches in
src/tui/app/playback.rswithout premature process-exit deletion, avoiding loopback proxy URLs (http://127.0.0.1:<port>/sub/...) and allowing external players (VLC, MX Player) to load subtitles from shared storage before background cleanup. - Gated Kitty keyboard enhancement protocol flags (
PushKeyboardEnhancementFlags) behind!is_termux_environment()insrc/main.rs, preventing unsupported escape sequence noise on mobile touch terminals. - Restricted Termux shared storage subtitle directory probing (
~/storage/downloads/moviebox_subs) to verified Termux environments insrc/main.rsandsrc/cache.rs. - Added Flatpak
@@file forwarding markers for local file andfile://URLs inmpv_commandandvlc_command(src/player.rs), ensuring Flatpak Document portal exports media and subtitle files into sandboxed player containers.
- Stripped Windows extended-length verbatim prefix (
- Audio Track Switch Metadata & Synopsis Preservation:
- Preserved rich metadata (duration, synopsis, genres, cast, crew, and clean title) when switching audio dubs on the Details screen in
src/tui/app/requests.rs. - Resolved an issue where selecting an audio track (e.g. Hindi dub) caused duration (
2h 20m) to disappear and replaced the multi-line synopsis with a title placeholder (Ek Deewane Ki Deewaniyat), breaking visual balance against the poster. - Sanitized window title in
contextual_title(src/tui/app/run.rs) usingclean_moviebox_titleto prevent raw dub tags ([Hindi]) from leaking into the terminal window title.
- Preserved rich metadata (duration, synopsis, genres, cast, crew, and clean title) when switching audio dubs on the Details screen in
- MovieBox Edge-Cache CDN Stream Manifest Resolution:
- Added
Edge-Cache-CookieurlprefixBase64 decoding inresolve_dash_manifest_from_policy(src/providers/moviebox/adapt.rs). - Resolves active multi-quality MPEG-DASH manifests (
https://sbcdn*.hakunaymatata.com/dash/.../index.mpd) generated under MovieBox's updated CDN token structure. - Fixes playback and stream resolution failure (
No stream sources available) across movies and episodic series where previous parser only checked forCloudFront-Policy.
- Added
- Settings Sub-Popups & Picker Dialog Anchoring:
- Unified sub-popup positioning (
Streaming Sources,Default Media Player,Theme,Browse) to anchor directly inside Settings & Preferences (settings_picker_layoutinsrc/tui/overlay.rs) rather than floating into empty screen space on tall terminal windows. - Stabilized Settings & Preferences modal height across all category tabs (
General,Content Modes,Appearance,Maintenance) to 9 rows, eliminating dialog jitter when cycling tabs. - Synchronized mouse click detection in
src/tui/app/mouse.rswithsettings_picker_layoutandbrowse_picker_layout.
- Unified sub-popup positioning (
- Update Modal Minimalist Redesign & Single-Surface Card:
- Redesigned update popup from a multi-compartment divided box into a clean, single-surface dialog card (
src/tui/overlay.rsandsrc/tui/app/run.rs). - Embedded version directly in the top title frame (
Update Available: vX.Y.Z) and docked primary actions directly into the bottom border ([u] Update ──── [o] GitHub), eliminating all internal divider lines and wasted vertical padding. - Unified modal positioning by anchoring both update notification and in-progress update modals directly at the landing search bar position (
home_search_y), keeping the dimmed ASCII logo visible above while focusing full attention on update progress. - Integrated category badges inline with release highlights (
[Added],[Fixed],[Changed],[Perf]) while retaining full Markdown compatibility with GitHub release notes. - Streamlined in-progress update modal into a compact 42-column status pill (
Updating: vX.Y.Z) displaying active mechanical stage (Downloading release,Verifying checksum,Installing binary) without noisy warning labels or type mixing.
- Redesigned update popup from a multi-compartment divided box into a clean, single-surface dialog card (
- Details Poster Geometry Stability Across Dub Synopsis Lengths:
- Locked
content_rowsto 6 inDetailsLayoutTier::header_height(src/tui/screens/details.rs) whenshow_posteris active, maintaining consistent 8-row header height and 6-row poster container dimensions. - Prevented poster image shrinking and header layout shifts caused by variable synopsis text lengths across audio dubs and releases.
- Locked
- Single-Line Input Windowing & Overflow Prevention:
- Fixed text overflow in
render_single_line_input(src/tui/widgets/input.rs) where appending ellipsis (...) without sufficient budget caused line length to exceed modal width and trigger word wrapping onto a second line. - Reserved 3 columns for trailing ellipsis when characters remain past the cursor and removed
Wrapon single-line input widgets, keeping prompt symbols and text strictly single-line across all cursor movements.
- Fixed text overflow in
- Addons Manager Search Bar Anchor & Overlay Isolation:
- Anchored Addons Manager popup directly in place of the landing search bar using unified
home_search_ygeometry insrc/tui/overlay.rs. - Gated the landing search bar, search suggestions, provider pill popup, and discovery decks in
src/tui/screens/home.rsduring active Addon Manager sessions, preventing background search bar leakage.
- Anchored Addons Manager popup directly in place of the landing search bar using unified
- MovieBox Deprecation Notice Stream Filtering:
- Filtered deprecation notice video URLs (
macdn.aoneroom.com/other/, notice video hashb164fbfb4347792950bdfbfb563d39d9) from community resource releases insrc/providers/moviebox/adapt.rs. - Prevented 21-second upgrade announcement video placeholders from leaking into stream selection as playable releases when episodes lack official DASH streams.
- Filtered deprecation notice video URLs (
- Audio Dub Label Sanitization & Stream Quality Deduplication:
- Prevented blank audio track gap in episode details by mapping standalone
"Dub"version tags to"English Dub"inclean_language_name(src/tui/screens/details.rs). - Added native
540presolution badge mapping insrc/tui/widgets/badge.rsto distinguish true540pmedia encodes from480p. - Deduplicated episode entries in
src/providers/dramachi/client.rsacross multi-resolution manifests, preventing duplicate episode rows while sorting available streams in descending resolution priority.
- Prevented blank audio track gap in episode details by mapping standalone
- 4KHDHub Resolution Detection & Numeric Sorting:
- Expanded
detect_qualityinsrc/providers/fourkhdhub/parser.rsto detect4K,UHD,2160,1080,FHD,720,HD, and480tokens. - Replaced ASCII string sorting with numeric resolution sorting (
resolution_u64()descending, thensize_bytesdescending) inparse_releases, ensuring 4K UHD BluRay REMUXes prioritize ahead of lower-resolution streams.
- Expanded
- MovieBox High-Bitrate Server Catalog Merging:
- Merged mobile DASH manifests (
/subject-api/play-info/v2) and full-bitrate server files (/subject-api/resource) concurrently inMovieBoxClient::episode_streams(src/providers/moviebox/mod.rs), deduplicating stream links and sorting releases by numeric resolution and size.
- Merged mobile DASH manifests (
- External Player Adaptive Quality Optimization:
- Added
--ytdl-format=bestvideo+bestaudio/bestand--hls-bitrate=maxtompvcommand invocation insrc/player.rsto prevent adaptive demuxers from locking into low-bitrate streams. - Added
--adaptive-logic=highestto VLC invocation insrc/player.rs.
- Added
Changed
- Minimalist Addon Manager Modal Redesign & Balanced Geometry:
- Streamlined Addon Manager popup into a content-fitted modal matching the provider popup design language, eliminating empty right-side letterboxing and arbitrary vertical blank gaps.
- Replaced noisy capability bracket badges (
[Core],[Meta],[Streams],[Catalog]), button bracket wrappers ([ Add Manifest URL ]), and arbitrary gap rows with continuous list rhythm, clean checkmarks (✓) for active addons, symmetric 2-cell horizontal padding, and full-width background highlight bars (highlight_symbol("")). - Aligned mouse click hitboxes and keyboard navigation with simplified two-variant row indexing (
Addon(usize)andAddUrl).
- Contextual
/configCommand Separation & Slash Command Cleanup:- Promoted
/configto a dedicated slash command rather than an alias for/settings. - Restricted
/configsuggestion visibility to contexts where a configuration modal exists: TV mode (playlist manager) and Addons provider (manifest manager). - Added a contextual guidance notification when
/configis entered while MovieBox or 4KHDHub is active, prompting users to use/settingsfor preferences or switch to Addons (Ctrl+P/^P) to configure addons. - Restored missing
/browsedescription inSlashCommand::description_forto display proper annotations in search suggestions. - Added contextual
/configcommand row to in-app help overlay (?) under TV Mode and Addons provider. - Pruned redundant and confusing slash command aliases (
/pref,/preferences,/options, and/fav), establishing/settingsand/favoritesas single canonical commands while retaining universal terminal conventions (/?for/help,/q//quitfor/exit).
- Promoted
Refactored
- Streamlined MovieBox Episode Stream Resolution:
- Replaced speculative parallel
get_resourcesand secondaryfetch_resource_pagefallbacks inproviders/moviebox/mod.rswith directplay-info/v2resolution. - Eliminated sprawling 60-page background resource pagination loop in
src/tui/app/requests.rs, cutting redundant network requests and preventing dead community upload parsing.
- Replaced speculative parallel