The music service module was unloaded and reloaded by MusicServiceFactory on every library access state change, which forced MusicServiceFactory and ImageLoaderProvider to inject the Koin instance itself and the fetcher factories to resolve the SubsonicAPIClient lazily from a volatile module. - MusicServiceFactory now owns the swappable delegates directly: it builds OfflineMusicService or CachedMusicService(RESTMusicService(client)) for the current access state, exposes apiClient() alongside getMusicService(), and keeps resetMusicService() as the explicit hook for server property edits - the delegate builders are constructor-injectable, keeping the switch logic testable without the REST stack - ImageLoaderProvider takes a () -> SubsonicAPIClient provider and rebuilds the loader when the client instance changes, replacing the ServerID Koin key - CoverArtFetcher/AvatarFetcher factories resolve the client through the factory instead of the module - musicServiceModule is deleted; the DI graph is static and no module is ever unloaded at runtime
Ultrasonic
Ultrasonic is free and open-source music streaming Android client for OpenSubsonic API (version 1.7.0 or higher) compatible servers.
Help wanted
We currently don't have that much time to spend developing Ultrasonic, so any contributions or active developers are always welcomed. Have a look at CONTRIBUTING to get started.
Download
App is available to download at following stores:
Warning: All three versions (Google Play, F-Droid and the APKs) are not compatible (not signed by the same key)! You must uninstall one to install the other, which will delete all your data.
If you want to use the version downloaded from F-Droid or from GitLab with Android Auto, you must enable Unknown Sources as it is described in this wiki page.
Bugs and issues
First, see if your issue haven’t been yet reported here, otherwise open a new issue.
Documentation
See documentation.
Contributing
See CONTRIBUTING.
Supported (tested) OpenSubsonic API implementations
Other OpenSubsonic API implementations should work as well as long as they follow API documentation.
License
This software is licensed under the terms of the GNU General Public License version 3 (GPLv3).
Full text of the license is available in the LICENSE file and online.


