MpvRx v1.5.0-preview.3
Pre-release
Pre-release
1.5.0-preview.3 — Preview Release
Playback Hotfix
- Audio and video transitions rebuilt: Every item is loaded with file-local video-track selection, preventing audio state from producing a black screen on the next video.
- Reliable next-item playback: Runtime navigation now sends an actual mpv
loadfilereplacement and clears the previous EOF pause state. - Preference-safe EOF handling: Autoplay, Repeat One, Repeat All, Shuffle, playlist mode, and close-at-end now behave consistently, including very short audio files.
- Safe seeking: Audio never enters the native video-thumbnail path, and video thumbnails are generated only on demand while scrubbing—not automatically during file load.
- Separated render surfaces: The blob surface is mounted only for media independently identified as audio, preventing it from covering video during track-list transitions.
- True beat response: With audio-capture permission, real FFT data exclusively drives the blob; brightness and bloom are reduced while bass onsets pulse more clearly.
🔊 Audio Blob Visualizer
- OpenGL ES 3.0 blob visualizer — when playing audio without cover art, a reactive 3D blob appears behind the player controls. The blob morphs, pulses, and shifts color based on audio energy with a bloom/glow post-process.
- Touch rotation: Drag the blob to rotate it in 3D.
- Pinch zoom fixed: The blob now properly shrinks/enlarges when pinching —
pinchScaleFromRenderer()was hardcoded to always return1f, resetting zoom on every new gesture. - Smaller default size: Camera distance increased so the blob fits cleanly within screen bounds instead of nearly filling the height.
- Audio Preferences toggle: New "Audio blob visualizer" switch in Settings > Audio to enable or disable it.
- Audio filter setting moved: Audio filter (compressor/equalizer) options now live in Audio Preferences instead of the player's MoreSheet.
🎬 yt-dlp Changes
- Audio quality preferences: Independent bitrate caps for
Auto, 64, 128, 192, and 256 kbps — composed with existing codec, resolution, FPS, HDR, and container selectors. - Serialized URL loading: Initial and replacement URL loads now use one cancellable serialized job, preventing overlapping libmpv commands when links are pasted rapidly.
- Graceful error recovery: Recoverable URL load failures return to the player UI with an error message instead of escaping to the process-wide crash handler.
- Audio quality removed from MoreSheet: yt-dlp audio quality selector moved from the player's MoreSheet to yt-dlp settings.
📻 Audio Browsing
- MediaStore + filesystem discovery for common audio formats, neutral media counts, audio MIME mapping, and Android 13
READ_MEDIA_AUDIOpermission handling. - Audio cards show metadata titles, embedded cover artwork when available (via
audio-display=embedded-first), and a music-note fallback icon. - Portrait-only playback — audio files force sensor-portrait orientation and prevent the rotation action from switching back to landscape.
- Sibling playlist includes audio — when "Include audio" is on, the next/previous track list includes audio files from the same folder.
- Audio icon placeholder fix: Exported icon now displays correctly for audio files without cover art.
- Audio pitch correction fix: Pitch correction no longer persists when switching to a new video — resets to default per-file.
- Audio autoplay race condition fixed: Eliminated a race condition that could cause audio files to fail starting playback.
🌐 Network & External Playback
- WebDAV PROPFIND fix: Connection checks now use a depth-zero
PROPFINDrequest instead of Sardine'sHEAD-basedexists()call, making it work with servers like FileBrowser Quantum that rejectHEADon DAV collections. - WebDAV trailing slash: Collection URLs consistently keep a trailing slash during validation and browsing.
- External-player discovery: Added a MIME-only intent filter so external-player pickers can find mpvRx before attaching the final video or audio URI.
- More protocol support: Added
gopher://,sctp://, anddata://to network stream detection and intent filters. - Stream compatibility improved: Better handling of edge-case media streams and improved browsing reliability.
🌲 Tree View Navigation
- Configurable path compression: New
Off, 1–5, andUnlimitedchoices for single-child folder flattening. Applied independently per navigation step, preserving predictable physical paths. Tree View refreshes instantly when the depth changes.
🎨 Icon Consistency
- Converted all three
painterResource(R.drawable.ic_material_symbols_check)usages toIcons.Default.Checkthrough the app'sAppIcon/Iconsystem. SectionHeader.leadingIconandCompactExpressiveIconButton.imageVectornow acceptAppIconinstead of rawImageVector, keeping everything on the unified icon pipeline.
🔊 Audio Playback Runtime Fixes
local_media_pathextra: Internal launches now pass the resolved filesystem path alongside the content URI, giving mpv a reliable fallback whencontent://URIs fail.- Serialized load dispatcher: Added a dedicated
Dispatchers.Default.limitedParallelism(1)dispatcher for media loading — prevents race conditions when queuing multiple load commands. vid=autobefore playback: Non-M3U file loads explicitly reset the video track to auto before loading, avoiding "no video track" state from previous audio-only plays.audio-display=embedded-first: Enabled MPV's embedded cover art rendering for audio files.- Orientation on audio launch:
setOrientation()checksisKnownAudioLaunch()immediately, before the track-list event settles — fixes the black-screen + landscape glitch on audio start. - Subtitle "Off" option: Added an explicit "Off" choice in the player subtitle sheet so users can disable subtitles without cycling through all tracks.
🗑️ Folder Deletion Behavior
- Media-only deletion (default): Deleting a folder now only removes audio/video files — other files (images, logs, documents) are left untouched.
- "Delete folder + all contents" toggle: New option in Appearance Settings > File Browser to switch back to full recursive deletion when needed.
- Album View cleanup fix: Fixed an issue where the last video file in a folder was deleted but the empty folder remained.
📱 Tablet & Display
- Dynamic refresh rate: The player can now dynamically adjust the display refresh rate to match the video frame rate for smoother playback.
- Dual-pane navigation fix: Resolved a state leak that could cause crashes when navigating in tablet dual-pane mode.
- Dual-pane settings button hidden: The redundant settings button is no longer shown in dual-pane mode on tablets.
- Folder card height fix: Manual grid column counts now align properly with folder card heights in dual-pane layout.
🔍 Settings Search
- Search history: Recently searched terms are saved and displayed for quick re-selection.
- Search suggestions: The search field now shows contextual suggestions as you type.
- Reflection-based fallback: Settings search can dynamically discover settings via reflection when static indices are incomplete.
Checksums
| Variant | SHA-256 |
|---|---|
| arm64-v8a | 83ed6765f26c09f496a8b44f2d079abe4e23fd0d1390a1b3d2e29c14d43da559 |
| armeabi-v7a | e82c44e48b13adb33b059ea45459668e5ee105ea76d395eb1dd6ce5aa2869815 |
| Universal | 67e5f1115d7f36dc14f44492f88038a52519341efe11e05737a9aa0e7851d823 |
| x86 | b42268a2553158dfd6bfc771a02420963fac13199ecc76396b95d93a0209a7e1 |
| x86_64 | a669725cd34d17b53a65745844415f58e1ba8db611261a3f3a561c7c0187d3d4 |
What's Changed
- feat(settings): implement dynamic, localized reflection-based fallback for settings search by @Arnab11 in #194
- fix(ui): resolve tablet dual-pane navigation state leak and hide redundant settings button by @Arnab11 in #195
- fix(browser): align manual grid default column count and folder heights in dual pane mode by @Arnab11 in #197
- i18n: Arabic localization by @AhmedRX20 in #203
- 1.5.0-preview.3 — Audio browsing, WebDAV fix, yt-dlp audio quality, tree flatten, icon cleanup by @Riteshp2001 in #212
New Contributors
- @AhmedRX20 made their first contribution in #203
Full Changelog: v1.5.0-preview.2...v1.5.0-preview.3