windows users: do not unzip the new build over an existing install -- please use a new directory. data is not stored in the installation directory, so your libraries will remain intact.
android users: you also need to upgrade your musikcube installation to 0.31.0, otherwise new features will not work (and some old features may not function properly).
api users: documentation has been updated here.
0.31.0 is a big release, focusing on the following:
- first-class playlist editing support in the server layer, and and on the Android client
- the introduction of audio encoders into main app and SDK
- gapless playback on Android (experimental)
- a massive overhaul of the Android code
- a cleaned up C++ SDK
a more detailed list of changes as follows...
musikcube:
- added support for Ubuntu Artsy
- added preliminary support for audio encoder plugins.
- added
stockencoders
plugin with support for encoding MP3 (lame) and OGG/Vorbis audio. - fixed and exposed album-level artwork. previously it was track-only.
musikdroid:
- gapless playback (for supported media)! enable in settings > playback engine > "ExoPlayer Gapless (experimental)"
- playlist create / rename / update / delete support
- album art is now displayed in album rows when browsing content (e.g. albums by this artist, artists in this genre, etc)
- fixed a really bad bug that could cause locally cached media to become corrupted in a very specific scenario (unreliable connectivity while the server is performing on-demand transcoding)
- added a simple "spotlight" tutorial for new users that explains switching between remote and streaming playback modes.
- major refactor to the entire code base, including the following:
- a brand new data layer interface based on RxJava. this should position the app for lots of new, fun stuff in the future.
- a new dependency injection implementation
- a view component layer for sharing functionality across screens
- updated Glide from v3 -> v4
- updated to Android Studio 3.0.1 and related tooling
- fixed notification icon color
sdk:
- removed all
Destroy()
methods, standardized onRelease()
across the board - added the following to
ISimpleDataProvider
:QueryCategoryWithPredicate()
SavePlaylistWithIds()
SavePlaylistWithExternalIds()
SavePlaylistWithTrackList()
AppendToPlaylistWithIds()
AppendToPlaylistWithExternalIds()
AppendToPlaylistWithTrackList()
RemoveTracksFromPlaylist()
RenamePlaylist()
DeletePlaylist()
- added new interfaces:
IValue
IEncoder
IEncoderFactory
- removed interfaces:
IRetainedTrack
IRetainedTrackWriter
- renamed interfaces
IMetadataMap
->IMap
IMetadataMapList
->IMapList
IMetadataReader
->ITagReader
ITrackWriter
->ITagStore
IMetadataValue
->IValue
IMetadataValueList
->IValueList
server:
- renamed project from
websocket_remote
toserver
, and promoted to a top-level component in the workspace - added correct LAME headers after transcoding to fix gapless playback of encoded files.
- added the following messages to the websocket server:
save_playlist
rename_playlist
delete_playlist
append_to_playlist
remove_tracks_from_playlist
query_tracks_by_external_ids
- renamed the following track fields:
visual_genre_id
->genre_id
visual_artist_id
->artist_id
- added the ability to query album art by id
- fixed
HttpServer
to ignore non-GET
verbs - added "predicated category queries", e.g. "all the albums for this artist" or "all the artists in this genre", etc.
- added
artist
andartistId
to album response (previously it was only returnalbumArtist
andalbumArtistId
) - fixed bugs related to HTTP "Range" header parsing and generation
- fixed a bug in the websocket functionality that was returning invalid
invalid_request
responses... yeah.