Added Google Cast SDK (play-services-cast-framework:21.5.0) dependency
Created CastOptionsProvider — required Cast SDK entry point using the Default Media Receiver (CC1AD845); no custom Cast receiver app needed
Created ChromecastManager — discovers Chromecast devices via MediaRouter/Cast SDK, reuses the existing MediaHttpServer to serve local files or proxy JRiver streams, controls playback via RemoteMediaClient
Extended DlnaDevice with a CHROMECAST device type and castRouteId field
Added CastProtocol enum (DLNA/CHROMECAST) and castProtocol field to CastSession so any code path knows which protocol is active
Updated CastViewModel to hold both managers, merge their device lists and session state into unified flows, and route all cast operations by device type
Updated device picker (DlnaDeviceSelector) to show a "Google Cast" section above "DLNA Devices", with the Cast icon for Chromecast items and updated empty-state text
Updated MediaPlaybackService so DLNA-specific cooldown/watchdog only runs when castProtocol == DLNA; added a Chromecast renderer path for queue advances
Playback State Persistence & Crash Recovery
Play queue, current track index, and playback position (updated every 10 seconds) are persisted per library to SharedPreferences (jriver_queue_* / local_queue_* prefixed keys)
last_active_library_mode key tracks which library was most recently playing for crash recovery
On app restart: resumes the last active library if it has a saved queue, otherwise falls back to the user's startup library preference
Startup Library Default
Tapping the checkmark next to a JRiver server or Local Folder in the Server/Library screen now persists that choice as the default startup library
Startup logic prioritizes crash recovery (last active library with saved queue) → user startup preference → system default
Now Playing Button Visibility
The musical note (Now Playing) button in the top app bar is now always visible when the play queue contains any tracks, even if nothing is actively playing
Downloading Playlists/Albums:
Download UI Overhaul (No Flicker)
Replaced the dismissable Dialog with a persistent full-screen Box overlay using graphicsLayer { alpha } — the overlay stays up for the entire download session; user must tap Close
Fixed per-file progress bar not updating: added "File Size" to JRiver API fields request so BrowseItem.filesize is populated
Fixed "Preparing..." delay (3–5 seconds): HttpLoggingInterceptor level changed from BODY (which buffered entire files) to HEADERS
Fixed download cancellation: _isCancelled flag and progress map now reset at the start of each downloadFiles() call so re-downloading after a cancel works
Removed redundant snackbar notification — the persistent overlay conveys completion status
Removed the explicit notification permission prompt for downloads (still present for media playback notifications)
Performing Near You section:
Performing Near You Past shows are now filtered out quicker — only events on or after today are shown on both dashboards
Deduplicated events that appear multiple times due to artist name variations: uses word-set subset matching (stripping stop words) combined with normalized venue + date + city
Venue normalization strips leading "The" before removing non-alphanumeric characters (fixes "Commonwealth Room" vs "The Commonwealth Room" duplicates)
Recent Imports Album Navigation
Fixed: clicking an album in "Recent Imports" on the JRiver dashboard was showing tracks from all albums with the same name (bug) — now routes through a Files/Search API call filtered by both album and artist name
Shifted Internet Radio station configs to cloud and updated.
Allows Internet Radio preset stations to be reconfigured on the fly if needed.
Playlists auto-recreate (for Local) after downloading a playlist from JRiver to Local.
Downloading JRiver playlists not only downloads the tracks, but recreates the playlists in the local library.
Tour Dates & Convex DB
Confidence-Based (Dynamic) TTLs: artists with many past tours get a shorter TTL (refreshed more often); artists that rarely or never tour get an exponentially longer TTL, reducing unnecessary calls
Fixed invalid Convex field name error for non-ASCII characters (e.g., ł) by adding a .replace(/[^\\x00-\\x7F]/g, "") step in normalizeToASCII
Tour dates in Now Playing now use a "show stale while refreshing" pattern — cached data is shown immediately, Refresh runs are in the background
Convex venue coordinate lookup is checked before calling the geocoding API, reducing redundant geocoding requests
Admin scripts are compatible with the new dynamic TTL logic (internal)
Geocoding Provider
Switched providers (for venue-city mapping)
Old provider code retained as a commented fallback
Existing inter-call delay preserved
Local Library Podcasts Section
Podcast section now always renders with at least the "Search" tile, even when no subscriptions or cached data exist
Removed extra bottom padding from the Local Library dashboard Podcast section to match the JRiver dashboard layout
JRiver Library Config extras:
Added a custom port number field when "IP Address" is selected during server setup
Defaults to 52199 (HTTP) or 52200 (HTTPS), updating automatically when the SSL toggle changes — but does not override a port the user has manually entered
Local Full Rescan Confirmation Dialog addition:
Added a confirmation dialog before a Full Rescan warning that local playlists will be deleted if the user proceeds
Other changes
Added option to stream from original source format or transcode.
Added option to transcode or keep original format when downloading.
Other bugs
Local File Playback Fix (EACCES Permission Denied for Downloaded Tracks)
Fixed a bug where hasRestoredQueue was set prematurely in setServer(), preventing queue restoration from running
Fixed Current Play Position bug for app crash restart that was setting saved start position for the first track that was played after startup which should only do that if user is continuing what was currently playing before crash/shutdown.
Fixed "dead spot" UI issue where the invisible overlay was intercepting touches: overlay now collapses to 0.dp when hidden
JRiver was defaulting to transcoding to mp3 (whoops) from a previous buffer test. When transcoding to mp3 for downloads, JRiver does not embed tags into the file, fixed this using JAudioTagger using JRiver metadata
.
This topic was modified 4 weeks ago 3 times by Stevo