What is the change
Implement persistent player queue state with a dedicated Zustand store (MMKV-backed): queue, currentTrack, currentIndex, shuffled, unShuffledQueue, and queueRef.
Restore the queue on app start: new initialization reads persisted state and rebuilds the TrackPlayer queue and active index.
Unify queue mutations to keep React Native Track Player and the persisted store in sync:
Loading a new queue sets queueRef, honors shuffle, computes start index, and writes to both RNTP and store.
"Play Next" and "Add to Queue" update RNTP, the live queue, and unShuffledQueue consistently.
Active track/index changes now propagate to the store and query cache.
Tighten/refine player query/invalidations so UI reflects the latest RNTP state.
Minor housekeeping in config/scripts to support the above (ESLint flat config, metro/jest/script updates).
What does this address
Fixes queue not restoring after relaunch or crash; playback position and the current track persist correctly.
Preserves shuffle state and the original unshuffled ordering for reliable shuffle toggle behavior.
Ensures "Play Next"/"Add to Queue" behave consistently with what the user sees, avoiding duplication or desyncs.
Reduces UI state drift by syncing RNTP events to both React Query and persistent store.
Co-authored-by: Violet Caulfield <42452695+anultravioletaurora@users.noreply.github.com>
- Implemented `addManyToPlaylist` function to handle multiple track additions.
- Updated `AddToPlaylist` component to accept multiple tracks and source.
- Modified `AddToPlaylistRow` to support track and album selections.
- Adjusted type definitions to accommodate new parameters for tracks and source.
Adds internal over-the-air update support
Powered by `react-native-nitro-modules`, this OTA functionality is faster than the previous implementation, and won't slow down the UI when updates are being applied since updates occur off the main thread
* fixes to query gctime
ios project updates
dependency updates
fix issue where long pressing on an item row wouldn't show the correct item
* 1 -> 2 column patreon member list
* Add adaptive launcher icons with custom background color
* update all icon using Android Studio Image Assets Configurator
* Add monochrome drawable to adaptive launcher icons
* make player buttons and scrubber bar snappier by removing unnecessary state subscriptions caused by the useMutation hook
* fix similar artists from being cutoff on the artist page
detect when we are running in the background to pause UI updates, dramatically reducing CPU load and therefore conserving battery life
update dependency packages, Pods
* work on making shuffle more consistent
* removing toasts, add "play later" to an item's context menu
fix shuffling issues when shuffling from the first track in the queue
Migrate from `react-native-fast-image` to `react-native-nitro-image`
Images will now display a blurry placeholder while loading, and then animate into the full image when loaded
Introduces a redesign to the artist page that is easier to navigate, especially when there are many albums belonging to a given artist
---------
Co-authored-by: riteshshukla04 <riteshshukla2381@gmail.com>
* update Tanstack
fix issue where tracks didn't restore properly, meaning that playback on a cold start wasn't possible
styling changes to bottom tab bar icons, settings tab pages
network context optimization
* miniplayer optimizations, adding performance monitor in more places
* mini player styling
* tab navigation styling
item context query optimization
* Fix issue where add to playlist could be cut off when there are a lot of playlists
resize card on discover and home screens
removes hooks from player provider in lieu of nonreactive functions and data fetching. In testing this fixed the issue where the player provider was rerendering when the queue or the currently active track changed
Use a UUID to distinguish between DeviceProfiles, not the name. This means that media info from Jellyfin will be properly refetched if the user selects a different audio quality
mini player rendering optimization fixes, since we don't need that rerendering 4 times a second when updates are only distinguishable every whole second. Also brings some style fixes that reduces vertical height usage
update sentry sdk while we're in there doing debugging
Add lyrics support in the player!
Adds a new button to the bottom of the player that will appear if lyrics are available for a song
Hitting the button will move the user to a new screen in the player stack that will show an animated view of the song's lyrics