Skip to content

13.13.5

Choose a tag to compare

@github-actions github-actions released this 24 Aug 08:46

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 — SpotiFLACSessionManager handles bootstrap, session persistence, HMAC rolling-key authentication, and automatic session recovery on 401/403 errors. (Hush)
  • Playback resolver — SpotiFLACPlaybackResolver resolves 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 toggleLike with 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 after ExoPlayer.Builder().build(). (Hush)
  • Stream recovery tracker — improved PlaybackStreamRecoveryTracker with 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 OnlinePlaylistScreen now build the queue from loaded playlist songs (same pattern as Top 100, Auto, Local, Cache screens) instead of YouTubeQueue.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_item command instead of generic play. (Hush)
  • CoroutineScope leak fix — replaced ad-hoc CoroutineScope(Dispatchers.Main) launches with a managed serviceScope that is cancelled on service cleanup. (Hush)
  • Debounce map cleanup — lastCommandTimeByType map 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, and SearchSummaryPage parsing 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.txt file 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.kts updated 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 networkMain dispatcher 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