- Added ?bitrate=xyz param to /audio/id/ or /audio/external_id/ requests
- By default audio is transcoded incrementally, on-demand using an
estimated content-length. On a range request, the stream is transcoded
entirely. Transcoded audio is cached upon completion to make
subsequent requests faster and ease server load.
- Updated the Android client to support transcoding options. Transcoding
is disabled by default.
- Added a scary warning to the "disable ssl cert validation" option.
Android app. Summary of required changes:
1. Removed TransportModel and related classes, created PlaybackService
interface. Old TransportModel code now lives in RemotePlaybackService.
2. Added StreamingPlaybackService implementation of PlaybackService.
Uses MediaPlayer or ExoPlayer to stream audio via HTTP.
3. Added SystemService that is used by StreamingPlaybackService. It's a
real Android service that manages notifications, wake locks, media
buttons, and other system integrations.
4. Added RxJava and RxAndroid. Use them in StreamingPlaybackService to
keep logic as sane as possible.
5. Added playback mode selection to settings (streaming vs remote). Also
added a field for streaming audio port.
6. Added "ids_only" request type to WebSocketServer when requesting list of
tracks.
an HTTP/HTTPS connection.
- Added libcurl and libressl as project dependencies.
- Added HttpDataStream (which uses libcurl and libressl). Includes an
LruDiskCache so responses can be cached to disk for offline playback.
- Added new IEnvironment SDK interface. Plugins can query the
environment for path information, data streams, or decoders. More
functionality will be added over time.
- Fixed FlacDataDecoderFactory to handle the correct mime type
(audio/flac, not audio/flag)
- Tweaked NomadDecoder.cpp to return the stream length immediately instead
of waiting for an fseek().
1. Drop indexes before sync, then re-create after. This speeds up the
indexing process.
2. 'external_id' field now required for all tracks.
3. Added IIndexerSource::HasStableIds(). We use this as a hint to not
remove orphaned tracks from existing playlists when re-scanning.
4. Removed 'track_id' from 'playlist_tracks' table, and added
'track_external_id' and 'source_id' instead.
5. Indexer will only scan for plugins once now, during initialization.
useful for things like dynamic playlists.
- Updated CategoryListQuery to initialize mappings statically, instead
of during construction, locking a mutex.