Changelog v1.2.0-Beta(3)
A major stabilization, playback performance, and architecture update. Focus on playback latency, synchronized lyrics reliability, Spotify/YTM dual-mode library sync, background Canvas video engine, and in-app updates.
✨ Highlights
🔁 Dual-Source Likes & Library Synchronization
- Independent Source Flags: Migrated database (Room 35 → 36) to track
likedYtmandlikedSpotifyseparately. Liking a song on YouTube Music no longer corrupts Spotify library state, and vice versa. - Unified Read Semantics: UI hearts and badges reflect union state (
likedYtm || likedSpotify), while local lists, filters, and counter badges strictly honor the selected service context. - Set-Diff Sync Engine: Reworked background sync using fast set-difference operations and batch lookups. Syncing 1000+ tracks now runs in milliseconds without UI freezes or database lockups.
- Asymmetric Unliking & Mutex Guards: Single-tap fully unlikes across the active source; added dedicated in-flight sync guards and cooldown timers to prevent rate-limiting.
🎨 Looping Video Canvas Engine (Spotify / Apple)
- Instant Disk Caching: Canvas videos now download and cache immediately upon track resolution. Local MP4 files take strict priority over network streams, killing replay latency and mobile data waste.
- ExoPlayer CacheDataSource: Video streaming is now wrapped in a shared MediaCache layer.
- Zero-Leak Transitions: Switching tracks immediately clears previous canvas artwork and releases the old video player; no old video flashes while the new track loads.
- Aspect Ratio & Geometry Fix: Fixed horizontal text cropping on modern 20:9 displays. Immersive canvas artwork now scales at full 3:4 aspect ratio with an 80% gradient fade behind seekbars and controls.
- Pause Synchronization: Fixed background video continuing to play when audio is paused.
🎤 Synchronized Lyrics Engine
- Generation & Desync Guards: Added atomic generation tokens and media ID verification across all coroutine suspend points. Rapid track skipping will never leave the previous song's lyrics scrolling over new audio.
- LRC Word-Timing & Mirror Pipeline: Fully restored upstream provider parity for LRCLIB, Kugou, Paxsenix, and BetterLyrics.
- Clean Fallback Handling: Missing lyrics or
LYRICS_NOT_FOUNDnow reliably clears the screen and ticker instead of freezing previous lines. - Removed Mini-Lyrics: Removed the experimental flickering lyrics text from the player controls column.
🔄 In-App Updater & Cast
- Direct APK Download & Install: Switched in-app installer to the unified OkHttp engine with streaming progress and package-installer intent redirects.
- FOSS Fallback: On FOSS builds, updates gracefully route to external browser releases.
- Cast Integration: Restored 3-dot sheet Cast picker on GMS builds with unified YDS button styling.
⚡ Architecture, Network & Monolith Splits
- Unified Network Layer: Enforced a single shared OkHttp client across all modules (DoH, rotating proxy, proxy authentication, connection pools). Eliminated isolated engine cross-kills.
- Database DAO Modularization: Fully decomposed the 2500-line monolithic
DatabaseDaointo 9 focused domain DAOs (SongDao,PlaylistDao,AlbumDao,ArtistDao, etc.) behind a unified database facade. - Provider Decoupling: Split monolithic
PaxsenixLyrics(5 backends) andBetterLyrics/TTMLParserinto focused parsers and internal client delegates without breaking public APIs. - YTPlayerUtils & Spotify Split: Extracted player resolution, stream caching, and error mapping from
YTPlayerUtils; isolated Spotify GraphQL, library, search, and playlist operations into modular components. - AI Content Filter: Ported optional AI content filtering to sanitize automated/AI-generated tracks from recommendations and feeds.
🛠️ Key Bug Fixes & Refinements
- Player & Sheets: Fixed sheet gesture swallowing, dismiss teleport glitches, and unified modal backdrop blur layers.
- Storage Settings: Replaced hardcoded paddings and ad-hoc card margins with standard YDS design tokens.
- Background Playback: Hardened Foreground Service start notifications against Android 16
ForegroundServiceStartNotAllowedException. - Haptics: Standardized player, lyrics menu, and dismiss gestures on
LocalYumaHaptics.