13.13.5
Changelog
Changes in v13.13.4..HEAD:
Highlights
- SpotiFLAC Integration — experimental alternative audio source with extension-based architecture, session management, and dedicated settings screen. (Hush)
- Persistent URL Cache — stream URLs survive app reinstalls via MediaStore fallback; background refresh keeps URLs fresh. (Hush)
- Liked Music Queue Fix — playing from YouTube playlists (including Liked Music with 800+ songs) now builds a full queue instead of a 1-song queue. (Hush)
- GrowingListQueue — online playlist queues grow dynamically as the user scrolls, loading more songs into the playback timeline. (Hush)
SpotiFLAC (Experimental)
- Extension-based audio source — SpotiFLAC integrates as a pluggable audio source via an extension framework (
ExtensionRuntime,ExtensionManifest,ExtensionSignedSession). (Hush) - Session management —
SpotiFLACSessionManagerhandles bootstrap, session persistence, HMAC rolling-key authentication, and automatic session recovery on 401/403 errors. (Hush) - Playback resolver —
SpotiFLACPlaybackResolverresolves stream URLs from SpotiFLAC with quality cascade (FLAC → AAC → OGG) and relay gateway support. (Hush) - Settings screen — dedicated SpotiFLAC settings page with session info, test connection, quality selection, and developer diagnostics. (Hush)
- Moved to Dev Settings — SpotiFLAC master toggle lives under Developer Options; Audio Sources page shows experimental warning label. (Hush)
- YouTube toggle grey-out — when SpotiFLAC is disabled, the YouTube source toggle is greyed out (always on). When SpotiFLAC is enabled, both sources can be toggled independently. (Hush)
Player
- Like button fix — heart/like toggle now correctly sends
toggleLikewith proper media ID and logs the result via Timber. (Hush) - YouTube song skipping fix — improved mid-playback error detection and stream URL recovery; HTTP 403/404/410 errors from expired YouTube stream URLs now trigger automatic URL invalidation and retry instead of skipping to the next song. (Hush)
- Proactive URL refresh — background coroutine polls every 30 seconds and refreshes stream URLs before they expire, preventing mid-song failures. Configurable refresh interval in Settings → Storage (Off / 6h / 12h / Daily / Weekly). (Hush)
- Playback startup speed — removed redundant
player.prepare()calls that added 10–15s cold-start delay;prepare()is now called once immediately afterExoPlayer.Builder().build(). (Hush) - Stream recovery tracker — improved
PlaybackStreamRecoveryTrackerwith better error classification and retry logic for transient network failures. (Hush) - Source label display — resolved case where the audio source label in the player bottom bar wasn't showing for all songs. (Hush)
Queue
- Liked Music / Online Playlist queue — song taps in
OnlinePlaylistScreennow build the queue from loaded playlist songs (same pattern as Top 100, Auto, Local, Cache screens) instead ofYouTubeQueue.playlist()which returned 1 song for Liked Music. (Hush) - GrowingListQueue — new queue implementation that captures all currently-loaded songs at tap time and grows as the playlist screen loads more pages via scroll. Includes unit tests. (Hush)
- MusicService auto-load-more — improved the auto-load-more coroutine logic;
nextPage()call now only deduplicates when the first new item actually matches the last queued item. (Hush)
Waze Bridge
- Queue display in Waze — Waze audio panel now shows the full playback queue with track names, artists, and artwork. Two-level MediaBrowser hierarchy: root shows "Hush Queue" group, drill-down shows individual tracks. (Hush)
- Tap-to-play — tapping a song in Waze's queue automatically starts playback (skip + play command). (Hush)
- Play/pause fix — Waze pause command now correctly pauses playback. Fixed broadcast fallback that was sending to a Service component instead of the dynamically registered WazeCommandReceiver. (Hush)
- Previous track button — notification now shows Prev/Pause/Play/Next in compact view. (Hush)
- Broadcast fallback — all Waze→Hush commands (play, pause, next, prev, seek, queue item, search, sync) now fall back to broadcast with action+package (no explicit component) when startForegroundService fails on Android 14+. (Hush)
- sendCommandToHush unified — extracted
sendWazeCommandToHush()helper for seek, queue item, and search commands with consistent broadcast fallback. (Hush) - onPlayFromMediaId routing — tapping a specific queue item in Waze sends the correct
skip_to_queue_itemcommand instead of generic play. (Hush) - CoroutineScope leak fix — replaced ad-hoc
CoroutineScope(Dispatchers.Main)launches with a managedserviceScopethat is cancelled on service cleanup. (Hush) - Debounce map cleanup —
lastCommandTimeByTypemap now prunes stale entries every 50 commands to prevent unbounded growth. (Hush) - WazeCommandMapper tests — 14 unit tests for Messenger message → command translation. (Hush)
- WazeCommandHandling tests — 19 unit tests for MusicService Waze command protocol. (Hush)
- WazeBroadcastFallback tests — 13 unit tests for broadcast fallback contract. (Hush)
- All 3 shim APKs updated — Spotify, YouTube Music, and Deezer shims rebuilt with queue display, auto-play, and reliability fixes. (Hush)
- Updated waze-shims.zip — rebuilt bridge APKs with all fixes. (Hush)
YouTube / InnerTube
- YouTube Music bridge package name — fixed package name for YouTube Music bridge integration. (Hush)
- InnerTube page parsing — improvements to
NextPage,HomePage,LibraryPage,SearchPage, andSearchSummaryPageparsing for better reliability. (Hush) - YouTube.kt refactoring — stream URL resolution, PoToken handling, and search improvements. (Hush)
- InnerTube.kt — connection and request improvements. (Hush)
Downloads
- DownloadUtil improvements — better stream URL resolution for downloads, improved error handling, and progress tracking. (Hush)
Sync
- SyncUtils — improved sync reliability with better error handling and retry logic. (Hush)
Settings
- SpotiFLAC toggle moved to Dev Settings — master SpotiFLAC ON/OFF switch now lives in Developer Options. (Hush)
- Audio Sources page reorganized — SpotiFLAC settings section shows experimental warning; YouTube toggle greyed out when SpotiFLAC is off. (Hush)
- Storage settings — background URL refresh interval configuration added. (Hush)
- Debug settings — SpotiFLAC toggle added alongside existing developer options. (Hush)
- Internet settings — minor improvements. (Hush)
Removed
- JioSaavn module removed — entire
jiosaavn/module deleted (SaavnService,SaavnUrlDecryptor,DeviceRouter). JioSaavn is no longer a bundled audio source. (Hush) - SaavnPlaybackResolver deleted — removed JioSaavn playback resolution code. (Hush)
- JioSaavnSettings deleted — removed JioSaavn settings screen and
SaavnBetaWarningDialog. (Hush) - SaavnAudioQuality constants — removed deprecated JioSaavn audio quality constants. (Hush)
- Debug secret dump — removed leftover
hush_debug.txtfile that was dumping the SpotiFLAC session secret to plaintext. (Hush)
Tests
- GrowingListQueueTest — unit tests for the new GrowingListQueue implementation. (Hush)
- AudioSourceQualityRankingTest — tests for audio source quality ranking logic. (Hush)
- ExtensionRuntimeTest — tests for the extension runtime framework. (Hush)
- SpotiFLACClientTest — tests for SpotiFLAC client relay error handling. (Hush)
- SpotiFLACSessionManagerTest — tests for session bootstrap and exchange error paths. (Hush)
- WazeCommandMapperTest — 14 tests for Messenger message → command translation. (Hush)
- WazeCommandHandlingTest — 19 tests for MusicService Waze command protocol. (Hush)
- WazeBroadcastFallbackTest — 13 tests for broadcast fallback contract. (Hush)
Build / CI
- Waze shim build fixes —
waze-shim/build.gradle.ktsupdated with proper signing configuration and build compatibility. (Hush) - ProGuard rules — updated R8/ProGuard rules for new SpotiFLAC and extension classes. (Hush)
- resign-release-apk.sh — new script for resigning release APKs with the project keystore. (Hush)
- Gradle libs.versions.toml — dependency version updates. (Hush)
Housekeeping
- Version bumped to 13.13.5 (versionCode 166, app) / 167 (waze-shim). (Hush)
- Removed dead code:
SaavnAudioQuality,SaavnPlaybackResolver,JioSaavnSettings,SaavnBetaWarningDialog. (Hush) - Removed
networkMaindispatcher import from InternetSettings. (Hush)
Upstream credits
Hush is built on ArchiveTune and combines features, fixes, and UI from several open-source YouTube Music clients—including Metrolist, Vivi Music, and Echo Music. Those projects are credited below; their licenses and copyright notices are preserved in source.
| Project | Repository |
|---|---|
| ArchiveTune | ArchiveTuneApp/ArchiveTune |
| Metrolist | metrolistgroup/metrolist |
| Vivi Music | vivizzz007/vivi-music |
| Echo Music | EchoMusicApp/Echo-Music |
Thank you to the maintainers and contributors of every project listed above.
Feature attribution
| Source | Examples integrated into Hush |
|---|---|
| ArchiveTune | Core playback, YT sync, lyrics, Cast, Together, local files |
| Metrolist | Music alarms, loudness levels, playlist export, Android Auto settings |
| Vivi Music | Playlist prefetch, auto-backup before update |
| Echo Music | Settings search, IPv4/IPv6 network mode |
| ViMusic / OuterTune / BetterLyrics | InnerTube base, UI patterns, synced lyrics |