What's New
Added
-
Recent Access History: Quick access to recently visited content when tapping the search bar
- Shows recently visited artists, albums, playlists, and downloaded tracks
- Merged view combining navigation history and download history
- Tap to quickly navigate back to previously accessed content
- X button to remove individual items from history
- "Clear All" button to clear entire history
- Persists across app restarts (stored in SharedPreferences)
- Max 20 items stored, sorted by most recent
- Multi-language support (Artist/Album/Song/Playlist labels localized)
-
Artist Screen Redesign
- Full-width header image (380px) with gradient overlay
- Artist name displayed at bottom of header with text shadow
- Monthly listeners count display (formatted with compact notation)
- "Popular" section showing top 5 tracks with download status indicators
- Dynamic download button states (queued, downloading, completed)
- Header image and top tracks fetched from extension metadata
- Image alignment set to top-center to show faces properly
-
Extension Store Update Badge: Badge indicator on Store tab icon showing number of available updates
- Users can see extension updates are available without opening Store tab
- Badge shows count of extensions with updates
-
Extension Compatibility Warning: Warning badge for extensions requiring newer app version
- Extensions with
minAppVersionhigher than current app show warning label - Label displays "Requires vX.X.X+" to encourage users to upgrade
- Users can still install the extension (not blocked)
- Extensions with
-
Year in Album Folder Name (#50): New album folder structure options with release year
Artist / [Year] Album: Albums/Coldplay/[2005] X&Y/[Year] Album Only: Albums/[2005] X&Y/- Year extracted from release date metadata
- Matches desktop SpotiFLAC folder structure
-
Extension Album/Playlist/Artist Support: Extensions can now return albums, playlists, and artists in search results
- Search results now properly separated into Albums, Playlists, Artists, and Songs sections
- Albums, playlists, and artists show chevron icon (navigate to detail) instead of download button
- Tap album/playlist to view track list and download
- Tap artist to view their albums/discography
- New
getAlbum(),getPlaylist(), andgetArtist()extension functions - New
ExtensionAlbumScreen,ExtensionPlaylistScreen, andExtensionArtistScreenfor fetching content from extensions - YouTube Music extension updated with album/playlist/artist support
-
Odesli (song.link) Integration for YouTube Music Extension
- New
enrichTrack()function to fetch ISRC and external service links - Uses Odesli API to convert YouTube Music tracks to Deezer/Tidal/Qobuz
- Enables built-in service fallback for high-quality audio downloads
- Extension version updated to 1.4.0 with
api.song.linkandodesli.ionetwork permissions
- New
-
Download Cancel: Canceling a download now stops in-flight built-in provider downloads (Tidal/Qobuz/Amazon) and clears backend progress tracking.
Changed
- Search Bar Behavior: Tapping search bar now immediately moves it to top position
- Logo and subtitle hide when search bar is focused
- Recent access history appears in the content area below
- More space for recent items, not blocked by keyboard
Fixed
- Fixed search source chips still referencing removed badge props.
- Fixed extension artist album metadata to preserve provider IDs and cover URLs for correct navigation.
- Fixed extension playlist fetch to populate provider IDs and reject disabled extensions.
- Fixed extension collection screens calling setState after dispose during async loads.
- Fixed URL handler responses to include provider IDs for extension albums and artists.
- Fixed YTMusic extension not extracting album name and duration from search results.
- Album name is now extracted from flexColumns/subtitle when linked to album browseId.
- Duration is now extracted from fixedColumns/flexColumns in addition to existing sources.
- Fixed "Separate Singles" setting not working (#54) - singles were going to Albums folder.
- Root cause:
albumTypewas not being extracted from Deezer API during metadata enrichment. - Deezer track responses now correctly include
album_type(single/ep/album/compilation). - Track creation now preserves
albumTypeandsourcefields throughout download flow.
- Root cause:
- Fixed PageView overscroll at edges (BouncingScrollPhysics → ClampingScrollPhysics)
- Fixed settings item highlight on swipe (highlightColor: Colors.transparent)
- Fixed extension duplicate load error (skip silently instead of throwing error)
- Fixed keyboard appearing when swiping between tabs (unfocus on page change)
- Removed "Free"/"API Key" badges from search source selector
- Fixed cancel action briefly resuming downloads in the queue UI after ~1 second.
- Fixed cancelled downloads being marked as failed when the backend returns after cancellation.
- Fixed cancel triggering provider fallback (cancel now stops the download flow immediately).
- Fixed stale ISRC cache returning deleted files after cancel.
- Fixed search results mixing extension and built-in artists when using default provider.
- Fixed audio files opening with non-music apps by passing audio MIME type on open.
- Fixed album artist showing null/blank by normalizing empty metadata and using artist fallback for tags.
- Fixed
use_build_context_synchronouslylint warnings inhome_tab.dart - Fixed
unnecessary_underscoreslint warnings in error widget callbacks - Fixed duplicate artist entries in recent history (recording now only happens in screen's initState)
- Go Backend: Missing
item_typeandalbum_typefields- Added
ItemTypeandAlbumTypefields toExtTrackMetadatastruct - Fixed
CustomSearchWithExtensionJSON- now includesitem_typeandalbum_typein response - Fixed
HandleURLWithExtensionJSON- now includesitem_typeandalbum_typefor tracks - Fixed
GetAlbumWithExtensionJSON- now includesitem_typeandalbum_typefor album tracks - Fixed
GetPlaylistWithExtensionJSON- now includesitem_typeandalbum_typefor playlist tracks
- Added
- Album/Playlist Track Thumbnails: Tracks inside albums/playlists now use album/playlist cover as fallback when no individual cover exists
- YouTube Music Extension getArtist: Fixed
getArtist()function not being registered in extension, causing artist pages to fail with "returned null" error - Recent Access UI: Fixed recent access list disappearing when keyboard is dismissed - now stays visible until user presses Back button
- Extension Artist Top Tracks: Fixed top tracks not appearing when opening artist from extension search results
- YT Music extension
getArtist()now returnstop_tracksarray with up to 10 popular songs - Go backend
GetArtistWithExtensionJSONnow forwardstop_tracks,header_image, andlistenersto Flutter ExtensionArtistScreennow parses and passes top tracks toArtistScreenArtistScreenwithextensionIdskips Spotify/Deezer fetch, uses extension data only (fixes "Rate Limited" errors)
- YT Music extension
- Search Bar Unfocus: Fixed search bar not unfocusing when tapping outside - now properly dismisses keyboard and unfocus when tapping anywhere outside the search field
- Keyboard Appearing on Settings Navigation: Fixed keyboard randomly appearing when returning from Settings sub-pages (e.g., Appearance) - now uses
FocusManager.instance.primaryFocus?.unfocus()for more aggressive unfocus - Recent Access Artist Navigation: Fixed opening artist from recent access using wrong screen - now correctly uses
ExtensionArtistScreenfor extension artists (YT Music, Spotify Web) instead of trying to fetch from Spotify API
Extensions
- YouTube Music Extension: Updated to v1.5.0
getArtist()now returnstop_tracksarray with popular songs- Added
header_imageandlistenersto artist response
- Spotify Web Extension: Updated to v1.6.0
Localization
- Multi-Language Support: App now supports multiple languages with community contributions via Crowdin
- Available languages: English, Indonesian (Bahasa Indonesia)
- More languages coming soon with community translations
- Contribute translations at Crowdin
- Added new localization strings for recent access types:
recentTypeArtist- "Artist" / "Artis"recentTypeAlbum- "Album" / "Album"recentTypeSong- "Song" / "Lagu"recentTypePlaylist- "Playlist" / "Playlist"recentPlaylistInfo- "Playlist: {name}"errorGeneric- "Error: {message}"
Downloads
Android
- arm64:
SpotiFLAC-v3.1.0-arm64.apk(recommended for modern devices) - arm32:
SpotiFLAC-v3.1.0-arm32.apk(older devices)
iOS
- iOS:
SpotiFLAC-v3.1.0-ios-unsigned.ipa(sideload required)
Installation
Android: Enable "Install from unknown sources" and install the APK
iOS: Use AltStore, Sideloadly, or similar tools to sideload the IPA